0

私はちょうど見ました (ここ: http://docs.neo4j.org/chunked/1.9/deprecations.html ) ! Cypher プロパティ式の演算子は、Neo4j 2.0 のリリースで非推奨になります。そのため、既存の Cypher クエリを再構築するために行ったところ、次の問題に遭遇しました。

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

私が得るもの:「uniqueLabels」プロパティをまったく持たないノード、またはこのプロパティは持っているが「NO_FACET」値を含まないノード。

上記のリンク先のページでは、 のようなチェックを行うことで、そのような表現を回避するように指示されていhas(n.uniqueLabels" AND NOT "NO_FACET" IN n.uniqueLabelsます。このクエリは機能しますが、明らかに私が望んでいたものではありません (プロパティをまったく持たないノードも必要でした)。提案された回避策は、怠惰な AND 評価のように見えますが、私には問題ありません。だから私はこれをしました:

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;

しかし、これがオペレーターが廃止されたときに意図された方法であるかどうかはわかりません。問題は、私がそれを行う正しい方法を見逃しているのか、それとも括弧の外側の NOT と組み合わせた AND の動作がおそらくバグなのかということです。

ところで、なぜ今誰かが ! 演算子はそもそも廃止されましたか? それはいいですね ;-)

読んでいただきありがとうございます。よろしくお願いします!

4

1 に答える 1

0

これは、NOT がその中の式を評価する方法が原因であると考えられます。2 番目の式を評価しない原因となる AND 式をショート サーキットしていない可能性があります。

解決策の 1 つは、ド モルガンの法則(CS 101 を破壊すること) です。クエリは次のようになります。

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

この演算子が非推奨になった理由は 100% わかりません。Cypher 言語のキーワードを SQL のようなものとより一致させることに関係している可能性がありますが、式が短絡する必要があるため、状況はシステムのバグのように思えます。 NOT ステートメント内の AND で。

于 2013-07-19T10:35:19.117 に答える