UNWIND
UNWIND 子句可以将任何列表转换回独立的行。这些列表可以是传入的参数、之前通过 collect 聚合的结果,或其他列表表达式。
|
Neo4j 不保证 |
UNWIND 子句的常见用法
-
创建不同的列表。
-
根据提供给查询的参数列表创建数据。
|
|
展开列表 (Unwinding a list)
我们希望将字面量列表转换为名为 x 的行并返回它们。
UNWIND [1, 2, 3, null] AS x
RETURN x, 'val' AS y
原始列表中的每个值(包括 null)都将作为单独的行返回。
| x | y |
|---|---|
|
|
|
|
|
|
|
|
|
|
创建唯一列表 (Creating a distinct list)
我们希望使用 DISTINCT 将重复的列表转换为集合。
WITH [1, 1, 2, 2] AS coll
UNWIND coll AS x
WITH DISTINCT x
RETURN collect(x) AS setOfVals
原始列表中的每个值都会被展开,并经过 DISTINCT 处理以创建一个唯一集合。
| setOfVals |
|---|
|
|
将 UNWIND 用于任何返回列表的表达式
任何返回列表的表达式都可以与 UNWIND 一起使用。
WITH
[1, 2] AS a,
[3, 4] AS b
UNWIND (a + b) AS x
RETURN x
两个列表(a 和 b)被连接在一起形成一个新列表,然后由 UNWIND 进行操作。
| x |
|---|
|
|
|
|
|
将 UNWIND 用于列表的列表
可以链接多个 UNWIND 子句来展开嵌套的列表元素。
WITH [[1, 2], [3, 4], 5] AS nested
UNWIND nested AS x
UNWIND x AS y
RETURN y
第一个 UNWIND 为 x 产生三行,每一行都包含原始列表的一个元素(其中两个本身也是列表),即 [1, 2]、[3, 4] 和 5。随后的第二个 UNWIND 依次对这些行进行操作,最终为 y 产生五行。
| y |
|---|
|
|
|
|
|
|
将 UNWIND 用于空列表
对空列表使用 UNWIND 将不会产生任何行,无论之前是否存在行,也无论是否正在投影其他值。
本质上,UNWIND [] 会将行数减少为零,从而导致查询停止执行并返回空结果。这在某些情况下很有价值,例如 UNWIND v,其中 v 是来自前一个子句的变量,它可能为空列表也可能不是——当它为空列表时,其行为就像一个没有结果的 MATCH。
UNWIND [] AS empty
RETURN 'literal_that_is_not_returned'
|
|
行数:0 |
为避免无意中对空列表使用 UNWIND,可以使用 CASE 将空列表替换为 null。
WITH [] AS list
UNWIND
CASE
WHEN list = [] THEN [null]
ELSE list
END AS emptylist
RETURN emptylist
将 UNWIND 用于非列表表达式
对非列表的表达式使用 UNWIND,其返回结果与对仅包含该表达式的列表使用 UNWIND 相同。例如,UNWIND 5 实际上等同于 UNWIND [5]。例外情况是表达式返回 null——这将使行数减少为零,从而导致查询停止执行并返回空结果。
UNWIND null AS x
RETURN x, 'some_literal'
|
|
|
从列表参数创建节点
无需使用 FOREACH,即可从参数列表创建多个节点和关系。
{
"events" : [ {
"year" : 2014,
"id" : 1
}, {
"year" : 2014,
"id" : 2
} ]
}
UNWIND $events AS event
MERGE (y:Year {year: event.year})
MERGE (y)<-[:IN]-(e:Event {id: event.id})
RETURN e.id AS x ORDER BY x
原始列表中的每个值都会被展开,并经过 MERGE 处理以查找或创建节点和关系。
| x |
|---|
|
|
行:2 |