私はちょうど見ました (ここ: 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 の動作がおそらくバグなのかということです。
ところで、なぜ今誰かが ! 演算子はそもそも廃止されましたか? それはいいですね ;-)
読んでいただきありがとうございます。よろしくお願いします!