【问题标题】:Neo4j Cypher - Match relationship condition or nullNeo4j Cypher - 匹配关系条件或空
【发布时间】:2017-08-11 20:28:39
【问题描述】:

一个 Neo4j 新手,我一直在研究一个看起来应该很简单的查询,但我在找出正确的 Cypher 时遇到了问题。鉴于以下模型,我想获取所有 Objects(及其 Statuses),它们是 obj1 的替代品,它们要么具有 Status type of 2,要么具有 no Status。我想要的结果是返回ob3 节点,它是Status 节点以及ob4 节点。

到目前为止,我最接近的是:

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、NOT 和UNION 子句,但我觉得我错过了一些非常简单的东西。

【问题讨论】:

    标签: neo4j cypher


    【解决方案1】:

    您已经接近了,但我们需要过滤掉不是我们要查找的节点,这需要 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
    

    【讨论】:

    • 完美,谢谢!我看到了我现在缺少的东西,当然这很有意义。如何将此标记为正确答案?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-06
    • 1970-01-01
    • 2020-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多