我想删除节点的所有关系(传入和传出)(关系可以在许多不同的节点上进行)
就像是 :
开始 n=node:(1000) MATCH n<-[r]->anynode DELETE r
不起作用,因为这里的“anynode”被解释为匹配的“第一个”链接节点。
有任何想法吗?
你要:
start n=node(1000)
match n-[r]-()
delete r;
在尝试删除所有关系作为更大更新操作的一部分时,我使用@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
方法都将达到相同的效果。