数据库语言 GQL

什么是数据库语言 GQL?

一种针对属性图数据库语言的新标准,ISO/IEC 39075 信息技术—数据库语言—GQL,刚刚发布1。但GQL是什么?这个标准包含哪些内容?

这个新标准由国际标准委员会ISO/IEC JTC1 SC32 WG3 数据库语言小组开发。忽略那些标准的层级缩写,SC32 WG3是国际委员会,也负责开发和改进SQL数据库语言。SC32 WG3的参与者(个人专家)由世界各国标准流程委派。

当标准委员会开始讨论属性图数据库语言的新标准时,我们选择了“GQL”这个名字。GQL可能是Graph Query Language(图查询语言)的缩写,尽管这个名字主要是为了与SQL数据库语言并行。

SQL国际标准的初始版本(ISO/IEC 9075 - 数据库语言—SQL)于1987年发布。从那时起,SQL标准不断修订并纳入了各种新技术2。2019年,批准了一个新项目,以制定一个专注于属性图数据库的并行标准,即数据库语言GQL。这对标准机构和行业都具有重要意义,因为这是ISO在35多年来首次发布新的数据库查询语言。

属性图数据库在大数据、NoSQL技术领域近期变得尤为突出。属性图数据的一个显著特征是,在数据中创建关系,以便用户可以编写声明性查询而无需指定关系。与将数据结构化为表格的关系模型不同,属性图模型在数据库内部将数据结构化为图3。这支持了基于模式的新类型分析,同时也能够以最小的开销灵活地添加新类型的数据。实际应用范围从数字孪生到反洗钱,再到药物发现、供应链分析、知识图谱和通用人工智能(GenAI)等。新模型与语言的联合承诺,以及该领域显著且日益增长的应用,在很大程度上促成了作为SQL兄弟语言的新ISO标准的制定。

属性图数据库存储和检索节点(顶点)和边(关系)。GQL标准中指定的声明性语言既受到现有属性图数据库产品的影响,也受到SQL标准的影响。

GQL标准是一种完整的数据库语言,支持创建、读取、更新和修改属性图数据。属性图数据可以是无模式的,也可以由完整的图形类型(属性图模式)约束。

1 GQL标准于2024年4月11日正式发布。
2 ISO/IEC 9075 - 数据库语言—SQL的11部分于2023年6月发布。
3 图论 - 维基百科


GQL标准指定了丰富的数据类型,以支持字符和字节字符串、定点数值、浮点数值以及原生嵌套数据。GQL查询中使用的图模式匹配(GPM)语言非常强大,允许GQL用户编写相对简单的查询来进行复杂的数据分析。

GQL是一种数据库语言,而不仅仅是图查询语言。与SQL一样,它定义了一个从持久且可扩展的目录初始化的运行时环境。目录枚举通过经过身份验证的会话使用事务性工作单元访问的存储数据对象。它支持插入、更新、删除和读取由目录条目创建和引用的属性图,这些图的内容可以是未受约束的,或者由管理员定义的数据模型(称为图形类型)规定。这些图形类型作为GQL(遵循SQL)称为“GQL模式”的一部分指定:目录中专用于元数据和数据定义的容器,还通过定义数据所有权来启用安全模型的基础,数据所有权由经过身份验证的主体(用户)拥有。

GQL包含了许多现有商业图查询语言的功能,如openCypher(最初由Neo4j Inc.开发)、GSQL(Tigergraph Inc.)、PGQL(Oracle Inc.)以及LDBC的研究语言G-Core。它还与SQL/PGQ5共享一个基于Cypher的图模式匹配子语言(非正式地称为GPML4),SQL/PGQ是SQL的一个只读扩展,允许通过专用视图访问的表格数据被视为属性图。GPML将数据图与模式图进行匹配,返回数据图子图的表格表示。

属性图用例

