2016-04-25 68 views
2

为了保持我的数据库从孤立的节点干净,我想删除一个节点 - 由给定的属性值标识 - 和每个相关的节点没有任何其他相关节点。Cypher删除一个节点和所有相关的节点,如果他们没有进一步的关系

这可能吗?目前,我这样做:

MATCH (poi:PointOfInterest)-[r]-(allRelatedNodes) 
WHERE poi.id="X007" 
DETACH DELETE poi, r, allRelatedNodes; 

但是,删除所有相关节点包括将连接到其他节点,如果他们不删除的人。

有没有办法删除节点和所有与其他节点没有关系的节点?


编辑由作者

的明显的答案是正确的。我终于解决了我的问题

MATCH (poi:Node)-[r*0..1]-(allRelatedNodes) 
WHERE poi.name = "A" 
AND size((allRelatedNodes)--()) < 2  
DETACH DELETE poi, allRelatedNodes; 

回答

2

如果使allRelatedNodes匹配可选,确保allRelatedNodes只需要poi一个关系,那么你应该能够仅如果它们存在删除连接到X007的人。另外,您不需要在删除语句中指定r,因为DETACH负责处理此问题。

MATCH (poi:PointOfInterest) 
WHERE poi.id = "X0007" 
WITH poi 
OPTIONAL MATCH (poi)-[r]-(allRelatedNodes) 
WHERE size((allRelatedNodes)--()) = 1  
DETACH DELETE poi, allRelatedNodes 

使用Neo4j的3.0,用下面的图开始...

Starting Sample Graph

并执行上述查询(如下所列)的亲密传真...

MATCH (poi:Node)-[r]-(allRelatedNodes) 
WHERE poi.name = "A" 
AND size((allRelatedNodes)--()) = 1  
DETACH DELETE poi, allRelatedNodes 

我留下了这张图。

enter image description here

如果不删除这一切在一个查询你也可以使用这个那个一定要照顾它。

MATCH (poi:PointOfInterest)-[r]-(allRelatedNodes) 
WHERE poi.id = "X007" 
AND size((allRelatedNodes)--()) = 1 
WITH poi, collect(allRelatedNodes) as allRelatedNodes 
DETACH DELETE poi 
WITH allRelatedNodes 
UNWIND allRelatedNodes as node 
DELETE node 
+0

这几乎是我想要的。 – Matthias

+0

但是,当有其他节点与'allRelatedNodes'有关时,这不会删除'poi'。无论如何,我需要删除“poi”! – Matthias

+0

任何想法@Dave Bennett? – Matthias

相关问题