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

And*_*dna 2 neo4j cypher

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

首先是示例图:

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

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

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

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

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

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

我认为这OPTIONAL MATCH是我的方式,如果我的,但它似乎没有工作.

Jan*_*sch 5

是的,因为一个OPTIONAL MATCH条款

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

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

解决方案是拆分OPTIONAL MATCH:

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