Neo4j 在使用返回 null 的理解列表展开后保留绑定变量

问题描述 投票:0回答:2

我在 github 中发现了这个旧的错误列表,主要是为了确认这是一个功能。有解决方法吗? https://github.com/neo4j/neo4j/issues/5851

MATCH (rememberMe)
WITH rememberMe
UNWIND [(rememberMe)-[:hates]->(icecream) | icecream]
 +  [(rememberMe)-[:vomits]->(cookies) | cookies]
 AS noSuchThing
RETURN rememberMe

当 noSuchThing 为 null 时,rememberMe 会丢失

有办法解决这个问题吗?似乎无法让 CASE WHEN NULL 与理解列表的总和一起使用。

neo4j
2个回答
1
投票

目前空列表上的 UNWIND 行为是预期的。 UNWIND 为列表中的每个元素发出一行,因此如果没有列表元素,则不会发出任何行,从而有效地清除原始行。

正如您在文档中提到的,有一种使用 CASE 的解决方法,即使用

[null]
列表代替空列表,以便保留单个列表元素并保留原始行。

对于您的情况,您需要放慢一点速度,您试图同时做很多事情,因此将列表的创建与 UNWIND 分开,您应该能够应用解决方法:

MATCH (rememberMe)
WITH rememberMe, [(rememberMe)-[:hates]->(icecream) | icecream]
 +  [(rememberMe)-[:vomits]->(cookies) | cookies]
 AS list
UNWIND CASE WHEN size(list) = 0 THEN [null] ELSE list END as noSuchThing
RETURN rememberMe

0
投票

仅适用于最终来到这里的任何人 - 在对不存在的财产进行分割后放松时,我也遇到了类似的问题。

WITH rememberMe, split(n.property, ",") as list
UNWIND CASE WHEN list = [] THEN [] ELSE list END AS l
RETURN rememberMe

正在失去rememberME。修正为:

WITH rememberMe, split(CASE WHEN EXISTS(n.property) THEN n.property ELSE "" END, ",") as list
UNWIND CASE WHEN list = [] THEN [] ELSE list END AS l
RETURN rememberMe
© www.soinside.com 2019 - 2024. All rights reserved.