作者介绍
王杰,NebulaGraph committer, 专注图数据库查询优化。

背景
基于 Cypher的进化:
GQL 如何增强图查询
1
增强的图模式匹配
强大的标签匹配语法
GQL 拥有强大的标签匹配功能。
通过引入 &
(与)、|
(或)和 !
(非)等逻辑运算符,让复杂的图数据查询变得简单直观。
在 Cypher 中,一个典型的查询可能是这样的:
MATCH (n:Person)WHERE n.age > 30RETURN n
MATCH (n:Manager & FullTime | !Intern)WHERE n.age > 30RETURN n.name AS managerName, n.department AS dept
这个 GQL 查询查找既是 Manager, 是 FullTime 的人,或不是 Intern, 并且年龄大于 3 的人。
类正则表达式的变长路径匹配语法
-[e]->{1,3}、
-[e]->+、
-[e]->*和
-[e]->?, 比 Cypher 更强大。
路径限制器
路径选择器
2
现代化的变量定义
局部变量定义
TABLE userActivity = {MATCH (u:User)-[a:ACTION]->()RETURN u.id AS userId, a.timestamp AS actionTime, a.type AS actionType}VALUE activeUsers = VALUE {FOR i IN userActivityWHERE i.actionTime > datetime('2024-01-01')RETURN DISTINCT i.userId}VALUE uniqueActionTypes = VALUE {FOR i IN userActivityWHERE i.userId IN activeUsersRETURN count(DISTINCT i.actionType) AS uniqueActionTypes}
userActivity负责收集用户行为的基本数据集,然后这些数据被用来识别活跃用户并统计行为类型。
LET 语句
LET语句通过向当前输出表添加新列来定义变量。
LET是非阻塞的,允许在不影响现有变量传递的情况下定义新变量。这与 Cypher 中的 WITH 子句不同,后者要求在 WITH 中显式指定所有现有变量。
MATCH (v)-[e]->(v2)WITH v, e, v2, 1 AS a
或者使用 WITH *
保留所有变量:
MATCH (v)-[e]->(v2)WITH *, 1 AS a
在 GQL 中,LET
简化了这一过程:
MATCH (v)-[e]->(v2)LET a = 1
这里,v
、e
和 v2
仍然可访问,并且 a
被无缝添加。相较于 Cypher 的 WITH
, GQL的 LET
大大简化了新变量的定义。
3
复杂嵌套查询
CALL语句允许将一组语句封装到一个子查询块中,作为一个整体被外部语句引用。这在需要对多个查询的组合结果进行操作时特别有用。
CALL {MATCH (v:Person) RETURN v.name AS nameUNIONMATCH (v:City) RETURN v.name AS name}ORDER BY name
GQL 与 SQL/PGQ 的比较
SQL/PGQ 基于 SQL 扩展了其图查询能力,它与 GQL 共享只读图匹配语法。不过,与 SQL/PGQ 相比,GQL 提供了一套完整的读写语法,能够更好地满足图数据库的各种操作需求。
另外,尽管 SQL 功能强大,但其语法设计存在一些著名的问题。比如,SQL 的子句顺序不直观且难以组合,用户常需使用变通方法来实现复杂需求。谷歌最近发布了一篇文章《SQL Has Problems. We Can Fix Them: Pipe Syntax In SQL》,指出了 SQL 的这些语法设计上的问题,并提出了一种特殊的管道操作符,旨在让子句更加线性和可组合,从而提升 SQL 的灵活性和直观性。
相比之下,GQL 在设计上则显得更为先进和高效。GQL 的语法天生就是线性和可组合的。
它具有一系列的功能正交的语句,如用于图模式匹配的 MATCH
语句、用于结果过滤的 FILTER
语句、用于展开列表的 FOR
语句、用于变量定义的 LET
语句和用于复杂嵌套查询的 CALL
语句等等。
另外,GQL 还拥有 INSERT 、SET 等 DML 语句,它们可以与 DQL 语句优雅地、线性组合在一起。
例如,你可以匹配节点,然后在它们之间插入一条边:
MATCH (a:player{id:1, name:"Tim"}), (b:player{id:2, name:"Jerry"})INSERT (a)-[:follow{followness:90}]->(b)
以下两个图直观地展示了 SQL 和 GQL 语法的区别。

图 1: SQL 的子句结构

图 2: GQL 的线性语句组合
GQL 的前景
✦
如果你觉得 NebulaGraph能帮到你,或者你只是单纯支持开源精神,可以在 GitHub 上为 NebulaGraph 点个 Star!每一个 Star 都是对我们的支持和鼓励✨
https://github.com/vesoft-inc/nebula
✦
✦

扫码添加
可爱星云
技术交流
资料分享
NebulaGraph 用户案例集
案例推荐:
知识图谱案例:
苏宁基于 NebulaGraph 构建知识图谱的大规模告警收敛和根因定位实践
金融风控案例:
图数据库 Nebula Graph 在 BOSS 直聘的应用
360数科:基于 NebulaGraph 打造智能化的金融反欺诈系统
NebulaGraph 助力金蝶征信产业图谱深挖企业关系链,实现银行批量获客
智能运维案例:
58 同城基于 NebulaGraph 一键部署运维架构的实践
苏宁基于 NebulaGraph 构建知识图谱的大规模告警收敛和根因定位实践
大数据/图平台:
OPPO:通过 NebulaGraph 建设全局图数据库平台
数据治理:
微众银行:利用 NebulaGraph 进行全局数据血缘治理的实践
安全:




