3

我想删除节点的所有关系(传入和传出)(关系可以在许多不同的节点上进行)

就像是 :

开始 n=node:(1000) MATCH n<-[r]->anynode DELETE r

不起作用,因为这里的“anynode”被解释为匹配的“第一个”链接节点。

有任何想法吗?

4

2 回答 2

13

你要:

start n=node(1000) 
match n-[r]-() 
delete r;
于 2013-01-25T02:13:43.497 回答
0

在尝试删除所有关系作为更大更新操作的一部分时,我使用@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方法都将达到相同的效果。

于 2017-03-23T23:38:17.737 回答