使用cypher删除neo4j中的所有节点和关系超出了堆空间

时间:2013-02-04 16:00:34

标签: neo4j cypher

我一直在尝试按照neo4j google群组和其他在线资源推荐的方式运行此查询:

START n =节点(*) MATCH n- [r?] - () WHERE ID(n)> 0 删除n,r;

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

[交叉发布到neo4j google群组]

6 个答案:

答案 0 :(得分:18)

上面的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;

但是,删除整个数据库目录没有任何问题,这是一种很好的做法。

答案 1 :(得分: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;

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

答案 2 :(得分:7)

问号不再起作用。使用可选匹配..以下应该有效。

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

答案 3 :(得分:4)

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

例如,你可以这样做:

MATCH(n) DETACH DELETE n;

答案 4 :(得分:0)

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

答案 5 :(得分:0)

我在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/