私は Neo4j 1.9 に移行し、非推奨の移行ガイドに従って暗号クエリを更新しています。具体的には:
!node.property のような Cypher 式のプロパティ演算子! = "value" は廃止されました。代わりに has(node.property) AND node.property = "value" を使用してください。
問題は、HAS句をNOTと組み合わせて使用すると、期待した結果が得られないことです。例えば:
status プロパティが存在し、「DONE」以外に設定されている場合:
AND not(n.status! = "DONE")
true と評価されます (予想どおり)
AND not(has(n.status) AND n.status = "DONE")
false と評価しますか???
status プロパティが存在しない場合
AND not(n.status! = "DONE")
false と評価する
AND not(has(n.status) AND n.status = "DONE")
ノードが存在しないため例外がスローされますが、確かにこれを防止する必要がありましたか? チェックをNOTでラップすると、HASチェックが実行されないようになります。
これは、次のクエリを使用して、neo4j ドキュメント Web サイトのライブ クエリの例で再現できます。
MATCH n
WHERE NOT (n.name! = 'Peter')
RETURN n
これにより、名前がないか、名前が「Peter」ではないすべての (3) ノードが返されます。これは私が再現したい結果ですが、現在非推奨の「!」を使用していません。オペレーター。
MATCH n
WHERE NOT (HAS (n.name) AND n.name = 'Peter')
RETURN n
1 つのノードに name プロパティがないため、node not found 例外をスローします。:/
MATCH n
WHERE (HAS (n.name) AND n.name = 'Peter')
RETURN n
「Peter」という名前のノードを正しく返します。
いくつかの代替方法でクエリを書き直そうとしましたが、非推奨に一致する必要な結果を確実に取得できないようです! オペレーター。多分それはちょうど遅くなっていて、私は明らかな何かを見逃していますか?:)
どんな助けでも大歓迎です!
ありがとう、マーク。