UNION

UNION 将两个或多个查询的结果合并成一个单个结果集,其中包含属于联合中任何查询的所有行。

使用 UNION 组合的所有查询中的列数和列名必须相同。

要保留所有结果行,请使用 UNION ALL。仅使用 UNION(或 UNION DISTINCT)将组合结果集并删除重复项。

如果 UNION 中的任何查询包含更新,则 UNION 中查询的顺序是相关的。

UNION 之前的任何子句都无法观察到 UNION 之后的子句所做的写入。UNION 之后的任何子句都可以观察到 UNION 之前的子句所做的所有写入。

有关详细信息,请参阅 带有 UNION 的查询中的子句组合

示例图

以下图用于下面的示例

graph union clause

要重新创建此图,请在空 Neo4j 数据库上运行以下查询

CREATE (johnny:Actor {name: 'Johnny Depp'}),
       (sarah:Actor {name: 'Sarah Jessica Parker'}),
       (ed:Actor&Director {name: 'Ed Wood'}),
       (edWoodMovie:Movie {title: 'Ed Wood'}),
       (johnny)-[:ACTED_IN]->(edWoodMovie),
       (sarah)-[:ACTED_IN]->(edWoodMovie)

组合两个查询并保留重复项

使用 UNION ALL 组合两个查询的结果。

查询
MATCH (n:Actor)
RETURN n.name AS name
UNION ALL
MATCH (n:Movie)
RETURN n.title AS name

返回组合结果,包括重复项。

表 1. 结果
name

"Johnny Depp"

"Sarah Jessica Parker"

"Ed Wood"

"Ed Wood"

行数:4

组合两个查询并删除重复项

UNION 中不包含 ALL,则会从组合结果集中删除重复项。

查询
MATCH (n:Actor)
RETURN n.name AS name
UNION
MATCH (n:Movie)
RETURN n.title AS name

返回组合结果,不包含重复项。

表 2. 结果
name

"Johnny Depp"

"Sarah Jessica Parker"

"Ed Wood"

行数:3

UNION DISTINCT

也可以通过在 UNION 中显式包含 DISTINCT 来删除重复项。UNION DISTINCT 关键字是作为 Cypher®GQL 符合性 的一部分引入的,使用它与使用简单的 UNION 在功能上是相同的。

查询
MATCH (n:Actor)
RETURN n.name AS name
UNION DISTINCT
MATCH (n:Movie)
RETURN n.title AS name

返回组合结果,不包含重复项。

表 3. 结果
name

"Johnny Depp"

"Sarah Jessica Parker"

"Ed Wood"

行数:3

联合后处理

UNION 子句可以在 CALL 子查询 中使用,以便在返回最终输出之前进一步处理组合结果。例如,以下查询 统计 CALL 子查询中 UNION ALL 后返回的每个 name 属性的出现次数。

以下查询使用一个空的 变量范围子句CALL () { …​ }(在 Neo4j 5.23 中引入)。如果您使用的是旧版本的 Neo4j,请改用 CALL { …​ }。有关更多信息,请参阅 CALL 子查询 → 导入变量
查询
CALL () {
  MATCH (a:Actor)
  RETURN a.name AS name
UNION ALL
  MATCH (m:Movie)
  RETURN m.title AS name
}
RETURN name, count(*) AS count
ORDER BY count
表 4. 结果
name count

"Ed Wood"

2

"Johnny Depp"

1

"Sarah Jessica Parker"

1

行数:3

有关更多信息,请参阅 CALL 子查询 → 联合后处理