2017-02-04 9 views
1

Neo4jではグラフに4人のノードがあります。 2は映画ノードとの関係を持ち、他の2は関係がない。Neo4j OPTIONAL MATCHがnullを返さない

以下のクエリを実行すると、2つのノードのみがリレーションシップなしで返されますが、すべてが返されます。

質問が見つからない場合は教えてください。私はNeo4Jを初めて利用しています

MATCH (p:Person) 
OPTIONAL MATCH (p) -[r]- (m:Movie) 
Where type(r) = null 
Return p,type(r),m 

ありがとう!

答えて

0

予期しない結果が得られた理由は、WHERE句の配置と意味だけでなく、OPTIONAL MATCHの動作との相互作用によるものです。

上記のMATCH、OPTIONAL MATCH、またはWITHにのみ適用されます。この場合、クエリのすべての結果には適用されません。オプションマッチのみに適用されます。これは、期待しているものとはまったく異なる動作をします。

それはあなたがそれを隔離し、オプションMATCHとWHEREだけで見れば助け:

OPTIONAL MATCH (p) -[r]- (m:Movie) 
Where type(r) = null 

これは意味:必要に応じへのpから一致:作品mを、Rがnullである関係Rを介して。あなたはまだそのタイプがヌルであることはできません、それは不可能なので、このOPTIONAL MATCHは常に失敗します。

しかし、これはOPTIONAL MATCHであるため、行は削除されず、一致しない要素はnullになります。結果は:Person p(以前の一致から)、およびタイプ(r)とmの場合はnullです。

実際には、オプションの一致を実行してから、型がnullの行をフィルタ処理します。 WHEREは、OPTIONAL MATCHではなく、クエリのすべての行に影響を与えます。

これは、WITH句を追加し、それの後にWHEREを移動するために私たちを必要とします。オプションMATCHからWITHにWHEREを移動

MATCH (p:Person) 
OPTIONAL MATCH (p) -[r]- (m:Movie) 
WITH p, r, m 
Where type(r) = null 
Return p, type(r), m 

はその意味を変更し、それが今、あなたのすべての行に適用されますそれはもはやOPTIONAL MATCHに関連付けられていないので、行と設定要素をnullに保つのではなく述語に合わない行を実際に削除します。今

、まったくオプションMATCHを使用せずに、あなたが望むものを返すように簡単に問い合わせがあり、言ったことすべて:

MATCH (p:Person) 
WHERE NOT (p)--(:Movie) 
RETURN p 

マッチ:それらからの関係はありませんパーソン・ノード:へ者:ムービーノード。

リレーションシップのタイプとムービーノードは、一致するものが存在しないため返さないということは省略できます。

関連する問題