Cypher:更换问题!物业经营者

时间:2013-07-19 09:03:44

标签: neo4j cypher

我刚刚看到(这里:http://docs.neo4j.org/chunked/1.9/deprecations.html)!随着Neo4j 2.0的发布,不推荐使用Cypher属性表达式的运算符。所以我去重新制定我现有的Cypher查询并遇到了以下问题。

1.9查询: START n=node(*) WHERE NOT "NO_FACET" in n.uniqueLabels! RETURN n limit 2;

我得到的结果:在具有此属性但不包含“NO_FACET”值的所有OR节点上没有“uniqueLabels”属性的节点。

上面链接的页面表示通过像has(n.uniqueLabels" AND NOT "NO_FACET" IN n.uniqueLabels这样的检查来规避这些表达。这个查询有效,但显然不是我想要的(我还希望节点可以完全没有属性)。 拟议的规避看起来像一个懒惰的评估,对我来说没问题。所以我这样做了:

START n=node(*) WHERE NOT (has(n.uniqueLabels) AND "NO_FACET" in n.uniqueLabels) RETURN n limit 2;

但在这里我收到一个错误: ==> EntityNotFoundException: The property 'uniqueLabels' does not exist on Node[0] 所以评价毕竟不是那么懒惰?奇怪的是,这个查询有效:

START n=node(*) WHERE has(n.uniqueLabels) AND "NO_FACET" in n.uniqueLabels RETURN n limit 2;

当然,它只是给了我与我想要的完全相反的东西。

实际上,如果没有这样的操作员,我可以得到我想要的东西:

START n=node(*) WHERE NOT has(n.uniqueLabels) OR (has(n.uniqueLabels) AND NOT "NO_FACET" in n.uniqueLabels) RETURN n limit 2;

但是我不确定这是不是在运营商被弃用时的意图。所以问题是我是否错过了正确的方法,或者AND与括号外的NOT的行为是否也是一个错误?

顺便说一下:现在有人为什么这样!运营商首先被弃用了?我喜欢它; - )

感谢您的阅读和最好的问候!

1 个答案:

答案 0 :(得分:0)

我认为这可能是由NOT如何评估其中的表达式引起的。它可能不会使AND表达式短路,这会导致它不评估第二个表达式。

一个解决方案是De Morgan's Law(打破CS 101)。您的查询将变为:

START n=node(*) 
WHERE NOT(has(n.uniqueLabels)) OR NOT("NO_FACET" in n.uniqueLabels)) 
RETURN n limit 2;

我不是百分之百地确定为什么弃用此运算符,它可能与使Cypher语言关键字更符合SQL之类的东西有关,但是你的情况似乎更像是他们系统中的一个错误,就像表达式一样应该在NOT语句中将AND短路。