2017-05-22 11 views
2

私は2つのテストがによるCypher - myNode <> NULLとmyNode IS NOT NULLの違いは何ですか?

Added 1 label, created 1 node, deleted 1 node, statement completed in 0 ms. 

そして

Node with id 1738 has been deleted in this transaction 

を返し

CREATE (a:TEST) 
DELETE a 
WITH a 
WHERE a IS NOT NULL 
RETURN (a:TEST) 

を返し

CREATE (a:TEST) 
DELETE a 
WITH a 
WHERE a <> NULL 
RETURN (a:TEST) 

照会してい、 "<"は不等式演算子です。だから私の理解は、 "<> NULL"と "a IS NOT NULL"はCypherで同等です。少なくとも、私は "IS NOT NULL"がより信頼性の高いフィルタになると期待しています(専用の比較演算子なので)。これは、同じトランザクション内でノードを作成して削除する際に問題になる可能性があるようですが、IS NOT NULLに関するドキュメントでは、(それが暗黙のうちに)「演算子です」とは言わないので、微妙な敬意があります。

なぜa <> NULLa IS NOT NULLの場合に機能しますか? AKA、これらの2つの比較の間の相違は何ですか?

Iはサイファーバージョン3.1、およびサイファーにおいて3.1.1

答えて

3

のNeo4jのバージョンを使用している、NULLが存在しないか、または未定義の値を表すために使用されます。したがってNULLを含む等価性テストは常に未定義です。これはfalseとみなされます。詳細については、https://neo4j.com/docs/developer-manual/current/cypher/syntax/working-with-null/を参照してください。

例では、識別子aは、DELETE aの後にもノードを参照し続けます。 NULLではありません。最初の例では、非NULL識別子をNULLと比較しています。これは常に不明で、したがって偽です。したがって、RETURN aは評価されず、作成と削除に関する出力しか表示されません。

第2の例では、チェックはa IS NOT NULLであり、これは真です。 aは、グラフから削除されたノードを指します。したがって、RETURN a節が評価されます。

ノードのレンダリングが削除されたグラフからノードを読み取ろうとするため、エラーNode with id 1738 has been deleted in this transactionが表示されます。エラーではなく、ノード表現が返されるべきであるということは議論の余地があります。識別子aが引き続きノードを参照する引数はメリットがあります。しかし、現時点では、Neo4jはこれを達成するために必要な分離を提供しておらず、OpenCypherグループがそのようにすべきかどうかについての立場を持っているとは考えていません。

+1

そして今、私はRETURN aの代わりにRETURN(a:TEST)を使用していたことに気付きました。そのため、削除されたノードではなくパターンマッチが返されていました。この場合、戻り値はおそらくNULLになるはずです。ありがとう! – Tezra

+0

あなたはそうです。 'RETURN a'だけではエラーは発生せず、空のノードが返されます。 '(a:Test)'では、グラフでIDで再度一致させようとしていますが、ノードはもはやマッチングのために利用できません。おそらく、 'a'が既にノードを参照しているので、再度一致する必要はありません。この場合、必要となるのは':Test'ラベルをアサートするフィルタだけです。 –