UNWIND
UNWIND 子句可以将任何列表转换回单独的行。这些列表可以是传入的参数、之前通过 collect
收集的结果或其他列表表达式。
Neo4j 不保证 |
UNWIND 子句的常见用法
-
创建去重列表。
-
从提供给查询的参数列表中创建数据。
UNWIND 子句要求您为内部值指定一个新名称。 |
展开列表
我们希望将字面量列表转换为名为 x
的行并返回它们。
UNWIND [1, 2, 3, null] AS x
RETURN x, 'val' AS y
原始列表中的每个值(包括 null
)都作为单独的行返回。
x | y |
---|---|
|
|
|
|
|
|
|
|
|
创建去重列表
我们希望使用 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 |