联合查询 (UNION)

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

使用 UNION 合并的所有查询中,列的数量和名称必须完全相同。

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

如果 UNION 中的任何查询包含更新操作,则 UNION 中查询的顺序非常重要。

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

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

示例图

以下图表用于下方的示例

要重新创建该图,请在空的 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

返回合并后的结果,包括重复项。

结果
名称 (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

返回合并后的结果,不包含重复项。

结果
名称 (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

返回合并后的结果,不包含重复项。

结果
名称 (name)

"Johnny Depp"

"Sarah Jessica Parker"

"Ed Wood"

行:3

联合后的处理

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

查询
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
结果
名称 (name) count

"Ed Wood"

2

"Johnny Depp"

1

"Sarah Jessica Parker"

1

行:3

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

结合使用 UNION 和 UNION ALL

要在同一个查询中结合使用 UNION(或 UNION DISTINCT)和 UNION ALL,请将一个或多个相同类型的 UNION 操作括在大括号中。这允许被括起来的查询作为参数,与任何类型的外部 UNION 操作进行合并。

结合使用 UNIONUNION ALL
{
   MATCH (n:Actor)
   RETURN n.name AS name
   UNION
   MATCH (n:Director)
   RETURN n.name AS name
}
UNION ALL
MATCH (n:Movie)
RETURN n.title AS name

返回合并后的结果。

结果
名称 (name)

"Johnny Depp"

"Sarah Jessica Parker"

"Ed Wood"

"Ed Wood"

行:4