属性图被私人和公共金融机构使用,这些机构希望(有时甚至是法律要求)识别潜在的犯罪行为,如洗钱。例如,从A到B到C再到A的一系列资金转移可能表明洗钱。同样,在评估投资组合风险、借贷双方偿付能力、反欺诈、客户360视图以及许多其他用例中也是如此。属性图还用于建模公用事业基础设施,如水分配、电力分配和电信网络。这里的典型查询包括识别在分配网络的特定点添加新负载或分布式发电(如风能或太阳能)的潜在影响和益处,以及设计、维护、故障排除和网络安全。


其他用例包括但不限于社交网络、物料清单、访问控制、产品推荐、引用网络、路由、影响者检测、蛋白质相互作用网络、影响分析和生成式人工智能。

GQL示例

以下示例通过示例简要介绍了GQL的功能:

  • 查询和图模式匹配
  • 添加、修改和删除数据
  • 事务
  • 无模式和固定模式

查询和图模式匹配

GQL查询使用丰富的图模式匹配(GPM)语言。以下示例查找与名为’Avery’的节点具有一跳关系的所有节点:

MATCH (a {firstname: 'Avery'})-[b]->(c)
RETURN a, b, c

请注意,变量a、b和c在MATCH语句中定义,并可以在查询后面的部分(在本例中为RETURN语句)中引用。查询编写者无需知道“Avery”与其他节点之间的关系。

GQL标准没有指定如何将返回的数据显示给用户。一种方式是以图形形式显示数据:图形可视化工具可以显示检索到的数据之间的关系,并根据需要展开以显示更多详细信息。另一种表示数据的方式是文本。请注意,这个查询版本的返回数据较少,以便示例适应页面宽度。

MATCH (a {firstname: 'Avery'})-[b]->(c)
RETURN a.firstname, b, c.name
+------------------------------------------------------------+
| a.firstname | b           | c.name  |
+------------------------------------------------------------+
| "Avery"     | [:LivesIn {...}] | "Granville" |
| "Avery"     | [:HasPet]      | "Unique"    |
+------------------------------------------------------------+

GQL GPM支持更复杂的查询,如量化路径模式。例如:

/* 简单QPP */
MATCH ((a)-[r]->(b)){1,5}
RETURN a, r, b

此示例将找到路径,其中一个节点知道另一个节点,最多经过五个跳。也可以执行更复杂的量化路径模式。

添加、修改和删除

之前示例中的GQL数据使用INSERT语句创建。例如:

/* 插入一个节点 */
INSERT (:Pet {name: 'Unique', pettype: 'Dog'})

在这个例子中,“Pet”是一个标签,“name”和“pettype”是属性。标签是存在或不存在的标识符。属性是名称和值的对。节点(顶点)和边(关系)都可以有标签和属性。

节点用括号括起来,而边用方括号括起来。

GQL的INSERT语句可以使用复杂的图模式。以下语句插入两个节点和它们之间的边:

/* 插入两个节点和一条边 */
INSERT (:Person {firstname: 'Avery', lastname: 'Stare', joined: date("2022-08-23")})
-[:LivesIn {since: date("2022-07-15")}]->
(:City {name: 'Granville', state: 'OH', country: 'USA'})

INSERT语句可以对MATCH语句的结果进行操作:

/* 在Avery和他们的狗之间创建一条边。 */
MATCH (a {firstname: 'Avery'}), (d {name: 'Unique'})
INSERT (a)-[:HasPet]->(d)

在这个例子中,“a”和“d”是别名。它们在MATCH子句中定义,并在GQL语句的末尾之前有效。MATCH的结果是由两个节点表达式返回的节点的笛卡尔积。因为每个节点表达式只返回一个节点,所以INSERT将只插入一条边。


通过识别要更新的节点或边,然后设置或删除属性来修改GQL数据。例如:

MATCH (d:Pet) WHERE d.name="Unique"
SET d.weight_kg=26
MATCH (e {lastname: 'Stare'})
REMOVE e.joined

