为什么我的查询中没有Neo4j None函数?

时间:2017-02-07 11:36:54

标签: neo4j cypher

我无法返回与某个属性没有关系的节点。

这是为场景构建图表的查询:

create ({Name:'Foo1'})-[:T]->({Name:'Bar'})<-[:T{Inactive:true}]-({Name:'Foo2'})<-[:T]-({Name:'Foo3'})

现在更多地指定所需的结果: 我希望得到以某种方式连接到&#39; Bar&#39;的所有节点。因此,从上面的查询创建的图表中,我期望获得Foo1和Foo3。

我无法获取 NOT 的节点与&#34; Inactive&#34;使用以下查询的属性:

match (bar)<-[rs*]-(foo) where ID(bar)= **BAR_ID**
optional match (foo)-[r]->() where r in rs
with foo, collect(distinct r) as relationships
where none(rel in relationships where rel.Inactive = true)
return foo

现在您可能会注意到查询对于第二个where子句有点夸大其词。它是针对不同问题的不同解决方案的一部分,因此请不要关注该部分,除非它是我的问题的一部分。我感兴趣的是为什么查询无法返回任何内容。似乎 none()函数的谓词不能正常工作。特别是因为用 any()替换 none()将仅按预期返回Foo2,如下所示:

match (bar)<-[rs*]-(foo) where ID(bar)= **BAR_ID**
optional match (foo)-[r]->() where r in rs
with  foo, collect(distinct r) as relationships
where any(rel in relationships where rel.Inactive = true)
return foo

所以,问题是为什么使用 none()函数的查询不返回任何内容。首先,我认为它可能与某些没有&#34;非活动&#34;的关系有关。属性,但docs,他们告诉你缺少属性评估为假(因为它是空的)。至少,这是我的解释当然可能是错误的。

我对问题的解决方案不感兴趣,因为我已经编写了另一个确实返回Foo1和Foo3的查询。 我有兴趣了解相关查询无法正常工作的原因。

1 个答案:

答案 0 :(得分:1)

这是使用Null

的工作的特殊性
WITH [ null, false ] as values
RETURN none(value in values where value = true)

// return Null

with true as val where not (null = true)
return val

// returns nothing

[http://neo4j.com/docs/developer-manual/current/cypher/syntax/working-with-null/]

因此,您需要检查null

match (bar)<-[rs*]-(foo) where ID(bar)= **BAR_ID**
optional match (foo)-[r]->() where r in rs
with foo, collect(distinct r) as relationships
with foo, none(rel in relationships where rel.Inactive = true) as logic
          where logic is null or logic = true
return foo 

或者,您可以检查属性Inactive是否存在:

match (bar)<-[rs*]-(foo) where ID(bar)= **BAR_ID**
optional match (foo)-[r]->() where r in rs
with foo, collect(distinct r) as relationships
where none(rel in relationships where exists(rel.Inactive) and rel.Inactive = true)
return foo