GQL,即图查询语言(Graph Query Language),是图数据库的标准化查询语言,相当于SQL在关系型数据库中的作用。GQL标准的首个版本于2024年4月由ISO/IEC正式发布,标志着GQL成为自1987年SQL推出以来的第二个数据库标准语言。
本文为您介绍GQL相关基础知识。如需查看完整使用指南,请参阅GQL。
GQL主要语法
点模式
点模式用于匹配图中的点,以一对圆括号()
表示,括号内可指定点的标签和属性。
匹配任意点:
()
匹配User
点:
(:User)
匹配User
点,其中name
为Areith
,age
为32:
(:User {name: "Areith", age: 32})
匹配所有name
为Areith
的点:
({name: "Areith"})
边模式
边模式用于匹配图中的边,通常由一对方括号[]
表示,括号内可指定边的标签和属性。边模式还需说明边的方向。
匹配任意边:
-[]-
匹配所有右向边rate
:
-[:rate]->
匹配所有左向边rate
,其中score
属性值为8
:
<-[:rate {score: 8}]-
路径模式
路径模式用于匹配图中的路径,由点模式和边模式组合而成。路径模式以点模式开始,以点模式结束,其间点模式和边模式交替出现。
匹配以Areith
开始,通过出边rate
达到终点Book
的路径:
(:User {name: "Areith"})-[:rate]->(:Book)
匹配符合条件的路径,描述Areith
和Kavi
之间,经过Book
点的普通连接:
(:User {name: "Areith"})-[]-(:Book)-[]-(:User {name: "Kavi"})
标签表达式
标签表达式以冒号:
开始,用于在点模式或边模式中指定点标签或边标签。
属性规范
属性的键值对包裹在点模式或边模式的一对花括号{}
中。使用联合等式即可根据具体属性值过滤点或边。
变量
变量是一种标识符,用来代表从数据库中检索到的或手动定义的数据,允许在整个查询过程中对其进行引用。
定义变量p
来代表完整路径:
p = (:User {name: "Areith"})-[:rate]->(:Book)
定义变量books
来代表Areith
曾评分过的书:
(:User {name: "Areith"})-[:rate]->(books:Book)
定义变量r
来代表与Areith
连接的rate
边,并在WHERE
从句中使用该变量过滤分数大于8
的rate
边:
(:User {name: "Areith"})-[r:rate WHERE r.score > 8]-(:Book)
示例图集
以下示例基于本图运行:
从数据库读取数据
可从图中读取到的数据包括点、边和路径。想要获取这些数据,需在MATCH
语句中写出对应的模式,并使用RETURN
语句指定输出结果。
点
本条查询获取Person
点,其中gender
为male
:
MATCH (p:Person {gender: "male"})
RETURN p
结果:p
_id | _uuid | schema | values |
---|---|---|---|
P1 | Sys-gen | Person | {name: "Kavi Moore", gender: "male"} |
P2 | Sys-gen | Person | {name: "Sira Lox", gender: "male"} |
边
本条查询获取WorkIn
边,其中endOn
为null
:
MATCH -[e:WorkIn WHERE e.endOn IS NULL]->
RETURN e
结果:e
_uuid |
_from |
_to |
_from_uuid |
_to_uuid |
schema |
values |
---|---|---|---|---|---|---|
Sys-gen | P1 | CO1 | UUID of P1 | UUID of CO1 | WorkIn | {StartOn: "2023-05-03 00:00:00", endOn: null} |
路径
本条查询获取的每条路径都表明某人当前在InnoVex
公司工作,并返回路径和此人的姓名:
MATCH p = (n:Person)-[e:WorkIn WHERE e.endOn IS NULL]->(:Company {name: "InnoVex"})
RETURN p, n.name
结果:
p | n.name |
---|---|
(:Person {_id: "P1", name: "Kavi Moore", gender: "male"})-[:WorksIn {startOn: "2023-05-03 00:00:00", endOn: null}]->(:Company {_id: "C01", name: "InnoVex"}) | Kavi Moore |
向数据库写入数据
您可通过插入、更新和删除数据库中的点边数据向数据库写入数据。
插入
INSERT
语句用来在数据库中创建新的点和边。
本条查询插入一个Person
点,设定其_id
为P4
,name
为Tiva Jorn
:
INSERT (:Person {_id: "P4", name: "Tiva Jorn"})
本条查询插入一条WorkIn
边,由点P4
指向点CO1
,startOn
设定为2025-3-1
:
MATCH (innovex {_id: "CO1"}), (tiva {_id: "P4"})
INSERT (tiva)-[:WorkIn {startOn: "2025-3-1"}]->(innovex)
更新
SET
语句用来更新数据库中已有点边数据的属性信息。更新前,需先使用MATCH
语句获取待更新的店或边。
本条查询更新点P4
的信息,将其gender
设置为female
:
MATCH (tiva {_id: "P4"})
SET tiva.gender = "female"
本条查询更新由点P4
指向点C01
的边WorkIn
的信息,将其startOn
设置为2025-4-1
:
MATCH ({_id: "P4"})-[e:WorkIn]->({_id: "CO1"})
SET e.startOn = "2025-4-1"
删除
DELETE
语句用来删除数据库中的点边数据。删除前,需先使用MATCH
语句获取待删除的点或边。默认情况下,无法删除与边相连的点。
本条查询删除由点P4
指向点C01
的边WorkIn
。
MATCH ({_id: "P4"})-[e:WorkIn]->({_id: "CO1"})
DELETE e
本条查询删除点P4
:
MATCH (n {_id: "P4"})
DELETE n