Neo4j / Cypher:删除节点的所有关系

3
我希望删除一个节点的所有关系(包括入度和出度),这些关系可能连接到许多不同的节点。
可以尝试以下语句:
start n=node:(1000) MATCH n<-[r]->() DELETE r 这段代码中,空括号表示匹配任何节点,可以删除与节点n相关的所有关系。之前的查询无效是因为“anynode”被解释为第一个匹配的链接节点。
2个回答

13

你想要:

start n=node(1000) 
match n-[r]-() 
delete r;

2
在我看来,是的。 :P - Eve Freeman

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方法还是这种方法都能达到相同的效果。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接