neo4j - 在 Cypher 中组合集合的意外行为

标签 neo4j cypher

使用 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/

相关文章:

java - Neo4j OGM @Properties 支持哪些条目类型?

neo4j - 在数据浏览器选项卡中显示所有节点和关系

Java 与 Neo4j

random - 如何使用 Cypher 在 Neo4j 中返回随机记录?

json - 字符串化对象时如何从对象中删除引号和反斜杠(不使用正则表达式)

neo4j - 组合多个密码匹配语句的结果

neo4j - 如何解释 Cypher 的 LOAD CSV 子句的性能?

neo4j - 在单个 Cypher 查询中返回两个聚合?

java - Neo4J 遍历跳过关系类型

xcode - 更新到 Xcode 6.3 后,与 Neo4J 的 Theo 连接断开