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