2017-08-11 214 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