GQL 是什么
2024 年 4 月,ISO/IEC 39075:2024 Information Technology – Database languages – GQL 标准发布。这一新数据库语言标准由国际标准委员会 ISO/IEC JTC1 SC32 WG3 数据库语言团队开发。SC32 WG3 是一个国际委员会,同时负责开发和强化 SQL 数据库语言。SC32 WG3 的参与者(个别专家)由世界各国的标准流程指派。GQL 吸收了众多现有商业图查询语言的特性,包括由 Neo4j Inc. 开发的 openCypher、Tigergraph Inc. 的 GSQL、Oracle Inc. 的 PGQL,以及 LDBC 的研究语言 G-Core。GQL 是 Graph Query Language(图查询语言)的缩写,这个名字主要是为了体现 GQL 与 SQL 数据库语言是并列的。
近几年,属性图数据库在大数据、NoSQL 技术领域变得越发重要。属性图数据的一大特点是,在数据中会创建关系,用户可直接编写声明式查询而无需指定关系。与将数据结构化为表的关系型模型不同,属性图模型在数据库内将数据结构化为图。这让基于模式的分析成为可能,并且可用极小的成本添加新类型数据。现实生活中,关于图的应用从数字孪生(Digital Twin)到反洗钱(Anti-Money Laundering),再到药物发现(Drug Discovery)、供应链分析(Supply Chain),以及为生成式人工智能(GenAI)提供的知识图谱支持,等等。这种新模型与语言的结合前景,以及在数据库领域内的显著且持续增长的用量,很大程度上是 SQL 的新 ISO 兄弟语言 GQL 的基础。
原生支持 GQL 的分布式图数据库 NebulaGraph
图被称为说明两个事物之间关系的图表。因此,图数据库可以被认为是理解数据之间关系的数据库。图数据库不同于大多数人熟悉的传统关系数据库管理系统(RDBMS)。这些数据库将数据存储在列和行的表中,彼此之间几乎没有关系。图数据库旨在揭示许多大数据集之间的重要关系。换句话说,它可以将多个数据集之间的点连接起来,否则这些点可能会被孤立地闲置。图数据库已经广泛用于此类目的。
NebulaGraph 是一款开源、分布式、易扩展的原生图数据库,能够承载数千亿个顶点和数万亿条边的图,并以毫秒级延迟处理查询。在多个实际生产环境中,数据挖掘和技术性能已被证明比竞争对手的图数据库性能高出数倍。NebulaGraph 的目标是释放指数级增长的连接数据的力量,这是任何其他解决方案都无法做到的。
NebulaGraph Enterprise v5.0 是第一个原生支持 GQL 的分布式图数据库。与仅仅兼容或适配 GQL 的系统不同,NebulaGraph Enterprise v5.0 经过重新设计,在整体架构层面支持 GQL。
NebulaGraph 安装
另附章节,或参阅官方文档,这里不做展开。
NebulaGraph 查询语言 (nGQL)
GQL 目前仅适用于企业版,开源版本未来或将支持 GQL,下面先来介绍一下 nGQL 语言。
nGQL 是 NebulaGraph 的一种声明式图查询语言。它允许富有表现力和高效的图形模式。nGQL 专为开发人员和运维专业人员设计。nGQL 是一种类似 SQL 的查询语言,因此易于学习。nGQL 是一个正在进行中的项目。新功能和优化正在稳步推进。语法和实现之间可能存在差异。
nGQL 支持:图遍历、模式匹配、聚合、修改图、访问控制、聚合查询、索引、大部分 openCypher 9 图查询语法等特性。
原生 nGQL 是由 NebulaGraph 自行创造和实现的图查询语言。openCypher 是由 openCypher Implementers Group 组织所开源和维护的图查询语言,最新版本为 openCypher 9。NebulaGraph 3.0 及以上版本部分兼容 openCypher 9。
NebulaGraph 查询语言 nGQL 参照以下标准设计:
- (Draft) ISO/IEC JTC1 N14279 SC 32 - Database_Languages - GQL
- (Draft) ISO/IEC JTC1 SC32 N3228 - SQL_Property_Graph_Queries - SQLPGQ
- OpenCypher 9
nGQL 使用示例
NebulaGraph Console 是 NebulaGraph 的原生命令行客户端,用于连接 NebulaGraph 集群并执行查询,同时支持管理参数、导出命令的执行结果、导入测试数据集等功能。
运行二进制文件 nebula-console
连接 NebulaGraph:
[root@rl9 shawnyan]# ./nebula-console-linux-amd64-v3.8.0
Notice: Defaulting to localhost (127.0.0.1) with port 9669 using credentials (username: root, password: nebula).
Welcome!
(root@nebula) [(none)]>
创建图空间,选择已创建的图空间。
(root@nebula) [(none)]> CREATE SPACE IF NOT EXISTS my_space_1 (vid_type=FIXED_STRING(30));
Execution succeeded (time spent 2.003ms/2.463617ms)
(root@nebula) [(none)]> use my_space_1
Execution succeeded (time spent 779µs/1.047711ms)
创建 Tag 和 Edge。
(root@nebula) [my_space_1]> CREATE TAG player(name string, age int);
Execution succeeded (time spent 948µs/1.243409ms)
(root@nebula) [my_space_1]> CREATE TAG team(name string);
Execution succeeded (time spent 1.799ms/2.312494ms)
(root@nebula) [my_space_1]> CREATE EDGE follow(degree int);
Execution succeeded (time spent 1.119ms/1.446161ms)
(root@nebula) [my_space_1]> CREATE EDGE serve(start_year int, end_year int);
Execution succeeded (time spent 1.228ms/1.564224ms)
插入数据,插入代表球员和球队的点。
(root@nebula) [my_space_1]> INSERT VERTEX player(name, age) VALUES "player100":("Tim Duncan", 42);
Execution succeeded (time spent 1.704ms/2.077053ms)
(root@nebula) [my_space_1]> INSERT VERTEX player(name, age) VALUES "player101":("Tony Parker", 36);
Execution succeeded (time spent 1.858ms/2.270056ms)
(root@nebula) [my_space_1]> INSERT VERTEX player(name, age) VALUES "player102":("LaMarcus Aldridge", 33);
Execution succeeded (time spent 1.414ms/1.754488ms)
(root@nebula) [my_space_1]> INSERT VERTEX team(name) VALUES "team203":("Trail Blazers"), "team204":("Spurs");
Execution succeeded (time spent 920µs/1.25433ms)
插入代表球员和球队之间关系的边。
(root@nebula) [my_space_1]> INSERT EDGE follow(degree) VALUES "player101" -> "player100":(95);
Execution succeeded (time spent 1.246ms/1.553402ms)
(root@nebula) [my_space_1]> INSERT EDGE follow(degree) VALUES "player101" -> "player102":(90);
Execution succeeded (time spent 10.605ms/11.110759ms)
(root@nebula) [my_space_1]> INSERT EDGE follow(degree) VALUES "player102" -> "player100":(75);
Execution succeeded (time spent 1.569ms/1.99534ms)
(root@nebula) [my_space_1]> INSERT EDGE serve(start_year, end_year) VALUES "player101" -> "team204":(1999, 2018),"player102" -> "team203":(2006, 2015);
Execution succeeded (time spent 1.074ms/1.348952ms)
使用 Studio 连接 NebulaGraph
NebulaGraph Studio(简称 Studio)是一款可以通过 Web 访问的开源图数据库可视化工具,搭配 NebulaGraph 内核使用,提供构图、数据导入、编写 nGQL 查询等一站式服务。
在成功启动 Studio 后,用户需要配置连接 NebulaGraph 。
登陆 Studio 后,用户可以在 Studio 上可视化地查看 Schema。
参考资料
- Graph theory:https://en.wikipedia.org/wiki/Graph_theory
- Graph Pattern Matching in GQL and SQL/PGQ:[2112.06217] Graph Pattern Matching in GQL and SQL/PGQ
- ISO/IEC 9075-16:2023 Information technology – Database languages SQL – Part 16: Property Graph Queries (SQL/PGQ):https://www.iso.org/standard/79473.html
- ISO/IEC 39075 Database Language GQL: https://jtc1info.org/slug/gql-database-language/
- GQL Standard: https://www.gqlstandards.org/
- Nebula Graph: An open source distributed graph database: http://arxiv.org/pdf/2206.07278