我使用LOAD CSV WITH HEADERS
加载数据(2.8 M)记录当我尝试使用Cypher中的以下脚本创建关系时,我收到以下错误-Neo.DatabaseError.General.UnknownError - Java堆空间 我还创建了一个索引来加速关系过程。
CREATE INDEX ON :Entity(ENT_ID)
PROFILE
MATCH(Entity)
MATCH (a:Entity {ENT_ID : Entity.ENT_ID})
WITH Entity, a
MATCH (b:Entity {ENT_ID : Entity.PARENTID})
WITH a,b
MERGE (a)-[r:RELATION]->(b)
RETURN r
我已经浏览过遇到同样问题的其他链接,但没有找到相同的解决方案。因此,我正在重新提出这个问题。我的数据集有2列ENT_ID和PARENTID。我正在尝试使用上述查询创建关系。
我没有Java或Java虚拟机的背景知识。基于其他链接,我想我会通过使用以下属性来消除错误:
neo4j.conf:
dbms.memory.pagecache.size=3g
- 初始Java堆大小(以MB为单位):
wrapper.java.initmemory=1024
- 最大Java堆大小(以MB为单位):
wrapper.java.maxmemory=16000
- 其他可以提高效果的有益设置:
wrapper.java.additional.6=-d64
wrapper.java.additional.7=-server
wrapper.java.additional.8=-Xss1024k
JAVA VM调整:
-Xmx4000M
-Xms4000M
-Xmn1000M
我很感激任何帮助
编辑:
基于以下评论:我使用了以下查询:它仍然会抛出相同的Java堆空间:
PROFILE
MATCH (a:Entity)
WHERE a.PARENTID IS NOT NULL
WITH a
MATCH (b:Entity {ENT_ID : a.PARENTID})
MERGE (a)-[r:RELATION]->(b)
请帮助。
由于
答案 0 :(得分:1)
正如Usman评论的那样,MATCH(Entity)
行无用,更糟糕的是,它与数据库中的每个节点匹配,而不仅仅是:实体节点,并导致笛卡尔积。
我认为你想要的是这样的事情,处理所有:有一个parentid的实体,并从他们到他们的父母的关系:
PROFILE
MATCH (a:Entity)
WHERE a.PARENTID IS NOT NULL
WITH a
MATCH (b:Entity {ENT_ID : a.PARENTID})
MERGE (a)-[r:RELATION]->(b)
这应该避免笛卡尔积,并且是复杂度n,其中n是实体节点的数量。
我删除了RETURN,因为您可能不希望返回数百万个关系。之后,如果您想要计算这些关系,可以使用:
MATCH (:Entity)-[r:Relation]->(:Entity)
RETURN COUNT(r)