我有以下查询来导入巨大的CSV数据集:
USING PERIODIC COMMIT
LOAD CSV WITH HEADERS FROM "file:///data_ssd/world/test.csv" AS line
WITH line
WHERE line.lang IS NOT NULL
MATCH (i:Item {id: line.id})
MERGE (s:String {value: line.name, lang: line.lang})
CREATE (i)-[:name]->(s)
CSV包含约5300个项目。已经创建了所有:Item
(大约约15米;因此MATCH
);我只是错过了:String
和关系。
neo4j消耗大约10 GB的内存,现在查询运行时间为1小时,但是仍然没有一个:String
或关系插入到数据库中。 neo4j以100%CPU运行。这是一个不同于我运行的第一个查询的行为,我插入了所有:Item
s(我看到节点计数器随着时间的推移快速增加)。
我的LOAD CSV
命令有什么问题吗?
更新:在:Item(id)
,:String(value)
和:String(lang)
上创建了索引。
答案 0 :(得分:1)
我的第一个想法:你确定你有任何一行lang
属性吗?
[EDITED]此外,尝试减少每个定期提交的批量大小。默认值为1000行。例如:USING PERIODIC COMMIT 500
指定批量大小为500。
另外,我看到一个可能的逻辑错误,但它不应该是你的主要问题的原因(“没有”发生)。
逻辑错误是这样的:即使MERGE
子句找到了现有的(s:String)
节点,CREATE
子句将始终继续创建(又是另一个)[:name]
i
和s
之间的关系(即使已存在一个或多个)。
你可能意味着这样的事情,而不是:
USING PERIODIC COMMIT
LOAD CSV WITH HEADERS FROM "file:///data_ssd/world/test.csv" AS line
WITH line
WHERE line.lang IS NOT NULL
MERGE (i:Item {id: line.id})-[:name]->(s:String {value: line.name, lang: line.lang})