组合查询 (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. 结果
姓名

"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. 结果
姓名

"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. 结果
姓名

"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. 结果
姓名 计数

"Ed Wood"

2

"Johnny Depp"

1

"Sarah Jessica Parker"

1

行数: 3

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

© . All rights reserved.