Neo4j和Cypher - 可选匹配的奇怪行为

时间:2014-07-20 10:51:58

标签: neo4j cypher

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

首先是示例图:

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

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

我想编写一个删除所有foobar个实例的查询,问题是有时候fooParent不存在,而且有时单foo会没有连接到任何bar。由于这些条件,我决定匹配fooParent查询中的barOPTIONAL MATCH个节点。

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

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

在第二个图表中,我发现给定fooParent的{​​{1}}不存在且同一查询与foo个节点不匹配 - 只有bar匹配为你可以看到。

我当时认为foo是我的方式,但是它似乎没有用。

2 个答案:

答案 0 :(得分:5)

是的,因为OPTIONAL MATCH条款

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

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

解决方案是拆分FooParent

OPTIONAL MATCH

答案 1 :(得分:3)

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

MATCH (foo:Foo { customId: '1' })

OPTIONAL

MATCH (foo)-[r]->(bar)

OPTIONAL

MATCH (fooParent:fooParent)-[fooParentRel]->(foo2)

RETURN foo, bar, foo2

干杯,

克里斯