我在尝试删除所有关系的过程中,使用了@eve-freeman提供的解决方案时遇到了问题(即删除现有关系,然后创建新关系以及更新节点属性):
MATCH (n:Node { uuid: '1' })
OPTIONAL MATCH (n)-[r]-()
DELETE r
WITH n
MATCH (f:Foo { uuid: '2' })
CREATE (n)-[:LIKES]->(f)
WITH n
MATCH (b:Bar { uuid: '3' })
CREATE (n)<-[:LOVES]-(b)
SET n.name = 'Howard'
RETURN n
由于某些原因,它创建了一个重复的条目(我很想知道为什么会发生这种情况):
"n"
{"name":"Howard","uuid":"1"}
{"name":"Howard","uuid":"1"}
Set 2 properties, deleted 2 relationships, created 4 relationships, started streaming 2 records after 6 ms and completed after 6 ms.
使用以下代码(COLLECT
然后 FOREACH
)似乎可以工作:
MATCH (n:Node { uuid: '1' })
OPTIONAL MATCH (n)-[r]-()
WITH n, COLLECT (r) AS rels
FOREACH (r IN rels | DELETE r)
WITH n
MATCH (f:Foo { uuid: '2' })
CREATE (n)-[:LIKES]->(f)
WITH n
MATCH (b:Bar { uuid: '3' })
CREATE (n)<-[:LOVES]-(b)
SET prd.name = 'Howard'
RETURN n
返回:
"n"
{"name":"Howard","uuid":"1"}
Set 1 property, deleted 2 relationships, created 2 relationships, started streaming 1 record after 3 ms and completed after 3 ms.
更新(2020年8月14日):
它创建了一个重复条目
这是不正确的。它实际上并不会创建重复的条目,只会创建重复的结果。但是,它确实会创建(n)-[:LIKES]->(f)
和(n)<-[:LOVES]-(b)
关系的副本。
这是由于(n)
与其他节点之间存在多个预先存在的关系(在上述情况中,(n)
与另外两个节点都有关系)。
在OPTIONAL MATCH (n)-[r]-()
之后,查询正在处理两行:每个已匹配的关系都有一行(每行还包括(n)
节点本身)。
DELETE r
然后删除每一行中包含的关系。
在WITH n
命令中,尽管关系已被删除,n
仍将代表两行结果,因此每行现在只包含(n)
节点(在每行上相同)。
这将导致每行都运行后续命令,从而创建重复关系和重复结果。
解决方案是确保在删除行后,只有不同的行被传递,这可以通过使用 WITH DISTINCT n
来实现,例如:
MATCH (n:Node { uuid: '1' })
OPTIONAL MATCH (n)-[r]-()
DELETE r
WITH DISTINCT n
MATCH (f:Foo { uuid: '2' })
CREATE (n)-[:LIKES]->(f)
WITH n
MATCH (b:Bar { uuid: '3' })
CREATE (n)<-[:LOVES]-(b)
SET n.name = 'Howard'
RETURN n
无论是上述的COLLECT
/FOREACH
方法还是这种方法都能达到相同的效果。