CN110109940A - 将函数式的图遍历语言转换成扩展的结构化查询语言 - Google Patents
将函数式的图遍历语言转换成扩展的结构化查询语言 Download PDFInfo
- Publication number
- CN110109940A CN110109940A CN201810101533.7A CN201810101533A CN110109940A CN 110109940 A CN110109940 A CN 110109940A CN 201810101533 A CN201810101533 A CN 201810101533A CN 110109940 A CN110109940 A CN 110109940A
- Authority
- CN
- China
- Prior art keywords
- inquiry
- language
- traversal
- converted
- sql
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Granted
Links
- 230000014509 gene expression Effects 0.000 title claims abstract description 75
- 238000006243 chemical reaction Methods 0.000 title abstract description 34
- 230000006870 function Effects 0.000 claims abstract description 57
- 230000000694 effects Effects 0.000 claims abstract description 34
- 102100038367 Gremlin-1 Human genes 0.000 claims description 100
- 101001032872 Homo sapiens Gremlin-1 Proteins 0.000 claims description 100
- 238000000034 method Methods 0.000 claims description 33
- 238000012545 processing Methods 0.000 claims description 16
- 230000004044 response Effects 0.000 claims description 16
- 238000004590 computer program Methods 0.000 claims description 5
- 238000010276 construction Methods 0.000 abstract description 5
- 230000000717 retained effect Effects 0.000 abstract description 5
- 230000009466 transformation Effects 0.000 abstract description 3
- 238000012546 transfer Methods 0.000 description 18
- 238000010586 diagram Methods 0.000 description 16
- 238000005457 optimization Methods 0.000 description 9
- 238000004891 communication Methods 0.000 description 7
- 230000008569 process Effects 0.000 description 6
- 238000004422 calculation algorithm Methods 0.000 description 5
- 230000008859 change Effects 0.000 description 5
- 150000001875 compounds Chemical class 0.000 description 3
- 238000001914 filtration Methods 0.000 description 3
- 230000004048 modification Effects 0.000 description 3
- 238000012986 modification Methods 0.000 description 3
- 230000003287 optical effect Effects 0.000 description 3
- 238000009739 binding Methods 0.000 description 2
- 101150039322 outE gene Proteins 0.000 description 2
- 238000006116 polymerization reaction Methods 0.000 description 2
- 230000007704 transition Effects 0.000 description 2
- 241000208340 Araliaceae Species 0.000 description 1
- 241001269238 Data Species 0.000 description 1
- 235000005035 Panax pseudoginseng ssp. pseudoginseng Nutrition 0.000 description 1
- 235000003140 Panax quinquefolius Nutrition 0.000 description 1
- 230000009471 action Effects 0.000 description 1
- 238000013459 approach Methods 0.000 description 1
- 230000008901 benefit Effects 0.000 description 1
- 238000004364 calculation method Methods 0.000 description 1
- 239000003795 chemical substances by application Substances 0.000 description 1
- 230000007547 defect Effects 0.000 description 1
- 238000013461 design Methods 0.000 description 1
- 235000008434 ginseng Nutrition 0.000 description 1
- 230000006872 improvement Effects 0.000 description 1
- 238000003780 insertion Methods 0.000 description 1
- 230000037431 insertion Effects 0.000 description 1
- 238000007689 inspection Methods 0.000 description 1
- 230000009191 jumping Effects 0.000 description 1
- 230000002045 lasting effect Effects 0.000 description 1
- 230000007246 mechanism Effects 0.000 description 1
- 239000013307 optical fiber Substances 0.000 description 1
- 230000002093 peripheral effect Effects 0.000 description 1
- 230000008707 rearrangement Effects 0.000 description 1
- 230000008521 reorganization Effects 0.000 description 1
- 239000004065 semiconductor Substances 0.000 description 1
- 230000003068 static effect Effects 0.000 description 1
- 230000001052 transient effect Effects 0.000 description 1
- 238000011144 upstream manufacturing Methods 0.000 description 1
- 239000011800 void material Substances 0.000 description 1
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F16/00—Information retrieval; Database structures therefor; File system structures therefor
- G06F16/20—Information retrieval; Database structures therefor; File system structures therefor of structured data, e.g. relational data
- G06F16/24—Querying
- G06F16/245—Query processing
- G06F16/2452—Query translation
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F16/00—Information retrieval; Database structures therefor; File system structures therefor
- G06F16/20—Information retrieval; Database structures therefor; File system structures therefor of structured data, e.g. relational data
- G06F16/24—Querying
- G06F16/242—Query formulation
- G06F16/2433—Query languages
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F16/00—Information retrieval; Database structures therefor; File system structures therefor
- G06F16/20—Information retrieval; Database structures therefor; File system structures therefor of structured data, e.g. relational data
- G06F16/24—Querying
- G06F16/245—Query processing
- G06F16/2453—Query optimisation
- G06F16/24534—Query rewriting; Transformation
- G06F16/24547—Optimisations to support specific applications; Extensibility of optimisers
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F16/00—Information retrieval; Database structures therefor; File system structures therefor
- G06F16/90—Details of database functions independent of the retrieved data types
- G06F16/901—Indexing; Data structures therefor; Storage structures
- G06F16/9024—Graphs; Linked lists
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Databases & Information Systems (AREA)
- Physics & Mathematics (AREA)
- Data Mining & Analysis (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Computational Linguistics (AREA)
- Software Systems (AREA)
- Mathematical Physics (AREA)
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
Abstract
在本文所描述的主题的实施例中,提出了一种将函数式的图遍历语言转换成扩展的结构化查询语言的方案。在获得以函数式的图遍历语言编写的第一查询之后,根据转换规则将第一查询转换成以扩展的结构化查询语言形式的第二查询。本文所描述的主题的实施例通过对标准的结构化查询语言的扩展,在第二查询中能够保留图数据库中的顶点之间的有向边,并且还可以保留第一查询所包括的流程控制、迭代、临时变量定义、高级数据结构(如数组、字典、树结构)、副作用以及步骤之间的依赖关系。因此,根据本文所描述的主题的实施例,通过对函数式的图遍历语言的转换,能够标识函数式的图遍历语言中具有相同语义的查询,从而能够优化函数式的图遍历语言中的查询。
Description
背景技术
函数式的图遍历语言是一种用于遍历图数据库的函数式语言,其包括一个或多个函数或步骤,每个函数或步骤可以输入对象流并且输出新的对象流。图数据库是一种面向图或基于图的数据库,其以图的数据结构来存储数据并且查询数据,图数据库的基本存储单元包括顶点、边以及属性等。图遍历的过程是从图中的一个顶点出发,根据顶点或边的属性来访问其他节点,以此完成针对图数据库的查询。
结构化查询语言(SQL)是一种用于管理关系数据库中的数据而设计的声明性语言,其可以使用SQL查询语句从数据库检索、插入、更新和删除数据。SQL中最常用的查询是选择(SELECT)语句,其通常由SELECT-FROM-WHERE组成,其也可以包括一些外围子句,诸如GROUP-BY、ORDER-BY、HAVING等。SQL作为一种声明性语言,通常只需要指定要做的任务,而不需要指定任务的实现细节。因此,SQL语句通常没有复杂的语句结构和语法要求。
发明内容
在本文所描述的主题的实施例中,提出了一种将函数式的图遍历语言转换成扩展的结构化查询语言的方案。在获得以函数式的图遍历语言编写的第一查询之后,根据转换规则将第一查询转换成以扩展的结构化查询语言形式的第二查询以用于优化第一查询。本文所描述的主题的实施例通过对标准的结构化查询语言的扩展,在第二查询中能够保留图数据库中的顶点之间的有向边,并且还可以保留第一查询所包括的流程控制、迭代、临时变量定义、高级数据结构(数组、字典、树结构)、副作用以及步骤之间的依赖关系。因此,根据本文所描述的主题的实施例,通过对函数式的图遍历语言的转换,能够标识函数式的图遍历语言中具有相同语义的查询,从而能够优化函数式的图遍历语言中的查询。
提供发明内容部分是为了简化的形式来介绍对概念的选择,它们在下文的具体实施方式中将被进一步描述。发明内容部分无意标识本文所描述的主题的关键特征或主要特征,也无意限制本文所描述的主题的范围。
附图说明
结合附图并参考以下详细说明,本公开各实施例的上述和其他特征、优点及方面将变得更加明显。在附图中,相同或相似的附图标记表示相同或相似的元素,其中:
图1示出了其中可以实施本文所描述的主题的一个或多个实施例的计算设备/服务器的框图;
图2示出了根据本文所描述的主题的实施例的用于将函数式的图遍历语言转换成扩展的结构化查询语言的方法的流程图;
图3示出了根据本文所描述的主题的实施例的示例性图数据库的一部分的示图;
图4示出了根据本文所描述的主题的实施例的用于优化函数式的图遍历语言中的查询的示意图;
图5示出了根据本文所描述的主题的实施例的用于优化函数式的图遍历语言中的查询的方法的流程图;
图6示出了根据本文所描述的主题的实施例的用于转换函数式的图遍历语言中的依赖关系的示意图;
图7示出了根据本文所描述的主题的实施例的用于转换函数式的图遍历语言中的coalesce()步骤的示意图;
图8示出了根据本文所描述的主题的实施例的用于转换函数式的图遍历语言中的optional()步骤的示意图;以及
图9示出了根据本文所描述的主题的实施例的用于使用有限状态机来将函数式的图遍历语言转换成扩展的结构化查询语言的过程的示意图。
具体实施方式
下面将参照附图更详细地描述本公开的实施例。虽然附图中显示了本公开的某些实施例,然而,应当理解的是,本公开可以通过各种形式来实现,而且不应该被解释为限于这里阐述的实施例,相反提供这些实施例是为了更加透彻和完整地理解本公开。应当理解的是,本公开的附图及实施例仅用于示例性作用,并非用于限制本公开的保护范围。
本文使用的术语“包括”及其变形是开放性包括,即“包括但不限于”。术语“基于”是“至少部分地基于”。术语“一个实施例”表示“至少一个实施例”;术语“另一实施例”表示“至少一个另外的实施例”;术语“一些实施例”表示“至少一些实施例”。其他术语的相关定义将在下文描述中给出。
传统地,函数式的图遍历语言中的查询通常由一个或多个多步骤组成,查询的语义通过依次执行步骤的顺序而进行限定,然而,有序地执行步骤限制了查询优化的空间,因而函数式的图遍历语言中通常无法标识出具有语义相同的查询。为了标识函数式的图遍历语言中语义相同的查询,一种改进是将函数式的图遍历语言转换成另一种标准的声明性语言,例如标准的SQL。然而,在标准的SQL中,无法反映出图数据库中的节点之间的有向边,此外,标准的SQL也不能支持函数式的图遍历语言中的某些步骤(例如副作用步骤)的转换。因此,上述改进在语言转换过程中会遗漏掉一些查询步骤的转换,容易造成错误,因而不能真正地标识语义相同的查询。
为此,本文所描述的主题的实施例提出了一种将函数式的图遍历语言转换成扩展的结构化查询语言的方案。本文所描述的主题的实施例在获得以函数式的图遍历语言编写的第一查询之后,根据转换规则将第一查询转换成以扩展的结构化查询语言形式的第二查询以用于优化第一查询。因此,根据本文所描述的主题的实施例,通过对函数式的图遍历语言的转换,能够标识函数式的图遍历语言中具有相同语义的查询,从而能够优化函数式的图遍历语言中的查询。
此外,根据本文所描述的主题的实施例,在标识出函数式的图遍历语言中相同语义的查询之后,可以选择执行效率最高的一个查询进行执行,由此进一步提高了查询效率。另外,根据本文所描述的主题的实施例支持用户自定义的表值函数,能够保留函数式的图遍历语言中的流程控制、迭代、临时变量定义、高级数据结构(数组、字典、树结构)、副作用以及步骤之间的依赖关系等,从而实现对函数式的图遍历语言的全逼真的语义转换。以下参考图1至图9来说明本公开的基本原理和若干示例实现方式。
图1示出了其中可以实施本公开的一个或多个实施例的计算设备/服务器100的框图。应当理解,图1所示出的计算设备/服务器100仅仅是示例性的,而不应当构成对本文所描述的实施例的功能和范围的任何限制。
如图1所示,计算设备/服务器100是通用计算设备的形式。计算设备/服务器100的组件可以包括但不限于一个或多个处理器或处理单元110、存储器120、存储设备130、一个或多个通信单元140、一个或多个输入设备150以及一个或多个输出设备160。处理单元110可以是实际或虚拟处理器并且能够根据存储器120中存储的指令来执行各种处理。在多处理器系统中,多个处理单元并行执行计算机可执行指令,以提高计算设备/服务器100的并行处理能力。
计算设备/服务器100通常包括多个计算机存储介质。这样的介质可以是计算设备/服务器100可访问的任何可以获得的介质,包括但不限于易失性和非易失性介质、可拆卸和不可拆卸介质。存储器120可以是易失性存储器(例如寄存器、高速缓存、随机访问存储器(RAM))、非易失性存储器(例如,只读存储器(ROM)、电可擦除可编程只读存储器(EEPROM)、闪存)或它们的某种组合。存储设备130可以是可拆卸或不可拆卸的介质,并且可以包括机器可读介质,诸如闪存驱动、磁盘或者任何其他介质,其可以能够用于存储信息和/或数据并且可以在计算设备/服务器100内被访问。
计算设备/服务器100可以进一步包括另外的可拆卸/不可拆卸、易失性/非易失性存储介质。尽管未在图1中示出,可以提供用于从可拆卸、非易失性磁盘(例如“软盘”)进行读取或写入的磁盘驱动和用于从可拆卸、非易失性光盘进行读取或写入的光盘驱动。在这些情况中,每个驱动可以由一个或多个数据介质接口被连接至总线(未示出)。存储器120可以包括转换部件125,其具有一个或多个程序模块集合,这些程序模块被配置为执行本文所描述的各种实施例的语言转换方法或功能。
通信单元140实现通过通信介质与其他计算设备进行通信。附加地,计算设备/服务器100的组件的功能可以以单个计算集群或多个计算机器来实现,这些计算机器能够通过通信连接进行通信。因此,计算设备/服务器100可以使用与一个或多个其他服务器、网络个人计算机(PC)或者另一个网络节点的逻辑连接来在联网环境中进行操作。
输入设备150可以是一个或多个输入设备,例如鼠标、键盘、追踪球等。输出设备160可以是一个或多个输出设备,例如显示器、扬声器、打印机等。计算设备/服务器100还可以根据需要通过通信单元140与一个或多个外部设备(未示出)进行通信,外部设备诸如存储设备、显示设备等,与一个或多个使得用户与计算设备/服务器100交互的设备进行通信,或者与使得计算设备/服务器100与一个或多个其他计算设备通信的任何设备(例如,网卡、调制解调器等)进行通信。这样的通信可以经由输入/输出(I/O)接口(未示出)来执行。
如图1所示,计算设备/服务器100能够通过输入设备150接收包括以函数式的图遍历语言(也称为“源语言”)编写的第一查询180的输入,并且使用转换部件125对输入进行处理。在处理完成之后,可以通过输出设备160生成包括以扩展的SQL(也称为“目标语言”)形式的第二查询190的输出。
本领域技术人员应当理解,虽然图1中示出了通过输入设备150接收输入,并且通过输出设备160提供输出,但是也可以通过通信单元140获得输入并且提供输出,本文所描述的主题的实施例的范围不受如何获得源语言查询以及如何提供目标语言查询的方式的限制。以下参考图2-9详细描述了转换部件125如何将函数式的图遍历语言转换成扩展的SQL的示例实施例。
图2示出了根据本文所描述的主题的实施例的用于将函数式的图遍历语言转换成扩展的结构化查询语言的方法200的流程图。应当理解,方法200可以由参考图1所描述的计算设备/服务器100执行。
在202,获得以函数式的图遍历语言的第一查询(也称为“源语言查询”),其中第一查询涉及描述图中的顶点之间的邻近关系的有向边。图数据库的基本存储单元包括顶点、边以及属性等,顶点和边可以分别具有其属性。图的遍历过程中通常从一个顶点通过有向边遍历到另一个顶点。例如,参考图1所描述的示例第一查询180,其中g.v()表示图中的一个顶点,has(‘location’,‘CA’)表示第一个顶点具有“location(位置)”为“CA”的属性,out()表示从图中的第一个顶点到第二个顶点的有向边,hasLabel(‘Senator’)表示第二个顶点具有“Senator(参议员)”的标签。由此可见,输入中的第一查询180不仅涉及两个顶点本身的属性,也涉及两个顶点之间的有向边。
在204,将第一查询转换成以扩展的结构化查询语言(SQL)的第二查询(也称为“目标语言查询”),从而可以用于优化第一查询,其中第二查询包括描述有向边的子句,例如匹配(MATCH)子句。例如,转换部件125通过转换规则将输入中的源语言查询180转换成输出中的目标语言查询190,如图1所示,在目标语言查询中,包括描述顶点之间的有向边的子句“MATCH N1-[Edge As E]->N2”,其表示在源语言查询中涉及从顶点N1到N2的有向边。
应当理解,SQL作为一种用于关系数据库的声明性语言,其FROM子句通常定义k个引用表,WHERE子句指定了一个布尔表达式。SELECT语句的结果是来自k个表的元组的笛卡尔乘积,同时满足WHERE子句中的布尔表达式。这个笛卡尔乘积是可交换并且关联的,因此,当使用相同语义的查询执行笛卡尔乘积时,可以重排这k个表。这种重新组织的能力是查询优化的重要来源。换句话说,标准的SQL不指定查询执行的具体步骤,而是由SQL引擎的优化器构建执行的步骤,因而其可以实现针对查询的优化。
函数式的图遍历语言需要制定查询指定的具体步骤,因而无法识别出其中的相同语义的查询。因此,通过对函数式的图遍历语言的转换能够标识出具有相同语义的查询,由此实现对查询的优化。然而,标准的SQL并不能覆盖函数式的图遍历语言中的所有步骤,例如,标准的SQL中不包括对于顶点之间的有向边的对应子句,也不包括对于步骤之间依赖关系的对应子句。有鉴于此,本文所描述的主题的实施例对标准的SQL进行扩展,在第二查询中能够保留图数据库中的顶点之间的有向边,从而实现对函数式的图遍历语言的全逼真的语义转换。因此,本文所描述的主题的实施例通过将源语言查询完整地转换成目标语言查询,从而能够标识出函数式的图遍历语言中的具有相同含义的查询,由此优化第一查询。
本领域技术人员应当理解,函数式的图遍历语言是一种用于遍历图数据库的函数式语言,函数式的图遍历语言的一个常见示例是Gremlin语言。Gremlin作为一种函数式数据流语言,其由一组可组合的步骤组成,可以使得用户使用简洁的方式来表达复杂的属性图的遍历或查询。例如,某些图数据库(诸如分布式图数据库即服务)支持Gremlin作为查询语言,其将Gremlin转换成内部语言(IL),并将内部语言编译为计算运算符,执行运算符并返回结果。Gremlin中的每个步骤都将对象流作为输入,并将新的对象流作为输出。Gremlin查询是一系列步骤,查询的语义是按照严格顺序依次执行这些步骤来定义的,这是因为它们是按顺序组成的。由Gremlin生成的对象具有各种类型,包括顶点、边、标量(诸如整数、字符串)以及复合类型(诸如数组和图)。
在一些实施例中,Gremlin对象可以被实现为Java对象,而Gremlin步骤被实现为Java对象的虚拟函数。在这个实现中,Gremlin查询被直接映射到携带Java对象流的管线。每个Gremlin步骤都是管线中的一个连接点,它从上游获取对象,并为每个传入对象调用相应步骤的虚拟功能,生成零个或更多个对象并将它们推送到下游。管线的最后一个连接点产生的对象就是Gremlin查询的结果。
应当理解,虽然本文所描述的主题的实施例在下文参考Gremlin来描述对函数式的图遍历语言进行转换的示例,然而,其他的函数式的图遍历语言也是可以的,本文所描述的主题的实施例的范围不限于Gremlin。
图3示出了根据本文所描述的主题的实施例的示例性图数据库300的一部分的示图。如图3所示,图数据库300中包括顶点310、320、330以及340,每个节点具有其属性。例如,顶点310具有属性315,包括姓名(name)、位置(location)以及年龄(age)属性,其含义例如可以为一个名叫Bob的人,今年25岁,住在CA(加尼福尼亚州)。顶点320具有属性325,还包括标签(label)属性,其可以表示顶点320的人的身份为“Senator(参议员)”。此外,顶点330具有属性335,顶点340具有属性345。
继续参考图3,图数据库300中还包括顶点之间的有向边,例如,顶点310到顶点340的有向边311表示顶点310的人喜欢(like)顶点340的人,顶点310到顶点320的有向边314表示顶点310的人认识(know)顶点320的人。此外,图数据库300还包括顶点310到顶点330的有向边312、顶点320到顶点330的有向边321、以及顶点330到顶点340的有向边331。应当理解,虽然图3中的每条边仅示出一个属性,例如“喜欢”、“认识”,然而,每条边可以具有多个属性。此外,应当理解,图3中仅示出图数据库300中的一部分,图数据库300还可以包括其他若干节点、边以及属性等。
图4示出了根据本文所描述的主题的实施例的用于优化函数式的图遍历语言中的查询的示意图400。如图4所示,转换部件125用于将以函数式的图遍历语言410(例如,Gremlin)的查询转换成以扩展的结构化查询语言(SQL)420的查询。
如图4所示,在一些实施例中,在从Gremlin查询向扩展的SQL查询的转换过程中,Gremlin查询被转换成扩展的SQL中的SELECT语句。在SELECT语句中,FROM子句定义一个或多个表引用。在关系数据库中,每个表引用指向数据库中的基表,从编程语言的角度来看,可以将其视为一个变量的声明,该变量绑定到表的记录(或行)。在图数据库中,只有一个基表节点,节点中的每一行对应一个顶点。因此,每个FROM子句中对节点的引用都定义了一个绑定到所有顶点的新变量。图数据库中的节点在两个方面不同于传统表格,一方面,其具有数量不定的列,节点的列对应于一个顶点属性,由于Gremlin采用灵活的模式,顶点可能具有任意的属性。另一方面,节点有一个特殊的列*(星号),其为一个完整顶点的JSON表示,该列被保留用于支持需要完整顶点的Gremlin步骤。例如,Gremlin中的values()步骤从输入元素中提取属性值,在将顶点传递给它时,需要发送顶点的完整表示。
在一些实施例中,可以基于第二查询中的选择语句,确定第二查询的输出的列数。尽管节点在概念上具有无限的列,但在查询执行过程中,只有在WHERE和SELECT子句中引用的列才具有实际意义,才需要将填充到记录中。例如,针对查询180,即使图3中所示出的顶点有很多属性时,但是查询只涉及“位置”和“标签”。因此,在这个查询中有意义的表格表示只有两列,即位置和标签。
在本文所描述的主题的实施例中,对于标准的SQL的第一个扩展是MATCH子句。MATCH子句由一个或多个路径表达式组成,每个路径表达式指定连接在FROM子句中定义的两个顶点变量的有向边的列表。边定义的一种示例格式为:
[sourceAlias]-[Edge As edgeAlias]->[sinkAlias],
其中sourceAlias和sinkAlias是可选的,但至少有一个必须存在。从SQL的角度来看,边的变量也定义了一个表引用。与节点类似,由于边的灵活模式,该表具有无限数量的列,并且包括用于边的JSON表示的特殊列*(星号)。在一些实施例中,边的表具有几个预定义的列:sourceId,sourceLabel,sinkId,sinkLabel。
在根据本文所描述的主题的实施例的扩展的SQL中,FROM和MATCH子句共同定义顶点和边变量及其拓扑关系。WHERE子句通过布尔表达式对变量进一步进行附加约束,变量的执行顺序由查询优化器确定。本质上,拓扑关系描述了一种特殊类型的连接条件。通过在标准的SQL中添加和扩展MATCH子句,能够允许优化器利用图语义,从而发现具有相同语义的Gremlin查询。如图4所示,在扩展的SQL查询中,增加了描述两个节点之间的有向边的MATCH子句“MATCH N1-[Edge As E]->N2”。
继续参考图4,以Gremlin编写的查询180的含义是从位于CA的顶点开始遍历具有Senator的标签的邻居顶点;而以Gremlin编写的查询185的含义是从具有Senator的标签的顶点开始反向遍历到位于CA的顶点。通过分析,查询180和185实际上具有相同的语义和输出结果,只是图遍历的顺序不同。换句话说,查询180和185本质上体现了相同的图查询的两个执行方案:查找通过一跳边连接的CA居民和参议员。然而,这样的等价不是由Gremlin语法或语义来确定,而是由图的语义来确定的,也即从顶点A到顶点B的遍历相当于通过B的输入边从B到A的相反遍历。
由于数据流是有方向性的,而Gremlin本身并没有指定等价的组合,因而不能标识相同数据流的等效执行计划,并且不能在运行时执行最佳的执行方案。因此,根据本文所描述的主题的实施例通过转换部件125将以Gremlin的源语言查询180和185转换成以扩展的SQL420的相同的目标语言查询190,利用扩展的SQL语法和语义显式地表示图中的语义等价性,由此实现对源语言查询的优化。以这种方式,扩展的SQL形成了查询优化的基础,并将成为优化查询的编译器的输入,并生成执行运算符以生成结果。例如,由于查询180和185具有相同的语义,因而只要执行其中之一就可以获得这两个查询的输出结果,提高了Gremlin查询的执行效率
此外,查询185比查询180更有效率,因为在美国只有100个参议员,而有数千万住在CA的居民。从小得多的顶点集合开始,可以降低执行的复杂性并且提高查询速度。因此,通过使用Gremlin执行查询185来替代查询180,能够提高Gremlin查询的执行效率。
图5示出了根据本文所描述的主题的实施例的用于优化函数式的图遍历语言中的查询的方法500的流程图。应当理解,方法500可以由参考图1所描述的计算设备/服务器100执行,并且可以在参考图2所描述的步骤204之后执行。
在502,获得以函数式的图遍历语言的第三查询。例如,获得以Gremlin编写的第三查询185。在504,将第三查询转换成以扩展的SQL形式的第四查询。例如,转换部件125对第三查询185进行转换。在506,判断第二查询与第四查询具有相同的执行方案。由于扩展的SQL可以发现语义相同的查询,因而可以通过对转换后的目标语言查询进行比较来标识相同的源语言查询。
如果确定第二查询与第四查询具有相同的执行方案,则在508,确定第一查询与第三查询具有相同的语义。例如,在图4的示例中,第一查询180和第三查询185都被转换成了查询190(即,查询190表示第二查询和第四查询二者),则说明第一查询180和第三查询185实质上是语义相同的查询,他们的输出结果也相同。
在510,判断第三查询的执行效率是否高于第一查询的执行效率,执行效率可以表示查询执行的时间成本和/或计算成本等。如果确定第三查询的执行效率高于第一查询的执行效率,则在512,使用第三查询来代替第一查询。例如,在图4所描述的示例中,第三查询185的查询效率高于第一查询180,则仅执行第三查询185来代替执行第一查询180和第三查询185二者。如果在510确定第三查询的执行效率低于第一查询的执行效率在514,则使用第一查询来代替第三查询。
此外,如果在506确定第二查询与第四查询具有不同的执行方案,则在516,确定第一查询与第三查询具有不同的语义,说明第一查询与第三查询之间无法被优化。然而,第一查询或第三查询可以与其他的查询进行比较以确定是否针对其进行执行优化。
因此,根据本文所描述的主题的实施例,通过对函数式的图遍历语言的转换,能够标识函数式的图遍历语言中具有相同语义的查询,从而优化函数式的图遍历语言中的查询。此外,在标识出函数式的图遍历语言中相同语义的查询之后,可以选择执行效率最高的一个查询进行执行,由此提高了查询的执行效率。
应当理解,Gremlin作为一种数据流的命令式语言,其中的基本语句可以涉及运算语句、循环语句、条件分支语句、以及无条件分支语句,这些语句可以涉及流程控制、迭代、临时变量定义、高级数据结构(数组、字典、树结构)、副作用以及步骤之间的依赖关系。
以依赖关系作为一个示例,依赖关系决定了某些步骤必须在其他步骤之前完成,从而防止在查询优化期间“重排”。例如,Gremlin中的optional()和coalesce()步骤表示if-else逻辑,if-else体系中的所有步骤只有在完成optional()和coalesce()的前面的步骤之后才能被执行。此外,Gremlin中的副作用步骤aggregate()和store()也会产生依赖关系。这两个步骤都将数据传递到一个临时变量中,以后可以通过其他步骤(如cap())进行取回。为了使存储在变量中的数据正确,必须首先完成副作用步骤之前的所有步骤,并且稍后必须执行副作用步骤之后的所有步骤。
在传统的标准SQL中,命令式语言中的基本语句所涉及的内容通常无法被表达。为了克服这个缺陷,本文所描述的主题的实施例提供了自定义的表值函数(TVF),使得Gremlin中的流程控制、迭代、临时变量定义、高级数据结构(数组、字典、树结构)、副作用以及步骤之间的依赖关系能够准确地被保留,其中根据本文所描述的主题的实施例的TVF语义大部分是不变的,因而其也能够与其他SQL结构兼容。
TVF是一种用户定义的函数,它输入来自传入行的值,并输出具有预定义的列数的零行或更多行。以表格作为输入,对输入表的每一行重复调用TVF,并将所有调用的结果垂直连接起来。连接的行形成一个新的表,它可以被赋予一个新的名称,并在扩展的SQL的其他部分被引用。例如,WHERE子句中的布尔条件引用了TVF产生的表的一列,或者这个表的一些列是另一个TVF的输入。
在一些实施例中,可以针对Gremlin中的步骤,提供对应的TVF。根据本文所描述的主题的实施例的TVF能够表示复杂的Gremlin步骤,并且具有三个重要的特性。第一,TVF可以改变基数,既可以减小又可以增大。考虑到许多Gremlin的步骤可以朝着任何方向,因而这是一个不可避免的要求。相反,布尔表达式只会减小结果,标量表达式不会改变基数。第二,TVF是用户定义的,调用产生的行是完全由用户自定义的。只要足够的信息作为输入参数被传入,就可以使TVF的计算逻辑与Gremlin的计算逻辑完全相同。相比之下,表连接和它们的变体(例如自然连接、外连接)具有非常严格的语义,通常无法改变它们来适应Gremlin步骤。第三,TVF的输入可以来自其他顶点/边变量和/或TVF,从而创建隐式依赖图,使得TVF只能在父变量/TVF被执行之后被执行。以这种方式,能够在扩展的SQL中标识不能被重排或者优化的步骤,同时标识可以被重排或者优化的步骤。
在定义Gremlin步骤所对应的TVF时,在语法上需要定义函数的输入以及它产生的列。例如,函数的输入可以是来自先前表引用的标量值列表,其是指定该函数的计算逻辑所必需的。输出列应该包含TVF相应步骤之后的Gremlin步骤所要求的所有列,列可以是固定的,也可以是动态的。动态的列集也由TVF的参数来指定,或者显式地通过列名列表或者通过标量子查询隐式地而被指定。因此,与传统的标准SQL不同,本文所描述的主题的实施例的扩展的SQL在函数被声明和被注册到数据库中时,TVF的输出列总是固定的且预定义的。
也就是说,在将Gremlin查询转换成扩展的SQL查询的过程中,可以标识Gremlin查询中所包括的多个步骤之间的依赖关系,并且使用表值函数在扩展的SQL查询中保留依赖关系。可选地,对于Gremlin查询中的副作用步骤,也可以在扩展的SQL查询中进行保留,尽管副作用步骤的执行与否通常不影响所执行的Gremlin查询本身的输出。
此外,Gremlin中的过滤步骤并不总是映射到WHERE子句中的布尔谓词。在某些情况下,它们需要映射到通过布尔谓词执行过滤逻辑的TVF。WHERE子句中的一个布尔谓词会失去对其他表引用的依赖关系。当一个过滤步骤跟随一个Gremlin副作用步骤,需要根据本文所描述的主题的实施例进行另外的处理。图6示出了根据本文所描述的主题的实施例的用于转换函数式的图遍历语言中的依赖关系的示意图600。
如图6所示,在以查询函数式的图遍历语言410(例如Gremlin)的查询615中,包括副作用步骤Store(),其将姓名为“John”的顶点存入到临时变量,并且然后使用Cap()步骤进行取回。由于Gremlin查询615中包括副作用步骤Store(),因而在步骤Store()执行之后才能执行后续的步骤,步骤Store()之后的步骤对步骤Store()存在着依赖。
如果忽略副作用步骤Store()的依赖关系而将Gremlin查询615转换成标准的SQL,则如图6所示,在所生成的标准的SQL 420中的查询625,两个过滤步骤都在WHERE子句中。在标准的SQL查询625中,虽然Store()和Cap()的依赖关系是保留的,但是Store()只能在N_18之后被计算,并且Cap()必须在Store()之后被计算,指示因为Store()的输入取决于N_18,并且Cap()只能在Store()后面找到变量‘x’。然而,这种执行计划将导致顶点满足临时变量中存储的两个谓词,这违反了原始查询的意图,即步骤Store()只存储名为John的顶点。
继续参考图6,根据本文所描述的主题的实施例将Gremlin查询615转换成扩展的SQL 420中的查询635,在FROM子句中增加了“Filter(CASE WHEN N_18.age>20THEN N_19.value)AS[N_22]”。通过将第二个谓词作为过滤器TVF移动到FROM子句中,谓词相对于其他表和TVF的相对位置被保存在FROM子句中,因此,根据本文所描述的主题的实施例可以完全忠实地表示原始Gremlin查询的语义,而不会漏掉步骤之间的依赖关系。
在一些实施例中,根据Gremlin查询中是否具有子遍历,可以将TVF分成两种,第一种是没有子遍历的Gremlin查询,第二种是具有子遍历的查询。对于没有子遍历的Gremlin步骤,这种类型的TVF采用标量值列表。输出可以是固定数量的列(根本不需要任何指定),也可以是标量值列表中提供名称的一组动态列。换句话说,输入值列表由两部分组成,第一部分定义了计算逻辑,第二部分定义了要输出列名的列表。
对于具有一个或多个子遍历的Gremlin查询,这种类型的TVF将输入作为一个或多个SELECT子查询,当子遍历引用来自先前的Gremlin步骤的数据时,该子查询在其父上下文中引用顶点变量、边变量以及TVF。TVF的输出列由子查询的SELECT子句中的投出列来指定。当有多个子遍历时,所有SELECT子查询中的SELECT元素必须对齐,也即多个子查询各自输出的列数相同,以便输出表呈现所有输出记录的统一视图,应当理解这些记录可能由任何子遍历产生。以下图7和图8描述了用于转换具有一个或多个子遍历的Gremlin查询的示例。
图7示出了根据本文所描述的主题的实施例的用于转换函数式的图遍历语言中的coalesce()步骤的示意图700。参考图7,针对函数式的图遍历语言410(例如Gremlin)中的查询715,所包括的coalesce()步骤的含义是针对每个传入对象,依次执行所有的子遍历并且输出第一个不为空的子遍历的结果。换句话说,coalesce()步骤先执行其中的第一个子遍历,如果有结果则返回结果,停止执行后续的子遍历;否则,执行第二个子遍历。
根据本文所描述的主题的实施例,Gremlin查询715可以被转换成扩展的SQL 420中的查询725。在转换后的SQL查询725中,coalesce()的每个子遍历都被转换成一个SELECT子查询。这两个子查询是TVF的Coalesce()的两个输入参数。这个TVF的计算逻辑是,来自N_18的每个记录都针对两个SELECT子查询进行执行,第一个子查询返回的结果将为该步骤的结果。对于每个调用,来自N_18的输入记录通过VertexToForwardEdge()(其为SELECT子查询中的另一个TVF)执行。该TVF将输入作为JSON格式的顶点,即N_18.*,并且输出两个字段的记录,一个字段用于边的标签,另一个用于边的JSON表示。这两个字段都被填充,因为它们是需要的:在WHERE子句中引用“label(标签)”字段进行相等性检查,假设两个子遍历都返回边,则在SELECT子句中使用“*”字段。两个子查询中的两个SELECT子句也定义了TVF的Coalesce()在这个查询中产生一列的表,列名是“*”。由于原始Gremlin查询中的coalesce()是最后一步,此列最终投出到顶层SELECT子句中并且输出边。
图8示出了根据本文所描述的主题的实施例的用于转换函数式的图遍历语言中的optional()步骤的示意图800。参考图8,针对函数式的图遍历语言410(例如Gremlin)中的查询815,所包括的optional()步骤的含义是执行其中的第二个子遍历,如果有结果则返回结果,停止执行后续的子遍历;否则,才执行第一个子遍历。
根据本文所描述的主题的实施例,Gremlin查询815可以被转换成扩展的SQL 420中的查询825。虽然optional()步骤只有一个子遍历,但其TVF的输入包含一个附加的SELECT子查询,它只有SELECT子句。所选的元素(即N_18.name)来自先前的Gremlin步骤的表格引用。因此,它只投出输入记录的值。针对每个输入记录,如果结果不为空,则TVF的结果来自第二个子查询,或者结果是输入记录的投出。无论输入记录经过哪个分支,子查询都会投出相同的一组列,因此TVF提供了统一的视图:values()。所投出的列(即“name”)是后续步骤所需要的。
此外,Gremlin查询中的count(),sum()和sample()步骤始终输出固定的列数,其中count()和sum()输出数字列,而sample()不输出列。数字列的名称是预定义的,因为它对任何查询都是固定的。一般来说,大多数TVF都有一个默认投出列,当后续步骤没有请求附加列时,将返回一列。当TVF返回顶点/边对象或者以其他方式预定义时,默认列的名称是“*”(星号)。Gremlin查询中的数据修改步骤(例如addV()和addE())是输出一组动态列的示例步骤,这些列是后续Gremlin步骤所需的顶点/边界属性。通过Gremlin语义,数据修改步骤除了持续更改之外,还返回目标对象(顶点、边、属性),并将它们传递给后续步骤。
图9示出了根据本文所描述的主题的实施例的使用有限状态机(FSM)来将函数式的图遍历语言转换成扩展的结构化查询语言的示意图900。转换部件125所使用的转换算法执行一个有限状态机(FSM)。该FSM由Gremlin步骤在遍历中产生的状态组成,并且每次在遍历的末尾附加上Gremlin步骤,FSM通过应用转换函数移动到新的状态,该函数由该Gremlin步骤的语义来定义。转换算法通过原始查询中的Gremlin步骤的顺序一个接一个地执行转换函数,并将每个转换及其输出状态映射到相应的SQL结构,例如FROM子句中的TVF或WHERE子句中的布尔谓词。当FSM终止时,算法将所有SQL构造组装形成一个扩展的SQL查询,其提供Gremlin查询的全保真表示。
如图9所示,以函数式的图遍历语言(例如Gremlin)410的查询915首先被转换成FSM 920中的状态,例如在FSM 920中涉及三个顶点X、Y、Z以及顶点Y的属性“name=Jeff”。然后,根据FSM 920中的状态,在转换成扩展的SQL 420中的查询935。在扩展的SQL 935中,包括描述顶点之间的有向边的MATCH子句。
根据本文所描述的主题的实施例,一些转换函数对输入状态有严格的要求,而另一些转换函数适用于任何状态。将函数应用于不可接受的状态将产生异常,这意味着Gremlin查询无效。所有顶点步骤(包括out()、in()、both()、outE()、inE()、bothE()、outV()、inV()、bothV()、otherV())都属于前一类。例如,out()步骤通过Gremlin语义从顶点移动到其传出的邻居。因此,当先前的步骤导致非顶点状态时,其是无效的。从编译器的角度来看,检查输入状态需求类似于静态类型检查,这是在编译时或转换时完成的。
应当理解,每个转换函数都会导致输出状态。某些转换函数不会产生新的状态,并始终保持其输入状态。这些函数通常对应Gremlin步骤,以某种方式过滤或重新排列输入,但不会产生任何新的数据,例如和and(),or(),has(),where(),range(),order()。其他函数总是移动到一个新的状态。一些函数的输出是确定性的。例如,顶点步骤和数据修改步骤(例如,addV(),addE())的转换函数导致顶点或边状态。值聚合步骤(例如sum()和count())总是会导致数值状态。Fold()和Project()是一种特殊类型的聚合步骤,分别生成一个数组和一个图。但并不是所有功能的输出都可以在转换时被确定。这些函数对应于执行if-else逻辑的分支步骤(例如,optional(),union()和coalesce()),其中“if”分支和“else”分支可以产生不同的状态,以及从本身是模糊的先前的状态(例如select()和unfold())提取数据的步骤。对于这些情况,没有在FSM中保持所有可能的输出状态,而是最终导致组合,因此需要们为每个这样的函数创建一个“复合”状态,在这个状态下应用下面的过渡函数。这种设计的直接后果是,那些将输入限制到某种类型的转换函数必须扩展以支持这些复合状态,而查询返回的有效性只能在运行时进行检查。
例如,针对以下Gremlin查询:
g.V(1).coalesce(__.outE(),__.in()).out()
其中最后一个out()步骤期望输入是顶点,只有当coalesce()步骤输出第二个子遍历的结果时,查询才会有效。由于在转换时执行哪个子遍历是未知的,所以转换算法假设coalesce()的子遍历是可能的,并且向FSM添加复合状态,在该FSM基础上out()步骤将创建新的状态。
随着FSM从一种状态转移到另一种状态,转换算法通过转换建立扩展的SQL查询。通常,顶点步骤的输出状态将映射到FROM子句中的节点表引用或MATCH子句中的边名称,过滤步骤映射到WHERE子句中的布尔谓词,其他步骤映射到FROM子句中对应的TVF。
然而,在转换过程中可能存在异常。例如,当顶点步骤跟随的转换状态是复合的Gremlin步骤时,存在附加的布尔谓词来连接前一个Gremlin步骤的TVF和后一个顶点步骤的节点表引用。例如,对于示例coalesce().out(),除了out()和coalesce()的TVF的节点表引用之外,还有一个相等比较谓词,绑定节点表的顶点ID列到TVF的列之一。这种连接通常表示为MATCH子句中的边名称,是绑定到所有边的自由变量。但是由于在这种情况下,边是隐式地从复合状态派生的,所以它们不能在MATCH子句中被定义。除了使用布尔谓词之外,这种情况下的备选方法是将out()也映射到TVF,其计算逻辑是加载一组由先前TVF的输出为边界的顶点集合。
此外,将Gremlin查询转换成扩展的SQL查询的关键是获取每个TVF中投出的列。在SQL中,表(包括由TVF生成的动态表)通常具有固定的列数。SQL被认为是有效的,因此只有在所有标量表达式都引用可用列的情况下才能编译。因此,所转换的扩展的SQL查询的一个基本要求就是每个TVF输出其他SQL结构所需或引用的所有列。然而,Gremlin在定义语义时采用了面向对象的模型:一个对象包含了当前遍历的完整状态,并且根据Gremlin步骤的请求从对象中提取了字段或属性。缺少的字段或属性只能在运行时检测到。
Populate()是转换中的一种转换过程中的安全机制,其为每个表引用和TVF填充输出列,并确保输出列包含所有由后面的Gremlin步骤的SQL对应引用的全部内容。它被实现为每个FSM状态的虚拟功能。Populate()遵循每次调用Populate(string colName)的规定,状态的相应TVF必须输出列“colName”。这包括状态本身不能产生“colName”,但仍然需要填充输出表中的列,因此它们的值全为空。这也包括产生这样的列时需要进一步调用其他FSM状态的Populate()从而产生连锁效应的情况。
Populate()是一个虚拟函数,它的实现根据不同FSM状态(和它们对应的Gremlin步骤)的语义而不同。例如,在以下示例中:
g.V().has(‘name,‘John’)
其中has()步骤将为FSM添加一个WHERE子句谓词。但在此之前,需要确保目标表中的“name”列是可用的。has()步骤指向一个顶点变量,并调用其状态的Populate()。由于顶点变量被映射到节点表,并且假设节点表由于灵活方案而包含所有属性,所以顶点变量的Populate()是一个void函数。
此外,以下示例给出了触发连锁效应的另一个Gremlin查询示例:g.V(1).coalesce(__.in(‘x’),__.in(‘y’)).optional(__.out()).has(‘name’,‘John’)
其中最后一步has()会添加一个布尔谓词,并且需要调用Populate()来确保谓词的目标表具有该列。在这种情况下,它是optional()的TVF。由于optional()的输出可能来自它的子遍历或其输入,因而optional()的Populate()的实现必须确保子遍历和它的输入都有“name”列,从而分别针对子遍历(__out())和输入coalesce状态而调用Populate()。
许多Gremlin步骤涉及嵌套子遍历,例如coalesce(),optional(),flatMap()等。对于上层来说,子遍历是一个新的查询,并通过执行新的FSM单独转换并转换到扩展的的SQL查询。唯一不同的是,子遍历通过“__”(双下划线)连接到外部遍历,它将外部遍历的状态传递到内部子遍历作为其输入。因此,子遍历中的Gremlin步骤可以看到并参考来自外部遍历的数据。反过来,子遍历的转换后的SQL是子查询,并且可以引用父查询中的表及其列。
应当理解,双下划线“__”映射到FSM中的代理状态,该代理状态指向父遍历中的子遍历的输入状态。在构建扩展的SQL的内部语言时,此状态未被映射到任何SQL查询,但实现了Populate(),以使得在输入状态中正确填充内部Gremlin步骤引用的任何外部数据。因此,所转换的SQL子查询是合理的,因为父查询的所有列引用都是有效的。
除此之外,根据本文所描述的主题的实施例的将Gremlin转换成扩展的SQL查询的方案,能够将查询处理转换为面向记录的。在Gremlin的标准实现中,Gremlin查询由Gremlin步骤组成,其直接映射到对象管道,Gremlin步骤的计算逻辑作为对象的虚拟功能实现。虽然面向对象的语义对于面向对象的运行时是很方便的,但是面向对象的模型混合了数据和计算,并且很难支持多运行的特性,例如并发控制、批处理以及查询分页。
根据本文所描述的主题的实施例,采用面向记录的模型来分离数据和计算:执行运行时由链接在一起的一个或多个执行操作符组成,每个操作符注入并投出具有固定的一组列或字段的记录流。这个需求与SQL很一致,因为在SQL表中有一个固定的列数,所以它们中有几个是并列的。为了实现面向记录的执行,转换部件负责推理每个Gremlin步骤的输入和输出对象,并将其转换为多字段记录的集合,这些记录自然地表示为扩展的SQL中的表。因此,根据本文所描述的主题的实施例实现了数据和操作的去耦合,能够减小调用并且实现批处理,由此提高了查询效率。
本文中所描述的方法和功能可以至少部分地由一个或多个硬件逻辑组件来执行。例如但不限于,可以使用的硬件逻辑组件的示意性类型包括现场可编程门阵列(FPGA)、专用集成电路(ASIC)、专用标准产品(ASSP)、片上系统(SOC)、复杂可编程逻辑器件(CPLD)等。
用于实施本文所描述的主题的方法的程序代码可以采用一个或多个编程语言的任何组合来编写。这些程序代码可以提供给通用计算机、专用计算机或其他可编程数据处理装置的处理器或控制器,使得程序代码当由处理器或控制器执行时使流程图和/或框图中所规定的功能/操作被实施。程序代码可以完全在机器上执行、部分地在机器上执行,作为独立软件包部分地在机器上执行且部分地在远程机器上执行或完全在远程机器或服务器上执行。
在本公开内容的上下文中,机器可读介质可以是有形的介质,其可以包含或存储以供指令执行系统、装置或设备使用或与指令执行系统、装置或设备结合地使用的程序。机器可读介质可以是机器可读信号介质或机器可读储存介质。机器可读介质可以包括但不限于电子的、磁性的、光学的、电磁的、红外的、或半导体系统、装置或设备,或者上述内容的任何合适组合。机器可读存储介质的更具体示例会包括基于一个或多个线的电气连接、便携式计算机盘、硬盘、随机存取存储器(RAM)、只读存储器(ROM)、可擦除可编程只读存储器(EPROM或快闪存储器)、光纤、便捷式紧凑盘只读存储器(CD-ROM)、光学储存设备、磁储存设备、或上述内容的任何合适组合。
此外,虽然采用特定次序描绘了各操作,但是这应当理解为要求这样操作以所示出的特定次序或以顺序次序执行,或者要求所有图示的操作应被执行以取得期望的结果。在一定环境下,多任务和并行处理可能是有利的。同样地,虽然在上面论述中包含了若干具体实现细节,但是这些不应当被解释为对本文所描述的主题的范围的限制。在单独的实现的上下文中描述的某些特征还可以组合地实现在单个实现中。相反地,在单个实现的上下文中描述的各种特征也可以单独地或以任何合适的子组合的方式实现在多个实现中。
以下列出了本公开的一些示例实现方式。
在一个方面,提供了一种计算机实现的方法。该方法包括:获得以函数式的图遍历语言的第一查询,其中第一查询涉及描述图中的顶点之间的邻近关系的有向边;以及将第一查询转换成以扩展的结构化查询语言(SQL)的第二查询,其中第二查询包括描述有向边的子句。
在一些实施例中,该方法还包括:获得以函数式的图遍历语言的第三查询;将第三查询转换成以扩展的SQL的第四查询;以及响应于确定第二查询与第四查询具有相同的执行方案,确定第一查询与第三查询具有相同的语义。
在一些实施例中,该方法还包括:比较第三查询的执行效率与第一查询的执行效率;以及响应于第三查询的执行效率高于第一查询的执行效率,使用第三查询来代替第一查询。
在一些实施例中,其中将第一查询转换成第二查询包括:标识第一查询所包括的命令式语言中的基本语句;以及使用表值函数在第二查询中保留基本语句的内容,表值函数是能够定义输入以及所输出的列数的用户定义的函数。
在一些实施例中,其中标识命令式语言中的基本语句包括:标识第一查询所包括的副作用步骤,副作用步骤的执行与否不影响第一查询的输出,以及保留基本语句的内容包括:在第二查询中保留副作用步骤。
在一些实施例中,其中将第一查询转换成第二查询包括:确定第一查询是否涉及多个子遍历;以及响应于确定第一查询涉及多个子遍历,将第一查询中的多个子遍历转换成第二查询中的多个子查询,多个子查询各自输出的列数相同。
在一些实施例中,其中将第一查询转换成第二查询包括:基于第二查询中的选择语句,确定第二查询的输出的列数。
在一些实施例中,其中将第一查询转换成第二查询包括:基于第一查询中的步骤,生成有限状态机(FSM)中的状态;以及基于FSM中的状态,生成第二查询。
在一些实施例中,其中函数式的图遍历语言是Gremlin语言,并且其中扩展的SQL是标准SQL的扩展版本。
在另一方面,提供了一种电子设备。该电子设备包括:处理单元;存储器,耦合至处理单元并且存储有指令,指令在由处理单元执行时执行以下动作:获得以函数式的图遍历语言的第一查询,其中第一查询涉及描述图中的顶点之间的邻近关系的有向边;以及将第一查询转换成以扩展的结构化查询语言(SQL)的第二查询,其中第二查询包括描述有向边的子句。
在一些实施例中,其中动作还包括:获得以函数式的图遍历语言的第三查询;将第三查询转换成以扩展的SQL的第四查询;以及响应于确定第二查询与第四查询具有相同的执行方案,确定第一查询与第三查询具有相同的语义。
在一些实施例中,其中动作还包括:比较第三查询的执行效率与第一查询的执行效率;以及响应于第三查询的执行效率高于第一查询的执行效率,使用第三查询来代替第一查询。
在一些实施例中,其中将第一查询转换成第二查询包括:标识第一查询所包括的命令式语言中的基本语句;以及使用表值函数在第二查询中保留基本语句的内容,表值函数是能够定义输入以及所输出的列数的用户定义的函数。
在一些实施例中,其中标识命令式语言中的基本语句包括:标识第一查询所包括的副作用步骤,副作用步骤的执行与否不影响第一查询的输出,以及保留基本语句的内容包括:在第二查询中保留副作用步骤。
在一些实施例中,其中将第一查询转换成第二查询包括:确定第一查询是否涉及多个子遍历;以及响应于确定第一查询涉及多个子遍历,将第一查询中的多个子遍历转换成第二查询中的多个子查询,多个子查询各自输出的列数相同。
在一些实施例中,其中将第一查询转换成第二查询包括:基于第二查询中的选择语句,确定第二查询的输出的列数。
在一些实施例中,其中将第一查询转换成第二查询包括:基于第一查询中的步骤,生成有限状态机(FSM)中的状态;以及基于FSM中的状态,生成第二查询。
在一些实施例中,其中函数式的图遍历语言是Gremlin语言,并且其中扩展的SQL是标准SQL的扩展版本。
在又一方面,提供了一种计算机程序产品。该计算机程序产品被存储在非瞬态计算机存储介质中并且包括机器可执行指令,机器可执行指令在设备中运行时使得设备执行动作:获得以函数式的图遍历语言的第一查询,其中第一查询涉及描述图中的顶点之间的邻近关系的有向边;以及将第一查询转换成以扩展的结构化查询语言(SQL)的第二查询,其中第二查询包括描述有向边的子句。
在一些实施例中,其中机器可执行指令在设备中运行时还使得设备:获得以函数式的图遍历语言的第三查询;将第三查询转换成以扩展的SQL的第四查询;以及响应于确定第二查询与第四查询具有相同的执行方案,确定第一查询与第三查询具有相同的语义。
在一些实施例中,其中机器可执行指令在设备中运行时还使得设备:比较第三查询的执行效率与第一查询的执行效率;以及响应于第三查询的执行效率高于第一查询的执行效率,使用第三查询来代替第一查询。
在一些实施例中,其中将第一查询转换成第二查询包括:标识第一查询所包括的命令式语言中的基本语句;以及使用表值函数在第二查询中保留基本语句的内容,表值函数是能够定义输入以及所输出的列数的用户定义的函数。
在一些实施例中,其中标识命令式语言中的基本语句包括:标识第一查询所包括的副作用步骤,副作用步骤的执行与否不影响第一查询的输出,以及保留基本语句的内容包括:在第二查询中保留副作用步骤。
在一些实施例中,其中将第一查询转换成第二查询包括:确定第一查询是否涉及多个子遍历;以及响应于确定第一查询涉及多个子遍历,将第一查询中的多个子遍历转换成第二查询中的多个子查询,多个子查询各自输出的列数相同。
在一些实施例中,其中将第一查询转换成第二查询包括:基于第二查询中的选择语句,确定第二查询的输出的列数。
在一些实施例中,其中将第一查询转换成第二查询包括:基于第一查询中的步骤,生成有限状态机(FSM)中的状态;以及基于FSM中的状态,生成第二查询。
在一些实施例中,其中函数式的图遍历语言是Gremlin语言,并且其中扩展的SQL是标准SQL的扩展版本。
尽管已经采用特定于结构特征和/或方法逻辑动作的语言描述了本公开,但是应当理解所附权利要求书中所限定的主题未必局限于上面描述的特定特征或动作。相反,上面所描述的特定特征和动作仅仅是实现权利要求书的示例形式。
Claims (20)
1.一种计算机实现的方法,包括:
获得以函数式的图遍历语言的第一查询,所述第一查询涉及描述图中的顶点之间的邻近关系的有向边;以及
将所述第一查询转换成以扩展的结构化查询语言(SQL)的第二查询,所述第二查询包括描述所述有向边的子句。
2.根据权利要求1所述的方法,还包括:
获得以所述函数式的图遍历语言的第三查询;
将所述第三查询转换成以所述扩展的SQL的第四查询;以及
响应于确定所述第二查询与所述第四查询具有相同的执行方案,确定所述第一查询与所述第三查询具有相同的语义。
3.根据权利要求2所述的方法,还包括:
比较所述第三查询的执行效率与所述第一查询的执行效率;以及
响应于所述第三查询的执行效率高于所述第一查询的执行效率,使用所述第三查询来代替所述第一查询。
4.根据权利要求1所述的方法,其中将所述第一查询转换成所述第二查询包括:
标识所述第一查询所包括的命令式语言中的基本语句;以及
使用表值函数在所述第二查询中保留所述基本语句的内容,所述表值函数是能够定义输入以及所输出的列数的用户定义的函数。
5.根据权利要求4所述的方法,其中,
标识所述命令式语言中的基本语句包括:标识所述第一查询所包括的副作用步骤,所述副作用步骤的执行与否不影响所述第一查询的输出,以及
保留所述基本语句的内容包括:在所述第二查询中保留所述副作用步骤。
6.根据权利要求1所述的方法,其中将所述第一查询转换成所述第二查询包括:
确定所述第一查询是否涉及多个子遍历;以及
响应于确定所述第一查询涉及多个子遍历,将所述第一查询中的所述多个子遍历转换成所述第二查询中的多个子查询,所述多个子查询各自输出的列数相同。
7.根据权利要求1所述的方法,其中将所述第一查询转换成所述第二查询包括:
基于所述第二查询中的选择语句,确定所述第二查询的输出的列数。
8.根据权利要求1所述的方法,其中将所述第一查询转换成所述第二查询包括:
基于所述第一查询中的步骤,生成有限状态机(FSM)中的状态;以及
基于所述FSM中的所述状态,生成所述第二查询。
9.根据权利要求1所述的方法,其中所述函数式的图遍历语言是Gremlin语言,并且其中所述扩展的SQL是标准的SQL的扩展版本。
10.一种电子设备,包括:
处理单元;
存储器,耦合至所述处理单元并且存储有指令,所述指令在由所述处理单元执行时执行以下动作:
获得以函数式的图遍历语言的第一查询,所述第一查询涉及描述图中的顶点之间的邻近关系的有向边;以及
将所述第一查询转换成以扩展的结构化查询语言(SQL)的第二查询,所述第二查询包括描述所述有向边的子句。
11.根据权利要求10所述的电子设备,所述动作还包括:
获得以所述函数式的图遍历语言的第三查询;
将所述第三查询转换成以所述扩展的SQL的第四查询;以及
响应于确定所述第二查询与所述第四查询具有相同的执行方案,确定所述第一查询与所述第三查询具有相同的语义。
12.根据权利要求11所述的电子设备,所述动作还包括:
比较所述第三查询的执行效率与所述第一查询的执行效率;以及
响应于所述第三查询的执行效率高于所述第一查询的执行效率,使用所述第三查询来代替所述第一查询。
13.根据权利要求10所述的电子设备,其中将所述第一查询转换成所述第二查询包括:
标识所述第一查询所包括的命令式语言中的基本语句;以及
使用表值函数在所述第二查询中保留所述基本语句的内容,所述表值函数是能够定义输入以及所输出的列数的用户定义的函数。
14.根据权利要求13所述的电子设备,其中,
标识所述命令式语言中的基本语句包括:标识所述第一查询所包括的副作用步骤,所述副作用步骤的执行与否不影响所述第一查询的输出,以及
保留所述基本语句的内容包括:在所述第二查询中保留所述副作用步骤。
15.根据权利要求10所述的电子设备,其中将所述第一查询转换成所述第二查询包括:
确定所述第一查询是否涉及多个子遍历;以及
响应于确定所述第一查询涉及多个子遍历,将所述第一查询中的所述多个子遍历转换成所述第二查询中的多个子查询,所述多个子查询各自输出的列数相同。
16.根据权利要求10所述的电子设备,其中将所述第一查询转换成所述第二查询包括:
基于所述第二查询中的选择语句,确定所述第二查询的输出的列数。
17.根据权利要求10所述的电子设备,其中将所述第一查询转换成所述第二查询包括:
基于所述第一查询中的步骤,生成有限状态机(FSM)中的状态;以及
基于所述FSM中的所述状态,生成所述第二查询。
18.根据权利要求10所述的电子设备,其中所述函数式的图遍历语言是Gremlin语言,并且其中所述扩展的SQL是标准SQL的扩展版本。
19.一种计算机程序产品,所述计算机程序产品被存储在非瞬态计算机存储介质中并且包括机器可执行指令,所述机器可执行指令在设备中运行时使得所述设备:
获得以函数式的图遍历语言的第一查询,所述第一查询涉及描述图中的顶点之间的邻近关系的有向边;以及
将所述第一查询转换成以扩展的结构化查询语言(SQL)的第二查询,所述第二查询包括描述所述有向边的子句。
20.根据权利要求19所述的计算机程序产品,其中所述机器可执行指令在所述设备中运行时还使得所述设备:
获得以所述函数式的图遍历语言的第三查询;
将所述第三查询转换成以所述扩展的SQL的第四查询;以及
响应于确定所述第二查询与所述第四查询具有相同的执行方案,确定所述第一查询与所述第三查询具有相同的语义。
Priority Applications (4)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201810101533.7A CN110109940B (zh) | 2018-02-01 | 2018-02-01 | 将函数式的图遍历语言转换成扩展的结构化查询语言 |
EP19705434.9A EP3746908B1 (en) | 2018-02-01 | 2019-01-25 | Translating functional graph traversal language to extended structured query language |
PCT/US2019/015042 WO2019152256A1 (en) | 2018-02-01 | 2019-01-25 | Translating functional graph traversal language to extended structured query language |
US16/964,085 US20210034615A1 (en) | 2018-02-01 | 2019-01-25 | Translating functional graph traversal language to extended structured query language |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201810101533.7A CN110109940B (zh) | 2018-02-01 | 2018-02-01 | 将函数式的图遍历语言转换成扩展的结构化查询语言 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN110109940A true CN110109940A (zh) | 2019-08-09 |
CN110109940B CN110109940B (zh) | 2024-03-29 |
Family
ID=65433743
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201810101533.7A Active CN110109940B (zh) | 2018-02-01 | 2018-02-01 | 将函数式的图遍历语言转换成扩展的结构化查询语言 |
Country Status (4)
Country | Link |
---|---|
US (1) | US20210034615A1 (zh) |
EP (1) | EP3746908B1 (zh) |
CN (1) | CN110109940B (zh) |
WO (1) | WO2019152256A1 (zh) |
Cited By (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN112818181A (zh) * | 2021-01-25 | 2021-05-18 | 杭州绿湾网络科技有限公司 | 图数据库检索方法、系统、计算机设备和存储介质 |
CN113535145A (zh) * | 2021-06-28 | 2021-10-22 | 北京明略软件系统有限公司 | 基于Gremlin的并行扩展方法、系统、电子设备及存储介质 |
Families Citing this family (22)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US10860618B2 (en) | 2017-09-25 | 2020-12-08 | Splunk Inc. | Low-latency streaming analytics |
US10997180B2 (en) | 2018-01-31 | 2021-05-04 | Splunk Inc. | Dynamic query processor for streaming and batch queries |
US10936585B1 (en) | 2018-10-31 | 2021-03-02 | Splunk Inc. | Unified data processing across streaming and indexed data sets |
US11238048B1 (en) | 2019-07-16 | 2022-02-01 | Splunk Inc. | Guided creation interface for streaming data processing pipelines |
US11392624B2 (en) | 2019-12-11 | 2022-07-19 | Oracle International Corporation | Hybrid in-memory BFS-DFS approach for computing graph queries against homogeneous graphs inside relational database systems |
US11392623B2 (en) | 2019-12-11 | 2022-07-19 | Oracle International Corporation | Hybrid in-memory BFS-DFS approach for computing graph queries against heterogeneous graphs inside relational database systems |
US11397732B2 (en) * | 2019-12-11 | 2022-07-26 | Oracle International Corporation | Hybrid in-memory BFS-DFS approach for computing graph queries involving complex path patterns including trees and cycles inside relational database systems |
CN111367936B (zh) * | 2020-02-28 | 2023-08-22 | 中国工商银行股份有限公司 | 一种结构化查询语言语法的离线校验方法及装置 |
US11614923B2 (en) * | 2020-04-30 | 2023-03-28 | Splunk Inc. | Dual textual/graphical programming interfaces for streaming data processing pipelines |
EP4200698A1 (en) * | 2020-08-20 | 2023-06-28 | Speedment AB | Method and apparatus for mapping java streams to jpa commands |
US11567932B2 (en) | 2020-10-26 | 2023-01-31 | Oracle International Corporation | Efficient compilation of graph queries on top of SQL based relational engine |
US11507579B2 (en) | 2020-10-26 | 2022-11-22 | Oracle International Corporation | Efficient compilation of graph queries involving long graph query patterns on top of SQL based relational engine |
US11989178B2 (en) * | 2020-10-26 | 2024-05-21 | Oracle International Corporation | Efficient compilation of graph queries including complex expressions on top of sql based relational engine |
US11636116B2 (en) | 2021-01-29 | 2023-04-25 | Splunk Inc. | User interface for customizing data streams |
US11500868B2 (en) | 2021-01-29 | 2022-11-15 | Oracle International Corporation | Efficient identification of vertices and edges for graph indexes in an RDBMS |
US11687487B1 (en) | 2021-03-11 | 2023-06-27 | Splunk Inc. | Text files updates to an active processing pipeline |
US11663219B1 (en) | 2021-04-23 | 2023-05-30 | Splunk Inc. | Determining a set of parameter values for a processing pipeline |
US11989592B1 (en) | 2021-07-30 | 2024-05-21 | Splunk Inc. | Workload coordinator for providing state credentials to processing tasks of a data processing pipeline |
US20230118040A1 (en) * | 2021-10-19 | 2023-04-20 | NetSpring Data, Inc. | Query Generation Using Derived Data Relationships |
US11921785B2 (en) | 2022-01-25 | 2024-03-05 | Oracle International Corporation | Inline graph algorithm execution with a relational SQL engine |
US20230306021A1 (en) * | 2022-03-28 | 2023-09-28 | Infosys Limited | Method and system for converting graphql query into gremlin |
EP4287037A1 (en) * | 2022-06-02 | 2023-12-06 | Siemens Aktiengesellschaft | A method for generating a query pertaining to an industrial automation control system |
Citations (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101561817A (zh) * | 2009-06-02 | 2009-10-21 | 天津大学 | 一种XQuery到SQL查询语言的转换算法及关系数据的查询方法 |
US20150379082A1 (en) * | 2014-06-25 | 2015-12-31 | International Business Machines Corporation | Supporting imperative graphic queries on a relational database |
US20160179883A1 (en) * | 2014-12-19 | 2016-06-23 | Microsoft Technology Licensing, Llc | Graph processing in database |
US20160342709A1 (en) * | 2015-05-21 | 2016-11-24 | International Business Machines Corporation | Storing graph data in a relational database |
CN106874422A (zh) * | 2017-01-25 | 2017-06-20 | 东南大学 | 一种面向关系型数据库的图查询方法 |
Family Cites Families (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US9146984B1 (en) * | 2013-03-15 | 2015-09-29 | Google Inc. | Enhancing queries for data tables with nested fields |
-
2018
- 2018-02-01 CN CN201810101533.7A patent/CN110109940B/zh active Active
-
2019
- 2019-01-25 US US16/964,085 patent/US20210034615A1/en active Pending
- 2019-01-25 EP EP19705434.9A patent/EP3746908B1/en active Active
- 2019-01-25 WO PCT/US2019/015042 patent/WO2019152256A1/en unknown
Patent Citations (7)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101561817A (zh) * | 2009-06-02 | 2009-10-21 | 天津大学 | 一种XQuery到SQL查询语言的转换算法及关系数据的查询方法 |
US20150379082A1 (en) * | 2014-06-25 | 2015-12-31 | International Business Machines Corporation | Supporting imperative graphic queries on a relational database |
CN105224566A (zh) * | 2014-06-25 | 2016-01-06 | 国际商业机器公司 | 在关系数据库上支持命令式图形查询的方法和系统 |
US20160179883A1 (en) * | 2014-12-19 | 2016-06-23 | Microsoft Technology Licensing, Llc | Graph processing in database |
CN107111617A (zh) * | 2014-12-19 | 2017-08-29 | 微软技术许可有限责任公司 | 数据库中的图处理 |
US20160342709A1 (en) * | 2015-05-21 | 2016-11-24 | International Business Machines Corporation | Storing graph data in a relational database |
CN106874422A (zh) * | 2017-01-25 | 2017-06-20 | 东南大学 | 一种面向关系型数据库的图查询方法 |
Cited By (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN112818181A (zh) * | 2021-01-25 | 2021-05-18 | 杭州绿湾网络科技有限公司 | 图数据库检索方法、系统、计算机设备和存储介质 |
CN113535145A (zh) * | 2021-06-28 | 2021-10-22 | 北京明略软件系统有限公司 | 基于Gremlin的并行扩展方法、系统、电子设备及存储介质 |
CN113535145B (zh) * | 2021-06-28 | 2024-03-29 | 南京明略科技有限公司 | 基于Gremlin的并行扩展方法、系统、电子设备及存储介质 |
Also Published As
Publication number | Publication date |
---|---|
WO2019152256A1 (en) | 2019-08-08 |
EP3746908A1 (en) | 2020-12-09 |
US20210034615A1 (en) | 2021-02-04 |
CN110109940B (zh) | 2024-03-29 |
EP3746908B1 (en) | 2024-03-06 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN110109940A (zh) | 将函数式的图遍历语言转换成扩展的结构化查询语言 | |
Haas et al. | Extensible query processing in Starburst | |
US7877370B2 (en) | Systems and methods for data storage and retrieval using algebraic relations composed from query language statements | |
US7720806B2 (en) | Systems and methods for data manipulation using multiple storage formats | |
AU2015346525C1 (en) | Processing queries containing a union-type operation | |
US7613734B2 (en) | Systems and methods for providing data sets using a store of albegraic relations | |
US20070276787A1 (en) | Systems and Methods for Data Model Mapping | |
US7769754B2 (en) | Systems and methods for data storage and retrieval using algebraic optimization | |
CN111125440B (zh) | 一种基于Monad的持久层复合条件查询方法与存储介质 | |
Alonso et al. | Towards a polyglot data access layer for a low-code application development platform | |
EP3293645B1 (en) | Iterative evaluation of data through simd processor registers | |
EP3293644B1 (en) | Loading data for iterative evaluation through simd registers | |
Senko | DIAM II: The binary infological level and its database language-FORAL | |
Brandani | Multi-database Access from Amos II using ODBC | |
CN115004171A (zh) | 用于与模式无关的查询模板的生成和应用的系统和方法 | |
Bergsten et al. | An advanced database accelerator | |
Chamberlin | Comparing Two SQL-Based Approaches for Querying JSON: SQL++ and SQL: 2016 | |
Fischer et al. | Masterthesis Computer Science | |
George | A framework for integrating nested queries in natural language interfaces to databases | |
Richly et al. | S4J-integrating SQL into Java at compiler-level | |
Delcambre et al. | Reusing (shrink wrap) schemas by modifying concept schemas | |
Rodrigues | Executing SQL Queries with an XQuery engine | |
Risch | Production Program Generation in a Flexible Data Dictionary System. | |
Florescu et al. | Design and implementation of Flora, a language for object algebra | |
De Francesco et al. | Extending the ASP System DLVDB to Support Complex Terms and Procedural Sub-tasks |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |