2016-12-06 48 views
1

我想使用Cypher删除与Neo4j数据库中的特定节点相关的连接图形。用例是删除“开始”节点以及存在起始节点路径的所有节点。为了限制交易,查询必须是迭代的,并且不得断开连接的图。使用Cypher删除连接的图形

直到现在我使用此查询:

OPTIONAL MATCH (start {indexed_prop: $PARAM})--(toDelete) 
OPTIONAL MATCH (toDelete)--(toBind) 
WHERE NOT(id(start) = id(toBind)) AND NOT((start)--(toBind)) 
WITH start, collect(toBind) AS TO_BIND, toDelete limit 10000 
DETACH DELETE toDelete 
WITH start, TO_BIND 
UNWIND TO_BIND AS b 
CREATE (start)-[:HasToDelete]->(b) 

,并调用它,直到删除节点等于0

有没有更好的查询呢?

+0

我认为你试过了所有连接节点的可变长度路径和每个连接节点的DETACH DELETE?这是否炸毁你的堆? – InverseFalcon

+0

是的,但问题是查询不适用于大图,多次调用查询可能会破坏连接的图。 – cde

回答

1

您可以尝试一种标记和删除方法,它类似于如何使用变量匹配来分离和删除整个连接图,但不使用DETACH DELETE,而是应用TO_DELETE标签。

像这样(做了一个标签使用的起始节点,否则它梳理整个数据库寻找一个节点与索引PARAM):

MATCH (start:StartNodeLabel {indexed_prop: $PARAM})-[*]-(toDelete) 
SET toDelete:TO_DELETE 

如果炸毁你的堆,可以多次运行它,并在SET之前添加谓词WHERE NOT toDelete:TO_DELETE,并使用LIMIT和/或可变长度关系深度的限制的组合。

如果您确定已经标记了每个连接的节点,那么这只是删除TO_DELETE标签中的每个节点,您可以反复运行,或使用APOC过程apoc.periodic.commit()分批处理。