GQL 子句

使用 “版本 ”下拉列表切换服务。 了解有关导航的详细信息
适用于: ✅ Azure 数据资源管理器

本文列出了 GQL(图形查询语言)中支持的子句。

这些示例使用“创建图形”中的电影图G()并设置图形引用Person节点(、NameBorn节点(MovieTitleDescription、)YearACTED_IN / DIRECTED边缘()。Role

WHERE

WHERE 使用布尔表达式筛选。 将其放置在节点内、边缘内或模式之后。 内联 {property: value} 是相等性的速记。

按属性进行筛选

在模式后使用WHERE,将元素属性与运算符(如=<>>>=<<=)进行比较。 将条件与括号AND组合在一起OR,并NOT将它们分组。

match (p:Person)-[:ACTED_IN]->(m:Movie)
where (p.Name = 'Tom' or p.Name = 'Ron') and m.Title <> 'T1' and p.Born > 1901
return p.Name as name, m.Title as title
名字 标题
卢宁 T3
卢宁 T2

用 NOT 否定条件

NOT 反转布尔条件的结果。 将其编写为前缀, NOT (condition)并将其与 ANDOR。 许多谓词也接受内联NOT,如NOT STARTS WITHNOT ENDS WITHNOT CONTAINSIS NOT NULL

match (p:Person)
where not (p.Born < 1960)
return p.Name as name
名字
朱莉娅

以下两个查询是等效的。 第一个使用前缀 NOT;第二个使用内联 NOT CONTAINS 谓词:

match (p:Person)
where not (p.Name contains 'n')
return p.Name as name
名字
卢宁
朱莉娅
match (p:Person)
where p.Name not contains 'n'
return p.Name
名字
卢宁
朱莉娅

内联属性筛选器

元素模式内的内联 {property: value} 是该属性的相等性测试的速记。 以下两个查询等效:

match (p:Person {Name: 'Tom'})
return p.Name as name, p.Born as born
名字 born
卢宁 1956
match (p:Person)
where p.Name = 'Tom'
return p.Name as name, p.Born as born
名字 born
卢宁 1956

内联筛选器适用于边缘和节点:

match (p:Person)-[:ACTED_IN {Role: 'Role2'}]->(m:Movie)
return p.Name as name, m.Title as title
名字 标题
Kevin T1

多个内联条件

列出一个内联筛选器中的多个属性,以要求所有这些属性;对与 AND. 此模式仅Person匹配两者都Name'Tom'Born以下1956节点的节点:

match (p:Person {Name: 'Tom', Born: 1956})
return p.Name as name, p.Born as born
名字 born
卢宁 1956

将内联筛选器应用于同一模式中的多个元素,以一次性约束每个节点和边缘:

match (p:Person {Name: 'Kevin'})-[:ACTED_IN {Role: 'Role2'}]->(m:Movie {Title: 'T1'})
return p.Name as name, m.Title as title
名字 标题
Kevin T1

内联筛选器并 WHERE 自由组合:使用内联 {...} 进行相等检查,以及 WHERE 用于其他所有内容,例如范围或 OR

match (p:Person {Name: 'Tom'})-[:ACTED_IN]->(m:Movie)
where m.Year >= 1990
return p.Name as name, m.Title as title
名字 标题
卢宁 T1
卢宁 T2
卢宁 T3

在节点或边缘内:

match (p:Person)-[e where 'DIRECTED' in labels(e)]->(m:Movie where m.Title <> 'T1')
return p.Name as name, m.Title as title
名字 标题
卢宁 T2

IN谓词测试值是否为列表中的项之一:

match (p:Person)
where p.Name in ['Tom', 'Kevin']
return p.Name as name
名字
卢宁
Kevin

若要比较实体,请使用 element_id(n) 或属性比较(n.Name <> m.Name); 不支持直接实体相等性。

RETURN

RETURN 形状输出。 Project属性,重命名后AS,使用 返回所有绑定变量*,并使用重复数据删除DISTINCT

match (p:Person)-[:ACTED_IN]->(m:Movie)
return m.Title as Title, p.Name as Name
Title Name
T3 卢宁
T2 卢宁
T1 卢宁
T1 Kevin

使用 : 返回每个绑定变量 *

match (p:Person)-[:ACTED_IN]->(m:Movie where m.Description starts with 'W')
return *
p m
{“Name”: “Tom”, .. , , .. ,“Description”: “War film”,“Year”: 2020}

独特

DISTINCT 从 . RETURN中删除重复行。 它适用于标量值;若要删除重复数据实体(节点、边缘、路径),请使用一些对象标识符或 函数,或者将整个实体转换为字符串,例如,使用 或与 < a0/> 一起使用。

重复数据删除投影行:

match (p:Person)-[:ACTED_IN]->(m:Movie)
return distinct p.Name as name
名字
卢宁
Kevin

DISTINCT 还可以在聚合内部工作,仅对非重复值进行聚合:

match (p:Person)-[:ACTED_IN]->(m:Movie)
return m.Title as Title, count(p.Name) as Actors, collect_list(distinct p.Name) as Names
Title Actors Names
T3 1 [“Tom”]
T2 1 [“Tom”]
T1 2 [“Tom”,“Kevin”]

排序依据

ORDER BY 对行进行排序。 添加 ASC (默认值)或 DESC 每列。 它可以位于模式之后 RETURN 或直接之后 MATCH

match (p:Person) return p.Name as name, p.Born as born order by p.Born desc
名字 born
朱莉娅 1967
Kevin 1958
卢宁 1956
罗恩 1954

按多个键排序,每个键都有其自己的方向:

match (p:Person)-[:ACTED_IN]->(m:Movie)
return p.Name as Name, m.Title as Title
order by Name desc, Title asc
Name Title
卢宁 T1
卢宁 T3
卢宁 T2
Kevin T1

注意

如果查询具有后续ORDER BY语句或联接语句,则直接在之后MATCH使用NEXT可能没有效果。

限制

LIMIT 限制行数。 放置在它绑定最终输出之后 RETURN ;直接放置在 MATCH 它绑定匹配行的模式之后,然后投影和聚合,这可能会更改结果。

match (p:Person) return p.Name as name order by p.Born asc limit 2
名字
罗恩
卢宁
match (p:Person) order by p.Born asc limit 2 return p.Name as name
名字
罗恩
卢宁

抵消

OFFSET 在返回其余行之前跳过多个行; SKIP 是同义词。 该值必须是正整数。

match (m:Movie) return m.Title as title order by m.Title offset 1 limit 1
标题
T3

喜欢 LIMITOFFSET 也可以直接坐在模式之后 MATCH ,之前 RETURN。 在该位置中,它在投影之前跳过匹配的行:

match (m:Movie) order by m.Title offset 1 return m.Title as title
标题
T3

FOR 循环访问列表的项,为每个项生成一行。 两个可选子句公开项的位置: WITH OFFSET 绑定从零开始的索引,并 WITH ORDINALITY 绑定基于一个索引。

match () limit 1
for i in [5, 7]
return i
变量 i
5
7
match () limit 1
for c in ['a', 'b'] with offset idx
return c, idx
c idx
a 0
b 1
match () limit 1
for c in ['a', 'b'] with ordinality idx
return c, idx
c idx
a 1
b 2

LET

LET 将名称绑定到值,以便稍后可以在查询中重复使用它。 用逗号分隔多个绑定;稍后的绑定可以引用以前的绑定。 因为每个查询都以第一个语句开头 MATCHLET 所以不能是第一个语句, 将其放在一个 MATCH (和之后) 之后 WHERE

绑定每行值,然后返回它:

match (p:Person)
where p.Name starts with 'K'
let BirthYear = p.Born
return p.Name as Name, BirthYear
Name BirthYear
Kevin 1958

绑定常量并将其用于筛选:

match (m:Movie)
let threshold = 2000
filter m.Year >= threshold
return m.Title as title
Title
T2
T3

定义多个值,其中一个值基于另一个值:

match (p:Person)
let a = 1
let b = a + 3
return p.Name as name, a, b
名字 a b
卢宁 1 4
Kevin 1 4
罗恩 1 4
朱莉娅 1 4

下一步

NEXT 将语句链接到线性管道。 由一个语句生成的行将成为下一个语句的输入,类似于将表从一个步骤传递到另一个步骤。 只有前面 RETURNRETURN * 或用显式命名 AS)投影的列对以下语句可见;重命名将传递新名称。 之后 NEXT,可以启动另一个 MATCH、一个 FILTER或一个 RETURN。 可以多次链接 NEXT