通过识别节点,分离它们以删除关系,然后删除节点来删除GQL数据。例如:

/* 删除Avery和相关节点 */
MATCH (a {firstname: 'Avery'})-[b]->(c)
DETACH DELETE a, c

事务

GQL支持可序列化事务,并允许额外的实现定义的事务模式。事务通过显式或隐式的START TRANSACTION语句开始,并通过COMMIT或ROLLBACK语句终止。GQL实现也可能提供自动事务启动和提交。

无模式和固定模式图

GQL支持无模式图,对输入的数据没有限制,以及固定模式图,其中图可以通过图形类型创建,该图形类型指定了图中可以存在的节点和关系类型的限制。

无模式图将接受插入的任何数据。这允许快速启动,但将数据的控制权留给应用程序开发人员和/或用户。

GQL标准还支持创建图形类型的能力。图形类型是一个模板,通过完全指定可以包含在从特定图形类型创建的固定模式图中的节点和边类型来限制图的内容。基于图形类型创建的固定模式图只能包含图形类型中指定的节点类型和边类型。

管理员可以在GQL模式的目录层次结构内的目录中基于图形类型创建图。可以基于单个图形类型创建多个图。

以下图形类型定义了两个节点类型和两个边类型。

/* 示例改编自Alastair Green 2024-03-26 */
CREATE GRAPH TYPE /MyFolder/control/fraud_TYPE // DDL
(customer:Customer => {id::STRING, name::STRING}),
(account:Account => {no::STRING, acct_type::STRING }),
(customer)-[:HOLDS]->(account),
(account)-[:TRANSFER {amount::INTEGER}]->(account)

使用图形类型创建图将限制图的内容,以符合图形类型中描述的节点类型和边类型。

CREATE GRAPH /MyFolder/control/fraud /* 图名称为“fraud” */
TYPED /MyFolder/control/fraud_TYPE /* 图形类型为fraud_TYPE */

当数据修改语句完成时,内容必须符合图形类型指定的限制。如果数据不符合图形类型的限制,语句将引发异常,事务将回滚。

USE GRAPH fraud
INSERT // 数据操纵语言
(d:Customer {id: 'AB23', name: 'Doe'}),
(r:Customer {id: 'CH45', name: 'Reiss'}),
(a1:Account {no: '25673890', type: 'C'}),
(a2:Account {no: '05663981', type: 'C'}),
(d)-[:HOLDS]->(a1),
(r)-[:HOLDS]->(a2),
(a1)-[:TRANSFER {amount: 5000}]->(a2)

USE GRAPH fraud
MATCH // 数据查询语言
(c1:Customer)-[:HOLDS]->(a1:Account)
-[t:TRANSFER]->
(a2:Account)<-[:HOLDS]-(c2:Customer)
RETURN c1.name, a1.no, t.amount, c2.name, a2.no
/*
'Doe', '25673890', 5000, 'Reiss', '05663981'
1 行返回
*/

节点和边与表的比较

在SQL数据库中,数据作为表中的记录存储,每个表具有固定的结构。表之间的关系可以通过约束来强制执行,但编写查询的人(或程序)必须了解表之间的关系。

在属性图数据库中,抽象级别提高,允许将整个表集视为一个单元(“数据产品”)。

具有特定标签(或标签集)的节点大约相当于一个表。然而,MATCH查询可以访问具有特定特征的节点,而无需考虑标签。

边可以被插入以描述节点之间的关系。编写查询的人(或程序)可以查询关系,而无需知道存在哪些关系。

总结

本文档简要介绍了GQL数据库语言的功能。完整的GQL语言支持超出本文档范围的其他功能。GQL数据库语言设计为未来增长做准备,能够纳入目录中更多形式的数据,并准备返回非表格结果(例如图形)。

作者
Keith W. Hare, JTC 1/SC 32/WG 3 Database Languages
www.jtc1info.org
JTC1News@gmail.com
ISO-IEC/JTC 1/AG 1 Communications


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值