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

如何在Neo4j中使用单个查询删除所有子节点和关系。?,neo4j,cypher,Neo4j,Cypher,我的Neo4j数据库中有一个树状节点结构。删除特定节点时,我希望删除与该节点相关的所有子节点和关系。 考虑以下查询生成的节点结构, 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{ni

我的Neo4j数据库中有一个树状节点结构。删除特定节点时,我希望删除与该节点相关的所有子节点和关系。 考虑以下查询生成的节点结构,

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
如果我输入节点(nic:44444 V),它应该删除节点(nic:44444 V)、节点(nic:55555 V)、节点(nic:66666 V)
),关系(r2)、关系(r3)、关系(r4)和关系(r5)

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

MATCH (n:Person {nic:'44444v'})-[*0..]->(x)
DETACH DELETE x
0..
深度定义将在
x
节点中嵌入
n
标识符,从而处理人员没有子节点的情况

旧neo4j版本的替代语法:

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

也许不需要说,但以防万一。。。尝试在这种递归操作中使用关系标签。否则,如果这些节点中的任何一个碰巧与数据库中的任何其他节点有某种关系,那么您将启动一个递归删除,它可能会删除数据库中的一部分,甚至全部。即使在您当前的设计中没有脱离该树的关系,未来的数据库更改也可能会添加其他关系,为以后的灾难做好准备。@Christophe,您的查询在Neo4j 2.3.0-M02中工作吗。因为它给了我语法错误。M02是一个里程碑式的版本,不确定,你应该使用一个稳定的版本,因为2.3 GA是在2015年10月发布的!你的语法错误是什么?@Christophe,DETACH又给了我一个语法错误,我想我的版本不支持它。@Hasitha很乐意发布你得到的语法错误。无论如何,我为旧版本添加了另一种语法。