使用 Cypher 删除连通图

Delete a connected graph with Cypher

我想使用 Cypher 删除与 Neo4j 数据库中特定节点相关的连通图。用例是删除 "start" 节点和存在起始节点路径的所有节点。为了限制事务,查询必须是迭代的并且不能断开连接的图。

到目前为止,我一直在使用这个查询:

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。

有更好的查询吗?

您可以尝试标记和删除方法,这类似于您使用变量匹配分离和删除整个连接图的方式,但您可以应用 :TO_DELETE 标签而不是 DETACH DELETE。

类似这样的事情(构成一个用于起始节点的标签,否则它必须梳理整个数据库以寻找具有索引参数的节点):

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

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

当你确定你已经标记了每个连接的节点时,那么只需删除 TO_DELETE 标签中的每个节点,你可以 运行 迭代,或使用 APOC程序 apoc.periodic.commit() 来分批处理。