Neo4j Cypher根据条件删除节点及其子节点
我最近开始使用Neo4j版本3.4.1,但仍在学习其中的细微差别。在我的应用程序中,我有以下节点关系。 我正在努力实现以下目标 我可以删除节点C1或C2。我也可以删除它们的对应关系,即HAS_X或HAS_Y 但是,当我同时删除C1和C2时,节点L1及其其他相关节点M1、M2和M3将成为孤立节点。因此,我想要的是,每当我删除C1或C2时,如果它是唯一一个与节点L1有Y关系的节点,那么在这种情况下,节点L1及其相关节点M1、M2和M3也应该被删除。如果它不是唯一一个与L1有Y关系的节点,在这种情况下,我们只需删除该特定节点,即C1/C2。节点L1和其余节点保持未拉伸状态。 节点U1和U2在这两种情况下都不受影响 我不确定如何使用单个密码查询实现这一点 注意:我能够通过运行两个单独的查询来实现我的目标:一个用于删除节点C1/C2,另一个用于删除孤立节点L1。然而,这并不是最有效的,因为我必须往返两次到db 有人能给我一些关于如何完成这项任务的建议吗?我正在寻找一个cyper查询解决方案,我正在避免APOC程序,因为我听说它需要对neo4jdb配置进行一些修改 问候,Neo4j Cypher根据条件删除节点及其子节点,neo4j,cypher,Neo4j,Cypher,我最近开始使用Neo4j版本3.4.1,但仍在学习其中的细微差别。在我的应用程序中,我有以下节点关系。 我正在努力实现以下目标 我可以删除节点C1或C2。我也可以删除它们的对应关系,即HAS_X或HAS_Y 但是,当我同时删除C1和C2时,节点L1及其其他相关节点M1、M2和M3将成为孤立节点。因此,我想要的是,每当我删除C1或C2时,如果它是唯一一个与节点L1有Y关系的节点,那么在这种情况下,节点L1及其相关节点M1、M2和M3也应该被删除。如果它不是唯一一个与L1有Y关系的节点,在这种情况
V您只需使用密码即可完成此操作:
...// above is your match to 'c', the node to delete
OPTIONAL MATCH (c)-[:HAS_Y]->(l)
DETACH DELETE c
WITH DISTINCT l
WHERE size(()-[:HAS_Y]->(l)) = 0
OPTIONAL MATCH (l)-[:HAS_Z*0..1]->(toDelete)
DETACH DELETE toDelete
我们首先匹配l,然后删除c。此时,我们只需对不再具有任何传入:HAS_Y关系的任何l节点采取操作。我们只对这些进行筛选,然后使用一个可选的0..1变量关系匹配来捕获l节点及其所有子节点:HAS_Z relationships,然后删除所有这些节点。l及其所有可能的子节点都将通过toDelete进行处理。谢谢@InverseFalcon.,您的解决方案非常有效。这正是我想要的。