2017-08-11 108 views
1

有點Neo4j新手,我一直在尋找一個似乎應該很簡單的查詢,但我有問題搞清楚正確的Cypher。鑑於下面的模型,我想獲得所有Objects(和它們的Statuses),它們是obj1的替代品,其具有Status type of 2no 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 

這將返回我想要的節點,但也返回ob2節點,而它的Status節點。如果我保留上面的查詢,但只返回p變量,我得到ob3節點和它的Status,但不回ob4節點。我試過了不同查詢的組合,包括WITH,NOTUNION條款,但我覺得我錯過了一些非常簡單的事情。

Model

回答

0

你接近,但我們需要過濾掉那些不是我們要找的節點,需要在一場比賽或在用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