使用 http://console.neo4j.org作为沙箱,我遇到了以下意外行为:
语句 1 - 返回包含 Neo 节点集合的 1 行
MATCH (n:Crew)
WHERE n.name="Neo"
WITH COLLECT(n) AS c1
WITH c1+[] AS c2
RETURN c2
语句 2 - 返回 0 行(意外)
MATCH (n:Crew)
WHERE n.name="Neo"
WITH COLLECT(n) AS c1
MATCH (n:Crew)
WHERE n.name="NoOne"
WITH c1+COLLECT(n) AS c2
RETURN c2
语句 3 - 返回包含空集合的 1 行
MATCH (n:Crew)
WHERE n.name="NoOne"
WITH COLLECT(n) AS c1
RETURN c1
我不明白为什么声明 2 返回的结果与 不同声明 1 ,因为它应该返回一个包含 Neo 节点的集合,就像在 中一样声明 1 .
声明 3 显示第二个
MATCH
在 声明 2 应该导致一个空的集合。这种行为在 Cypher 中是预期的吗?如果是这种情况,我会很高兴有一个小小的解释来帮助我理解这种行为。
最佳答案
我以前遇到过这种确切的行为,这非常令人沮丧。问题在于第二个 MATCH
查询 2 中的子句:如果现有的结果行(在本例中,带有 c1
的单行)不返回 MATCH
的任何结果,在那之后该行将被完全删除 MATCH
条款,即使 MATCH
单独(没有预先存在的结果行)返回一个空集合。如果您将其转换为 OPTIONAL MATCH
当没有匹配项时,您将能够保留结果行。
更新:有关更彻底的分析,请参见下文,但 tl,dr 是第二个 COLLECT(n)
在语句 2 中确实返回一个空列表,就像在语句 3 中一样;然而,整个条款WITH c1+COLLECT(n) AS c2
不返回任何行,因为没有带有 c1
的行第二个之后的值 MATCH
.
关于neo4j - 在 Cypher 中组合集合的意外行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39873935/