我使用导入工具读取了大约100万个节点。现在是时候建立关系了。 (不幸的是,如果你想使用导入工具,你必须在csv中明确预定关系,所以这是不可能的。)
我做的第一件事就是在节点上放置一个索引。
接下来,我写了这个,我想知道是我的问题 - 即使有索引,这个陈述可能会导致过多的笛卡尔产品?:
USING PERIODIC COMMIT 500
LOAD CSV WITH HEADERS FROM
'file:///home/monica/...relationship.csv' AS line
MATCH (p1:Player {player_id: line.player1_id}), (p2:Player {player_id: line.player2_id})
MERGE (p1)-[:VERSUS]-(p2)
显然USING PERIODIC COMMIT 500
没有帮助,因为我收到了错误,
Java heap space
谷歌搜索,我了解到在neo4j-wrapper.conf文件中更改我的内存设置可能有所帮助,所以我将设置一直更改为4GB(我有一个8 GB的系统):
wrapper.java.initmemory=4096
wrapper.java.maxmemory=4096
仍有同样的错误。
现在,我被困住了。除此之外,我想不出任何其他策略:
1)重写声明
2)使用具有更多RAM的系统?
3)找到一些其他方式分批运行它?
任何建议都很棒。感谢neo4j SO社区提前。
答案 0 :(得分:1)
:Player(player_id)
上有索引或唯一约束吗?如果是前者,则删除索引并添加唯一约束。否则,可能有多个Player节点共享相同的player_id
- 这可能会导致笛卡尔积,假设你有10倍于同一个播放器,这将最终为你的csv的每一行100个组合。
一旦你确定没有这样的重复,接下来要检查的是EagerPipe
。如果查询计划(没有PERIODIC COMMIT
)
EXPLAIN LOAD CSV WITH HEADERS FROM
'file:///home/monica/...relationship.csv' AS line
MATCH (b1:Player {player_id: line.player1_id}), (p2:Player {player_id: line.player2_id})
MERGE (p1)-[:VERSUS]-(p2)
显示的内容为eager
,但未应用PERIODIC COMMIT
,有关详细信息,请参阅http://www.markhneedham.com/blog/2014/10/23/neo4j-cypher-avoiding-the-eager/。
使用最近的Neo4j版本可能会发生这种情况的情况越来越少。
我刚刚意识到您在匹配中使用b1
并在合并中使用p1
- 因此后者不存在并在合并期间创建为新节点。
请你试试:
USING PERIODIC COMMIT 500
LOAD CSV WITH HEADERS FROM
'file:///home/monica/...relationship.csv' AS line
MATCH (p1:Player {player_id: line.player1_id})
MATCH (p2:Player {player_id: line.player2_id})
MERGE (p1)-[:VERSUS]-(p2)