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

使用cypher删除neo4j中的所有节点和关系超出了堆空间,neo4j,cypher,Neo4j,Cypher,我一直在尝试按照neo4j google group和其他在线来源的建议运行此查询: 开始n=节点(*) 匹配n-[r?]-() 其中ID(n)>0 删除n,r 以删除测试之间的所有节点和关系。从控制台执行此操作时,java堆空间将耗尽。当我从python中执行此操作时(使用新出现的graph_db.clear(),它使用相同的查询),我会得到一个“SystemError:None”,我认为这是相同的java堆空间错误。我有一个数据库,有500k个节点,只有5k个关系和700个属性。我在一台Ma

我一直在尝试按照neo4j google group和其他在线来源的建议运行此查询:

开始n=节点(*) 匹配n-[r?]-() 其中ID(n)>0 删除n,r

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


[cross posted to neo4j google groups]

上面的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;
START n=node(*)
匹配n-[r?]-()

其中(ID(n)>0,ID(n)0和ID(n)问号不再有效。请使用可选匹配。下面的选项应该有效

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

根据neo4j文件,其中(ID(n)>0且ID(n),通过以下方式删除图形:

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;

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

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

例如,您可以执行以下操作:

MATCH(n) DETACH DELETE n;

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

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

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

[1]-

是的,+1关于删除数据库文件夹。我应该考虑限制删除中的节点数。感谢您的提示。不过,很明显,解决方法似乎是删除数据库目录。问号不再用于可选模式。在Neo4j的最新版本中,有必要更改:OPT的匹配子句匹配n-[r]()读取开始也被淘汰,因此它将是匹配(n)可选匹配(n)-[r]->()DELETE n,rI也必须同意。当我试图找到正确的模式时,我发现自己不断地删除数据库……这在很多方面都是一个反复试验的过程。在with之后分页更方便、更合理:
START n=node(*)MATCH n-[r?]-()使用n,r LIMIT 10000删除n,r;
@MichaelHunger不应该是:
START n=node(*)使用n LIMIT 10000匹配n-[r?]-()删除n,r;
?+1。您将得到一个“问号不再用于可选模式-改用可选匹配”在上面的例子中,这适用于小数据集,但在大数据库上浪费了我的Java堆空间