【问题标题】:Neo4j and Cypher - strange behaviour of OPTIONAL MATCHNeo4j 和 Cypher - OPTIONAL MATCH 的奇怪行为
【发布时间】:2014-07-20 10:51:57
【问题描述】:

今天我正在为图表的某些部分编写 DELETE 查询,但OPTIONAL MATCH 遇到了一些问题。

首先是示例图:

http://console.neo4j.org/r/micnvv

http://console.neo4j.org/?id=og6d9s

我想编写一个删除所有foobar 实例的查询,问题是有时fooParent 将不存在,并且在某些情况下单个foo 不会连接到任何bar .由于这些条件,我决定在OPTIONAL MATCH 查询中匹配fooParentbar 节点。

现在在第一个图中(存在fooParentbar 节点)我想要的所有内容都匹配(foo1 和所有bar 节点)使用

MATCH (foo:Foo { customId: '1' })
OPTIONAL MATCH foo -[rel]-> bar,(fooParent: FooParent)-[fooParentRel]-> foo
RETURN foo, bar

在第二张图中,我遇到了fooParent 不存在给定foo 的情况,并且相同的查询与bar 节点不匹配 - 如您所见,只有foo 匹配。

我在想OPTIONAL MATCH 是我的方法,但它似乎不起作用。

【问题讨论】:

    标签: neo4j cypher


    【解决方案1】:

    是的,因为OPTIONAL MATCH 子句也可以

    • 完全匹配,在这种情况下,它将返回每个标识符绑定的匹配行,或者
    • 它将不完全匹配,在这种情况下,它将返回一行,其中任何未绑定的标识符都设置为null

    在这种情况下,您的OPTIONAL MATCH 包含两部分:它尝试将具有传出关系的Foo 节点(到某个条形图)FooParent 传入关系匹配。 p>

    解决办法是拆分OPTIONAL MATCH:

    MATCH (foo:Foo { customId: '1' })
    OPTIONAL MATCH foo -[rel]-> bar
    OPTIONAL MATCH (fooParent: FooParent)-[fooParentRel]-> foo
    RETURN foo, bar
    

    【讨论】:

    • 谢谢,这行得通!我不知道你可以放两个OPTIONAL MATCH子句,可能我有点被refcard的语法给骗了:docs.neo4j.org/refcard/2.0暗示只能有一个MATCH/OPTIONAL MATCH(没有*+)
    【解决方案2】:

    在第二张图中,通过运行两个不同的可选匹配函数,以下查询将起作用

    MATCH (foo:Foo { customId: '1' })
    
    OPTIONAL
    
    MATCH (foo)-[r]->(bar)
    
    OPTIONAL
    
    MATCH (fooParent:fooParent)-[fooParentRel]->(foo2)
    
    RETURN foo, bar, foo2
    

    干杯,

    克里斯

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-13
      • 1970-01-01
      • 2015-11-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多