我刚刚看到(这里: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的行为是否也是一个错误?
顺便说一下:现在有人为什么这样!运营商首先被弃用了?我喜欢它; - )
感谢您的阅读和最好的问候!
答案 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短路。