如何在Neo4j中使用单个查询删除所有子节点和关系?

Has*_*tha 3 neo4j cypher

我的Neo4j DB中有一个像节点结构的树。删除特定节点时,我要删除所有子节点以及与该节点相关的关系。考虑以下查询生成的节点结构,

merge (p1:Person{nic:'22222v'})-[r1:R1]->(p2:Person{nic:'33333v'}) 
merge(p1)-[r2:R2]->(p3:Person{nic:'44444v'}) 
merge(p2)-[r3:R3]->(p3) 
merge (p3)-[r4:R4]->(p4:Person{nic:'55555v'}) 
merge(p4)-[r5:R5]->(p5:Person{nic:'66666v'}) 
return r1,r2,r3,r4,r5
Run Code Online (Sandbox Code Playgroud)

如果我输入节点(nic:44444v),则应删除节点(nic:44444v),节点(nic:55555v),节点(nic:66666v),关系(r2),关系(r3),关系(r4)和关系( r5)

Chr*_*sen 6

您可以使用多个深度关系并删除节点:

MATCH (n:Person {nic:'44444v'})-[*0..]->(x)
DETACH DELETE x
Run Code Online (Sandbox Code Playgroud)

0..深度定义将嵌入n在标识x节点,从而将处理该人没有子节点的情况。

较旧的neo4j版本的替代语法:

MATCH (n:Person {nic:'44444v'})-[*0..]->(x) 
OPTIONAL MATCH (x)-[r]-() 
DELETE r, x
Run Code Online (Sandbox Code Playgroud)

  • 无需赘述,以防万一...在这种递归操作中尝试使用关系标签。否则,如果这些节点中的任何一个碰巧与该树结构发生了某种关系而与数据库中的任何其他节点发生关系,则您将开始进行递归删除,这可能会擦除掉很大一部分,也许甚至所有您的数据库。即使在您当前的设计中没有任何关系可以逃脱那棵树,将来的数据库更改也可能会添加其他关系,从而为以后的灾难做准备。 (2认同)