如何加速Neo4j的CSV文件导入?3.3MB数据导入慢的优化咨询
优化Neo4j CSV导入速度的方案
你的导入操作耗时过长,核心原因是未给节点属性建立索引,导致每次MERGE节点时都要执行全表扫描;同时默认的事务提交批次太小、不必要的返回操作也会拖慢整体速度。以下是具体优化方案:
1. 先创建唯一约束/索引
为person节点的name字段创建唯一约束,既能保证节点唯一性,又能让MERGE操作快速定位节点,避免全表扫描:
CREATE CONSTRAINT person_name_unique FOR (p:person) REQUIRE p.name IS UNIQUE;
2. 优化LOAD CSV语句
使用USING PERIODIC COMMIT增大事务提交批次,减少提交开销;同时移除不必要的RETURN *,避免资源浪费:
USING PERIODIC COMMIT 1000 LOAD CSV WITH HEADERS FROM 'file:///Musae-Github.csv' as line WITH toInteger(line.source) AS Source, toInteger(line.destination) AS Destination MERGE (a:person {name: Source}) MERGE (b:person {name: Destination}) MERGE (a)-[:Friend]->(b)
注:
PERIODIC COMMIT的数值可根据硬件调整(如2000、5000),找到最优批次;原代码中关系类型Freind为拼写错误,建议修正为Friend。
3. 拆分导入(可选,进一步提速)
如果数据中边的数量较多,可拆分两步导入:先导入所有唯一节点,再导入边,减少节点重复处理的开销:
第一步:导入所有唯一节点
USING PERIODIC COMMIT 1000 LOAD CSV WITH HEADERS FROM 'file:///Musae-Github.csv' as line UNWIND [toInteger(line.source), toInteger(line.destination)] AS nodeId MERGE (p:person {name: nodeId})
第二步:导入边
USING PERIODIC COMMIT 1000 LOAD CSV WITH HEADERS FROM 'file:///Musae-Github.csv' as line MATCH (a:person {name: toInteger(line.source)}) MATCH (b:person {name: toInteger(line.destination)}) MERGE (a)-[:Friend]->(b)
此方式下,MATCH操作利用已建立的索引快速定位节点,比重复MERGE节点效率更高。
内容的提问来源于stack exchange,提问作者bahzad
相关产品推荐
相关产品推荐

