使用 “版本 ”下拉列表切换服务。 了解有关导航的详细信息。
适用于: ✅ Azure 数据资源管理器
本文列出了 GQL(图形查询语言)中支持的子句。
这些示例使用“创建图形”中的电影图G()并设置图形引用:Person节点(、NameBorn节点(MovieTitle、Description、)Year和ACTED_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)并将其与 AND 和 OR。 许多谓词也接受内联NOT,如NOT STARTS WITHNOT ENDS WITH,NOT CONTAINS和IS 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中删除重复行。 它适用于标量值;若要删除重复数据实体(节点、边缘、路径),请使用一些对象标识符或
重复数据删除投影行:
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 |
喜欢 LIMIT, OFFSET 也可以直接坐在模式之后 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 将名称绑定到值,以便稍后可以在查询中重复使用它。 用逗号分隔多个绑定;稍后的绑定可以引用以前的绑定。 因为每个查询都以第一个语句开头 MATCH, LET 所以不能是第一个语句, 将其放在一个 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 将语句链接到线性管道。 由一个语句生成的行将成为下一个语句的输入,类似于将表从一个步骤传递到另一个步骤。 只有前面 RETURN ( RETURN * 或用显式命名 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模式。
WHERE 与 MATCH 模式匹配一起并评估为模式匹配的一部分,因此整个查询更高效地运行。
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 |