Cypher根据条件删除节点及其子节点

时间:2018-12-02 23:25:52

标签: neo4j cypher

我最近开始使用Neo4j(3.4.1版),并且仍在学习细微差别。我的应用程序中具有以下节点关系。 enter image description here

我要实现的目标如下。

我可以删除节点C1或C2。我也可以删除它们的对应关系(即HAS_X或HAS_Y)。

但是,当我同时删除C1和C2时,节点L1及其其他相关节点(M1,M2和M3)成为孤立的。因此,我想要的是每当删除C1或C2时,如果它是唯一与节点L1具有HAS_Y关系的节点,那么在这种情况下,节点L1及其相关节点(M1,M2和M3)也应删除。如果不是唯一一个与L1具有HAS_Y关系的节点,那么在这种情况下,我们只需删除该特定节点(即C1 / C2)即可。节点L1和其余节点保持不变。 在这两种情况下,节点U1和U2均不受影响。

我不确定如何使用单个密码查询来实现这一目标。

注意:我能够通过运行2个单独的查询(一个用于删除节点C1 / C2,另一个用于删除孤立节点L1)来实现我的目标。但是,它并不是性能最高的,因为我必须两次往返数据库。

有人能给我一些有关如何完成此任务的意见吗?我正在寻找一个cyper查询解决方案(我避免使用APOC程序atm,因为听说它需要对neo4j db config进行一些修改)

此致

V

1 个答案:

答案 0 :(得分:1)

您应该只用Cypher就可以做到这一点:

...// 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。此时,我们只需要对不再具有任何传入l关系的任何:HAS_Y节点采取行动。我们仅对此进行过滤,然后使用具有0..1变量关系的可选匹配项来捕获l节点和它们之间具有:HAS_Z关系的子级,然后删除所有这些节点( l及其所有可能的子对象都将通过toDelete寻址。