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

Neo4j和Cypher-可选匹配的奇怪行为,neo4j,cypher,Neo4j,Cypher,今天我正在为我的图表的某些部分编写删除查询,但是我在可选匹配方面遇到了一些问题 首先,这里是示例图: 及 我想编写一个删除所有foo和bar实例的查询,问题是有时fooParent将不存在,而且有时单个foo将不会连接到任何bar。由于这些条件,我决定在可选匹配查询中匹配fooParent和bar节点 现在,在第一个图中(其中存在fooParent和bar节点),我想要的所有内容都通过以下方式匹配(foo1和所有bar节点) 在第二个图中,给定的foo的fooParent不存在,并且相同的查

今天我正在为我的图表的某些部分编写删除查询,但是我在
可选匹配方面遇到了一些问题

首先,这里是示例图:

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

现在,在第一个图中(其中存在
fooParent
bar
节点),我想要的所有内容都通过以下方式匹配(
foo1
和所有
bar
节点)

在第二个图中,给定的
foo
fooParent
不存在,并且相同的查询不匹配
bar
节点-如您所见,仅匹配
foo


我在想,
可选匹配
是像我这样的情况下的一种方法,但它似乎不起作用。

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

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

OPTIONAL

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

OPTIONAL

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

RETURN foo, bar, foo2
干杯


Chris

是的,因为
可选匹配
子句

  • 完全匹配,在这种情况下,它将返回每个标识符绑定的匹配行,或者
  • 它将不完全匹配,在这种情况下,它将返回一行,其中任何未绑定标识符都设置为
    null
在这种情况下,您的
可选匹配
包含两部分:它尝试将具有传出关系(到某个条)和传入关系的
Foo
节点与
foopresent
匹配

解决方案是拆分
可选匹配项

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

谢谢,行得通!我不知道你可以放两个
可选匹配
子句,也许我被refcard的语法愚弄了一点:建议只能有一个
匹配
/
可选匹配
(没有
*
+
MATCH (foo:Foo { customId: '1' })
OPTIONAL MATCH foo -[rel]-> bar
OPTIONAL MATCH (fooParent: FooParent)-[fooParentRel]-> foo
RETURN foo, bar