Project列,然后筛选并调整它们:

match (p:Person)-[:ACTED_IN]->(m:Movie)
return p.Name as Actor, m.Title as Title, m.Year as `Year`
next
filter `Year` = 2020
return Actor, Title
Actor Title
卢宁 T3

向前传递路径,然后对其进行计算:

match p = (n0:Person)-[:DIRECTED]->(:Movie {Title: 'T1'})
return *
next
return p, path_length(p) as Hops
order by Hops

将节点变量传递到以后 MATCH

match (p:Person {Name: 'Tom'})
return p
next
match (p)-[:ACTED_IN]->(m:Movie)
return m.Title

聚合前面语句的结果:

match (p:Person)-[:ACTED_IN]->(m:Movie)
return p.Name as Actor
next
return count(*) as Rows

过滤器

FILTER 是一个独立语句,它只保留满足条件的行,就像在线性查询中编写为自己的步骤一样 WHERE 。 它通常用于 NEXT 筛选上一语句生成的行,还可以遵循模式 MATCH

Tip

每当条件可以针对匹配的模式表示时,首选 WHERE 于独立 FILTER模式。 WHEREMATCH 模式匹配一起并评估为模式匹配的一部分,因此整个查询更高效地运行。 FILTER仅当需要筛选后续阶段生成的值(例如之后或聚合)NEXT时使用。

按以下方式 NEXT筛选传递的行:

match (p:Person)-[:ACTED_IN]->(m:Movie)
return p.Name as Actor, m.Year as Year
next
filter Year >= 2000
return Actor, Year

注意

变量 Year 被转义,因为年份是保留关键字。 若要区分 GQL 语法和用户变量,可以转义用户变量。 或者,添加前缀或后缀 _

直接在模式后 MATCH 进行筛选:

match (p:Person)
filter p.Born = 1956
return p.Name as name
名字
卢宁

UNION

UNION 合并两个或多个查询的结果;用于 UNION ALL 保留重复项。 每个查询必须返回匹配的列,并且每个 UNION 腿必须以 RETURN 语句结尾。

match (p:Person) return p.Name as name
union
match (m:Movie) return m.Title as name
名字
卢宁
Kevin
罗恩
朱莉娅
T1
T2
T3