Neo4j 中大型删除事务的最佳实践
为了获得最佳性能并避免对系统其他部分产生负面影响,请在处理大型删除时考虑以下最佳实践。
首先确定您所处的状况
-
删除整个图数据库,以便您可以从头开始重建。
-
删除图数据库中的一大部分,或在 MATCH 语句中标识的大量节点/关系。
-
根据具体情况,可能有不同的建议。按顺序依次查看它们
在删除整个图数据库时,
在 Neo4j 4.x EE 中,您可以直接切换到系统数据库并发出 DROP DATABASE xxx;
和 CREATE DATABASE xxx;
语句。
对于社区版和旧版本:停止数据库,重命名/删除图存储
-
4.x CE
data/databases/neo4j
和data/transactions/neo4j
-
4.x 之前版本
data/databases/graph.db
-
3.x 之前版本
data/graph.db
目录,然后启动数据库。
这将为您构建一个全新的空数据库。
如果您需要从图数据库中删除大量对象,则需要注意不要构建一个过大的单一事务,否则会导致 Java OUT OF HEAP 错误。
使用以下示例以批次删除匹配记录的子集,直到完成整个删除过程
如果您的节点每个节点具有超过 100 个关系((100+1)*10k=>1010k 次删除),则减少批次大小或查看底部的建议。 |
在 4.4 及更高版本中,您可以使用 CALL {} IN TRANSACTIONS
语法。
MATCH (n:Foo) where n.foo='bar'
CALL { WITH n
DETACH DELETE n
} IN TRANSACTIONS OF 10000 ROWS;
从 3.x 版本开始,并使用 APOC
call apoc.periodic.iterate("MATCH (n:Foo) where n.foo='bar' return id(n) as id", "MATCH (n) WHERE id(n) = id DETACH DELETE n", {batchSize:10000})
yield batches, total return batches, total
3.x 之前版本
// Find the nodes you want to delete
MATCH (n:Foo) where n.foo = 'bar'
// Take the first 10k nodes and their rels (if more than 100 rels / node on average lower this number)
WITH n LIMIT 10000
DETACH DELETE n
RETURN count(*);
继续运行此语句,直到它返回 0(零)条记录。
对于 Neo4j 2.3 之前的版本,请运行
// Find the nodes you want to delete
MATCH (n:Foo) where n.foo = 'bar'
// Take the first 10k nodes and their rels (if more than 100 rels / node on average lower this number)
WITH n LIMIT 10000
MATCH (n)-[r]-()
DELETE n,r
RETURN count(*);
在所有示例中,我们以 10k 的批次大小执行删除操作。如果要删除的节点具有大量关系,这仍然可能导致超出堆错误。
例如,如果要删除的节点有 100 万个 :FOLLOWS
关系,那么删除此单个节点将包括删除此 1 个节点和 100 万个 :FOLLOWS
关系。
对于具有大量关系或节点度数差异很大的节点,单个 DETACH DELETE
仍然可能超过事务堆边界。在这种情况下,最好先以批次删除关系,然后再删除节点。以下是 Neo4j 4.4.x 及更高版本的示例
MATCH (n:Foo)-[r]-() where n.foo='bar'
// delete relationships
CALL { WITH r
DELETE r
} IN TRANSACTIONS OF 10000 ROWS
// reduce cardinality
WITH distinct n
// delete nodes
CALL { WITH n
DELETE n
} IN TRANSACTIONS OF 10000 ROWS;
此外,请考虑查看知识库文档 如何避免在涉及密集节点的删除操作中使用过多的内存
,以获取其他注意事项。
此页面对您有帮助吗?