13

我一直在尝试按照 neo4j 谷歌组和其他在线资源中的建议运行此查询:

START n = node(*) MATCH n-[r?]-() WHERE ID(n)>0 DELETE n, r;

为了删除测试之间的所有节点和关系。当我从控制台执行此操作时,我用完了 java 堆空间。当我从 python 执行此操作时(使用新出现的 graph_db.clear(),它使用相同的查询),我得到一个“SystemError:None”,我认为这是相同的 java 堆空间错误。我有一个包含 500k 个节点、只有 5k 个关系和 7M 个属性的数据库。我正在使用 neo4j-1.8.1 的 Mac 笔记本电脑 (10.6.8) 上运行 8GB RAM。我想我有点惊讶删除节点(基本上没有关系,所以非常小的子图)会超过 java 堆空间,但我对 neo4j 的工作原理非常天真。任何有关如何前进的建议表示赞赏。我确实知道数据目录中的 rm -rf 并从头开始会起作用,但我认为可能有一个不那么激烈的解决方案。

[交叉发布到 neo4j 谷歌群组]

4

6 回答 6

19

上面的 cypher 语句导致所有节点(除了 ID 为 0 的根节点)在一个事务中在删除之前被实例化。当使用 500k 个节点时,这会占用太多内存。

尝试将要删除的节点数量限制在 10k-50k 左右,例如:

START n = node(*) 
MATCH n-[r?]-() 
WHERE (ID(n)>0 AND ID(n)<10000) 
DELETE n, r;

START n = node(*) 
MATCH n-[r?]-() 
WHERE (ID(n)>0 AND ID(n)<20000) 
DELETE n, r;

等等

但是,删除整个数据库目录并没有错,这是一种很好的做法。

于 2013-02-04T16:50:25.343 回答
10

根据 neo4j 文档,删除图形是通过以下方式完成的:

MATCH (n)
OPTIONAL MATCH (n)-[r]-()
DELETE n,r;

为避免 java 堆空间错误,我将此代码与 LIMIT 结合使用:

MATCH (n)
OPTIONAL MATCH (n)-[r]-()
WITH n,r LIMIT 100000 DELETE n,r;

它可以减少节点数量,最终让我们使用第一个、推荐的和更通用的代码。

于 2015-05-28T13:40:07.257 回答
7

问号不再起作用。使用可选匹配..下面应该工作。

               START n = node(*) 
               OPTIONAL MATCH n-[r]-() 
               WHERE (ID(n)>0 AND ID(n)<10000) 
               DELETE n, r;
于 2014-09-17T05:33:49.787 回答
4

从 Neo4j 2.3.3 开始,引入了一种删除节点和关系的新方法。请参阅2.3.3 文档

例如,您可以这样做:

MATCH(n) DETACH DELETE n;
于 2016-04-22T02:18:25.070 回答
1

我在 Neo4J 知识库 [1] 中找到了更好的解决方案:

CALL apoc.periodic.iterate(
    "MATCH (n) RETURN n",
    "DETACH DELETE n",
    {batchSize:1000}
)
YIELD batches, total RETURN batches, total

[1] - https://neo4j.com/developer/kb/large-delete-transaction-best-practices-in-neo4j/

于 2019-08-01T10:30:44.820 回答
0

您可以增加neo4j属性中的堆空间并启用 gc 日志并观察堆空间的上升(如果它真的接近上限)。页面缓存大小需要根据您的初始大小减少或增加。...减少/增加它并检查对加载时间的影响。 neo4j是否需要内存...需要尽可能大的堆大小。

于 2016-12-07T07:50:25.453 回答