概述
复合查询将多条线性查询通过查询连接词(UNION
、EXCEPT
、INTERSECT
和OTHERWISE
)结合在一起。
<composite query statement> ::=
<linear query statement> <query conjunction> <linear query statement>
[ { <query conjunction> <linear query statement> }... ]
<query conjunction> ::=
"UNION" [ "DISTINCT" | "ALL" ]
| "EXCEPT" [ "DISTINCT" | "ALL" ]
| "INTERSECT" [ "DISTINCT" | "ALL" ]
| "OTHERWISE"
详情
- 所有
<linear query statement>
产生的查询结果会合并。因此,所有<linear query statement>
中的RETURN
语句的返回项数量、顺序和名称必须一致。 - 如果指定运算符
DISTINCT
,所有返回项中的重复记录会被舍弃;如果指定ALL
,则保留所有记录,不进行去重。没有明确指定DISTINCT
或ALL
时,默认应用DISTINCT
。 - 一个复合查询中可使用不同的查询连接词。
示例图

CREATE GRAPH myGraph {
NODE User ({name string}),
NODE Club (),
EDGE Follows ()-[{}]->(),
EDGE Joins ()-[{}]->()
} PARTITION BY HASH(Crc32) SHARDS [1]
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
合并两个或多个线性查询的结果集,不进行去重。
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
返回一个不去重的结果集,该结果集包含所有线性查询结果共有的记录,没有在每个查询结果中都出现的记录会被舍弃。
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"} |
本例中,由于使用了OPTIONAL
,第一个线性查询返回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 |
---|
C01 |
C02 |
U05 |
U04 |
U02 |
对多个返回项进行去重
当RETURN
语句包含多个返回项时,DISTINCT
对所有返回项的组合记录进行去重。
MATCH (u1 {name: "rowlock"})-(u2:User) RETURN u1.name, u2.name
UNION DISTINCT
MATCH (u1 {name: "purplechalk"})-(u2:User) RETURN u1.name, u2.name
结果:
u1.name | u2.name |
---|---|
rowlock | Brainy |
purplechalk | Brainy |
可比较以下UNION ALL
的返回结果:
MATCH (u1 {name: "rowlock"})-(u2:User) RETURN u1.name, u2.name
UNION ALL
MATCH (u1 {name: "purplechalk"})-(u2:User) RETURN u1.name, u2.name
结果:
u1.name | u2.name |
---|---|
rowlock | Brainy |
rowlock | Brainy |
purplechalk | Brainy |
purplechalk | Brainy |