概述
线性查询语句
在GQL中,线性查询语句指的是按顺序执行的查询,即依次处理每条语句,没有分支或条件逻辑。结果以直接、线性的方式返回。
本例为一条线性查询,其中MATCH
、FILTER
和RETURN
语句按线性顺序处理:
MATCH (:User {_id: "U01"})-[:Follows]->(u:User)
FILTER u.city = "New York"
RETURN u
<linear query statement> ::=
[ <simple linear query statement> ] <result statement>
<simple linear query statement> ::= <simple query statement>...
<simple query statement> ::=
<match statement>
| <filter statement>
| <let statement>
| <for statement>
| <order by statement>
| <limit statement>
| <skip statement>
| <call statement>
<result statement> ::=
<return statement> [ <order by statement> ] [ <skip statement> ] [ <limit statement> ]
详情
- 线性查询语句以结果语句结束,可以在此前包含简单查询语句的线性组合。
复合查询语句
复合查询语句将一系列线性查询语句通过查询连接词结合在一起。
<composite query statement> ::=
<linear query statement> <query conjunction> <linear query statement>
[ { <query conjunction> <linear query statement> }... ]
<query conjunction> ::= <set operator> | "OTHERWISE"
<set operator> ::= "UNION" [ <set quantifier> ]
| "EXCEPT" [ <set quantifier> ]
| "INTERSECT" [ <set quantifier> ]
<set quantifier> ::= "DISTINCT" | "ALL"
详情
- 所有线性查询的
RETURN
语句中,列的数量、顺序和名称必须一致。 - 线性查询语句生成的绑定表会合并。
- 如果指定了集合运算符但未指定集合量词,则自动使用
DISTINCT
,对绑定表的记录执行去重。 - 可在复合查询语句中使用不同的查询连接词。
示例图集
以下示例根据该图集运行:
在空图集中运行以下语句创建示例图集:
INSERT (rowlock:User {_id:'U01', name:'rowlock'}),
(brainy:User {_id:'U02', name:'Brainy'}),
(purplechalk:User {_id:'U03', name:'purplechalk'}),
(mochaeach:User {_id:'U04', name:'mochaeach'}),
(lionbower:User {_id:'U05', name:'lionbower'}),
(c01:Club {_id:'C01'}),
(c02:Club {_id:'C02'}),
(rowlock)-[:Follows]->(brainy),
(brainy)-[:Follows]->(rowlock),
(mochaeach)-[:Follows]->(brainy),
(brainy)-[:Follows]->(purplechalk),
(purplechalk)-[:Follows]->(brainy),
(brainy)-[:Joins]->(c01),
(lionbower)-[:Joins]->(c01),
(mochaeach)-[:Joins]->(c02)
UNION
UNION
将两个或多个线性查询的结果合并为一个结果集,并返回查询结果的去重项。
MATCH (n:Club) RETURN n
UNION
MATCH (n) RETURN n
结果:n
_id | _uuid | schema | values |
---|---|---|---|
C02 | Sys-gen | Club | |
C01 | Sys-gen | Club | |
U05 | Sys-gen | User | {name: "lionbower"} |
U04 | Sys-gen | User | {name: "mochaeach"} |
U03 | Sys-gen | User | {name: "purplechalk"} |
U02 | Sys-gen | User | {name: "Brainy"} |
U01 | Sys-gen | User | {name: "rowlock"} |
UNION ALL
UNION ALL
将两个或多个线性查询的结果合并为一个结果集,并返回全部查询结果,不进行去重。
MATCH (n:Club) RETURN n
UNION ALL
MATCH (n) RETURN n
结果:n
_id | _uuid | schema | values |
---|---|---|---|
C02 | Sys-gen | Club | |
C01 | Sys-gen | Club | |
U05 | Sys-gen | User | {name: "lionbower"} |
U04 | Sys-gen | User | {name: "mochaeach"} |
U03 | Sys-gen | User | {name: "purplechalk"} |
U02 | Sys-gen | User | {name: "Brainy"} |
U01 | Sys-gen | User | {name: "rowlock"} |
C02 | Sys-gen | Club | |
C01 | Sys-gen | Club |
EXCEPT
EXCEPT
返回第一个查询中独有的、且在后续查询中不存在的去重结果集。
MATCH ({_id: "U02"})-(n) RETURN n
EXCEPT
MATCH ({_id: "U05"})-(n) RETURN n
结果:n
_id | _uuid | schema | values |
---|---|---|---|
U04 | Sys-gen | User | {name: "mochaeach"} |
U03 | Sys-gen | User | {name: "purplechalk"} |
U01 | Sys-gen | User | {name: "rowlock"} |
EXCEPT ALL
EXCEPT
返回第一个查询中独有的、且在后续查询中不存在的结果集,不进行去重。
MATCH ({_id: "U02"})-(n) RETURN n
EXCEPT ALL
MATCH ({_id: "U05"})-(n) RETURN n
结果:n
_id | _uuid | schema | values |
---|---|---|---|
U01 | Sys-gen | User | {name: "rowlock"} |
U03 | Sys-gen | User | {name: "purplechalk"} |
U04 | Sys-gen | User | {name: "mochaeach"} |
U03 | Sys-gen | User | {name: "purplechalk"} |
U01 | Sys-gen | User | {name: "rowlock"} |
INTERSECT
INTERSECT
返回所有线性查询共有的去重结果集;未在每个查询中都出现的行会被过滤掉。
MATCH ({_id: "U01"})-(u:User) RETURN u
INTERSECT
MATCH ({_id: "U03"})-(u:User) RETURN u
结果:u
_id | _uuid | schema | values |
---|---|---|---|
U02 | Sys-gen | User | {name: "Brainy"} |
INTERSECT ALL
INTERSECT ALL
返回所有线性查询共有的结果集,不进行去重;未在每个查询中都出现的行会被过滤掉。
MATCH ({_id: "U01"})-(u:User) RETURN u
INTERSECT ALL
MATCH ({_id: "U03"})-(u:User) RETURN u
结果:u
_id | _uuid | schema | values |
---|---|---|---|
U02 | Sys-gen | User | {name: "Brainy"} |
U02 | Sys-gen | User | {name: "Brainy"} |
OTHERWISE
OTHERWISE
返回第一个查询的结果集(如果该查询有结果生成)。如果第一个查询没有结果,则返回第二个查询的结果,以此类推,直至有非空结果集生成。
MATCH ({_id: "U04"})<-[]-(u:User) RETURN u
OTHERWISE
MATCH ({_id: "U02"})<-[]-(u:User) RETURN u
结果:u
_id | _uuid | schema | values |
---|---|---|---|
U01 | Sys-gen | User | {name: "rowlock"} |
U03 | Sys-gen | User | {name: "purplechalk"} |
U04 | Sys-gen | User | {name: "mochaeach"} |
下例中,第一个线性查询的结果集包含一个null
值,由于使用了OPTIONAL
,所以不是空集:
只要第一个查询结果有行存在,OTHERWISE
就会返回其结果集,带有null
值的行也包括其中。
OPTIONAL MATCH ({_id: "U04"})<-[]-(u:User) RETURN u
OTHERWISE
MATCH ({_id: "U02"})<-[]-(u:User) RETURN u
结果:
u |
---|
null |
重命名列
使用关键词AS
重命名列,以确保线性查询的绑定表可以合并。
MATCH ({_id: "C01"})<-(u) RETURN u.name, 1 AS Club
UNION
MATCH ({_id: "C02"})<-(u) RETURN u.name, 2 AS Club
结果:
u.name | Club |
---|---|
Brainy | 1 |
lionbower | 1 |
mochaeach | 2 |
使用不同查询连接词
MATCH (n:Club) RETURN n._id
OTHERWISE
MATCH (n) RETURN n._id
UNION ALL
MATCH (n)-[]->(:Club) RETURN n._id
结果:
n._id |
---|
C02 |
C02 |
U05 |
U04 |
U02 |