我无法返回与某个属性没有关系的节点。
这是为场景构建图表的查询:
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的查询。 我有兴趣了解相关查询无法正常工作的原因。
答案 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