【问题标题】:How does Neo4J cypher OPTIONAL MATCH works?Neo4J 密码可选匹配如何工作?
【发布时间】:2020-04-07 14:00:57
【问题描述】:

我今天在理解密码中的 OPTIONAL MATCH 子句时遇到了问题。让我们考虑这个简单的案例:

CREATE (:a {type:"group"})-[:a_rel]->(:a {type: "app"})-[:b_rel]->(:b);

这将创建 2 个具有不同类型属性的“a”节点,以及一个“b”节点。他们都在一个简单的路径a-->a-->b

然后,我尝试匹配具有“组”类型的“a”节点,连接到另一个“a”节点,可选连接到“b”节点。

因此,如果我运行以下查询,我希望它不会返回任何内容:

MATCH(x:a)-->(y:a) 
where x.type = "group" 
OPTIONAL MATCH (y)-->(z:b) 
where z IS NULL 
return y

但它总是返回路径的第二个“a”节点,在 where 子句中使用 IS NULL 或 IS NOT NULL。

你能解释一下我在这里不明白的地方吗?在我的真实模型中,第二个“a”节点可以连接或不连接到“b”节点。我想检索所有未连接到任何“b”节点的节点。

非常感谢您的帮助

雷米

【问题讨论】:

    标签: neo4j cypher


    【解决方案1】:

    OPTIONAL MATCH的作用是,它试图找出图中的模式。如果找到匹配模式,则返回Node,否则将其替换为NULL。希望这能消除造成的混乱。

    【讨论】:

      【解决方案2】:

      只要MATCH 子句找到匹配项,查询将始终返回y

      这是因为OPTIONAL MATCH 不需要匹配任何内容 即可继续查询。这就是为什么它是“可选的”。

      这是做你想做的事情的一种方法:

      MATCH (x:a)-->(y:a)
      WHERE x.type = "group" AND NOT (y)-->(:b)
      RETURN y
      

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-03-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多