如何在neo4j中以相反的顺序删除节点

时间:2015-12-29 14:59:55

标签: neo4j cypher

我有一个包含

等节点的数据库
(u : Update)-[:HAS_COMMENT]->(latest_comment:Comment)-[:NEXT]->(c1: Comment)->(c2: Comment) 

依此类推..每个Comment节点都与User node

有关系
(c : Comment)<-[:HAS_COMMENTED]-(u : User).

现在我必须删除更新节点,因此应删除所有注释节点,并且还应删除User和Comment之间的关系。

我想到的解决方案是从最后一个Comment节点遍历并开始删除与User节点的关系并删除Comment节点和&#34; NEXT&#34;与前一个评论节点的关系。我正面临着编写此类查询的问题。

有人可以帮我这个吗?

1 个答案:

答案 0 :(得分:1)

OPTIONAL MATCH语句中使用可变长度路径匹配路径中的所有注释(与:NEXT关系链接在一起),然后使用DETACH DELETE删除节点和关系:< / p>

MATCH (u:Update {name: "UpdateToDelete"})-[:HAS_COMMENT]->(c:Comment)
OPTIONAL MATCH (c)-[:NEXT*]->(r:Comment)
DETACH DELETE u,c,r

DETACH DELETE将删除与要删除的节点相关的节点和任何关系。

Here是要测试的Neo4j控制台。

修改

在Neo4j 2.3版中添加了DETACH DELETE语句。要在不使用DETACH DELETE的情况下完成此操作,请尝试以下查询:

MATCH (u:Update {name: "UpdateToDelete"})-[hc:HAS_COMMENT]->(c:Comment) 
MATCH (c)-[n:NEXT*0..]->(r:Comment), (r)<-[h:HAS_COMMENTED]-(:User) 
FOREACH (x IN n | DELETE x) 
DELETE r,u,hc,c,h

关键区别在于,如果不使用DETACH DELETE,我们必须匹配连接给定节点的每个关系,并在删除节点时删除这些关系。由于我们有一个可变长度路径(由任意数量的NEXT关系连接的注释),我们可以使用FOREACH函数迭代NEXT关系的集合,并在删除Comment节点时删除它们。 / p>