概述
复合查询通过以下连接词组合多个线性查询的结果集:
查询连接词 |
描述 |
|---|---|
UNION |
返回所有结果集中不重复的记录。 |
UNION ALL |
返回所有结果集中的所有记录(包括重复项)。 |
EXCEPT |
返回第一个结果集中不重复且其他结果集没有的记录。 |
EXCEPT ALL |
返回第一个结果集中所有其他结果集没有的记录(包括重复项)。 |
INTERSECT |
返回所有结果集中不重复的共有记录。 |
INTERSECT ALL |
返回所有结果集中共有的所有记录(包括重复项)。 |
OTHERWISE |
按出现顺序返回第一个非空结果集。 |
详情
UNION、EXCEPT和INTERSECT默认对最终结果集去重,它们分别等同于UNION DISTINCT、EXCEPT DISTINCT和INTERSECT DISTINCT。- 在一个复合查询语句中,可以混合使用不同的连接词。
为了合并多个线性查询的结果集,所有线性查询的RETURN语句必须包含完全相同的返回项(数量、顺序和名称一致)。
示例图

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
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
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
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
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
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
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
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 |