【问题标题】:How to delete all child nodes and relationships using single query in Neo4j.?如何在 Neo4j 中使用单个查询删除所有子节点和关系。?
【发布时间】:2016-07-04 08:12:24
【问题描述】:

我的 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

如果我输入 node(nic:44444v) 它应该删除 node(nic:44444v),node(nic:55555v),node(nic:66666v )、关系(r2)、关系(r3)、关系(r4)和关系(r5)

【问题讨论】:

    标签: neo4j cypher


    【解决方案1】:

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

    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 是一个里程碑版本,不确定,您应该使用稳定版本,因为 2015 年 10 月发布了 2.3 GA!你的语法错误是什么?
    • @Christophe,DETACH 又给了我一个语法错误,我认为我的版本不支持它。
    • @Hasitha 会很高兴发布您收到的语法错误。无论如何,我为旧版本添加了另一种语法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-24
    相关资源
    最近更新 更多