1

私は 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」という名前のノードを正しく返します。

いくつかの代替方法でクエリを書き直そうとしましたが、非推奨に一致する必要な結果を確実に取得できないようです! オペレーター。多分それはちょうど遅くなっていて、私は明らかな何かを見逃していますか?:)

どんな助けでも大歓迎です!

ありがとう、マーク。

4

1 に答える 1