2017-08-11 5 views
1

Neo4j初心者の一人で、シンプルにする必要があると思われるクエリに取り組んでいますが、正しいCypherを見つけ出すのに問題があります。以下のモデルでは、obj1の代替品であるObjects(およびそれらのStatuses)のいずれもがStatus type of 2またはno Statusのいずれかになるようにしたいと考えています。私の望む結果は、ノードob4に加えて、ノードob3とノードStatusを返すことです。Neo4j Cypher - マッチする関係条件またはnull

はこれまでのところ、私が来ている最も近いです:

match (obj1:Object{nm:'obj1'})-[:REPLACES*]->(repObj) 
optional match p=(repObj)-[:HAS_STATUS]->(stat) 
where stat.type = 2 
return repObj, p 

これは私の希望のノードを返すだけでなく、それはStatusノードのなしob2ノードを返します。上記のクエリを維持しても、p変数のみを返すと、ob3ノードが得られ、それはStatusですが、ob4ノードは返されません。私はWITHNOTUNION句を含むさまざまなクエリの組み合わせを試しましたが、私は非常に単純なものが欠けているように感じます。

Model

答えて

0

あなたは近いですが、我々は我々が探しているものではないノードをフィルタする必要があり、それはMATCH上またはWITHでWHERE句が必要です。あなたのWHEREは現在OPTIONAL MATCHにあります。つまり、OPTIONAL MATCHは行をフィルタリングしないため、マッチに導入された新しい変数のみをnullに設定するため、行をフィルタリングしません。

match (obj1:Object{nm:'obj1'})-[:REPLACES*]->(repObj) 
optional match p=(repObj)-[:HAS_STATUS]->(stat) 
with repObj, p, stat 
where p is null or stat.type = 2 
return repObj, p 
+0

完璧、ありがとうございます!私は今私が逃していたものを見て、それは完璧な意味合いがあります。これを正解とするにはどうすればよいですか? – cartmania

関連する問題