我有一个包含
等节点的数据库(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;与前一个评论节点的关系。我正面临着编写此类查询的问题。
有人可以帮我这个吗?
答案 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>