使用 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() 来分批处理。
我想使用 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() 来分批处理。