如何提高 NEO4J 中 LOAD CSV 的性能
How to improve performance of LOAD CSV in NEO4J
我正在使用 neo4j.I 的社区版,我正在尝试使用 CSV 创建 50000 个节点和 93400 个关系 file.But neo4j 中的加载 csv 命令需要大约 40 分钟来创建节点和关系。
使用 python 中的 py2neo 包进行连接,运行 cypher queries.Load csv 命令类似于以下命令:
USING PERIODIC COMMIT LOAD CSV WITH HEADERS FROM "file:///Sample.csv" AS row WITH row
MERGE(animal:Animal { name:row.`ANIMAL_NAME`})
ON CREATE SET animal{name:row.`ANIMAL_NAME`,type:row.`TYPE`, status:row.`Status`, birth_date:row.`DATE`}
ON MATCH SET animal +={name:row.`ANIMAL_NAME`,type:row.`TYPE`,status:row.`Status`,birth_date:row.`DATE`}
MERGE (person:Person { name:row.`PERSON_NAME`})
ON CREATE SET person ={name:row.`PERSON_NAME` age:row.`AGE`, address:row.`Address`, birth_date:row.`PERSON_DATE`}
ON MATCH SET person += { name:row.`PERSON_NAME`, age:row.`AGE`, address:row.`Address`, birth_date:row.`PERSON_DATE`}
MERGE (person)-[:OWNS]->(animal);
Infrastructure Details:
dbms.memory.heap.max_size=16384M
dbms.memory.heap.initial_size=2048M
dbms.memory.pagecache.size=512M
neo4j_version:3.3.9
我如何让它提前工作faster.Thanks
理想情况下,您应该使用最新的 neo4j 版本,因为自 3.3.9 以来已经有了很多性能改进。由于您已经在 :Animal(name)
和 :Person(name)
上建立了索引,另一个主要问题可能是 Cypher 规划器正在生成昂贵的 Eager operation (at least in neo4j 4.0.3) for your query. Whenever you have performance issues, you. should use EXPLAIN
or PROFILE
以查看 Cypher 规划器生成的操作。
尝试使用这个更简单的查询(它应该与您的查询执行相同的操作)。在neo4j 4.0.3中使用EXPLAIN
,这个查询没有使用Eager操作:
:auto USING PERIODIC COMMIT LOAD CSV WITH HEADERS FROM "file:///Test.csv" AS row
MERGE(animal:Animal {name: row.`ANIMAL_NAME`})
SET animal += {type:row.`TYPE`, status:row.`Status`, birth_date:row.`DATE`}
MERGE (person:Person { name:row.`PERSON_NAME`})
SET person += {age:row.`AGE`, address:row.`Address`, birth_date:row.`PERSON_DATE`}
MERGE (person)-[:OWNS]->(animal);
neo4j 4.x中使用USING PERIODIC COMMIT
时需要:auto
命令。
我正在使用 neo4j.I 的社区版,我正在尝试使用 CSV 创建 50000 个节点和 93400 个关系 file.But neo4j 中的加载 csv 命令需要大约 40 分钟来创建节点和关系。 使用 python 中的 py2neo 包进行连接,运行 cypher queries.Load csv 命令类似于以下命令:
USING PERIODIC COMMIT LOAD CSV WITH HEADERS FROM "file:///Sample.csv" AS row WITH row
MERGE(animal:Animal { name:row.`ANIMAL_NAME`})
ON CREATE SET animal{name:row.`ANIMAL_NAME`,type:row.`TYPE`, status:row.`Status`, birth_date:row.`DATE`}
ON MATCH SET animal +={name:row.`ANIMAL_NAME`,type:row.`TYPE`,status:row.`Status`,birth_date:row.`DATE`}
MERGE (person:Person { name:row.`PERSON_NAME`})
ON CREATE SET person ={name:row.`PERSON_NAME` age:row.`AGE`, address:row.`Address`, birth_date:row.`PERSON_DATE`}
ON MATCH SET person += { name:row.`PERSON_NAME`, age:row.`AGE`, address:row.`Address`, birth_date:row.`PERSON_DATE`}
MERGE (person)-[:OWNS]->(animal);
Infrastructure Details:
dbms.memory.heap.max_size=16384M
dbms.memory.heap.initial_size=2048M
dbms.memory.pagecache.size=512M
neo4j_version:3.3.9
我如何让它提前工作faster.Thanks
理想情况下,您应该使用最新的 neo4j 版本,因为自 3.3.9 以来已经有了很多性能改进。由于您已经在 :Animal(name)
和 :Person(name)
上建立了索引,另一个主要问题可能是 Cypher 规划器正在生成昂贵的 Eager operation (at least in neo4j 4.0.3) for your query. Whenever you have performance issues, you. should use EXPLAIN
or PROFILE
以查看 Cypher 规划器生成的操作。
尝试使用这个更简单的查询(它应该与您的查询执行相同的操作)。在neo4j 4.0.3中使用EXPLAIN
,这个查询没有使用Eager操作:
:auto USING PERIODIC COMMIT LOAD CSV WITH HEADERS FROM "file:///Test.csv" AS row
MERGE(animal:Animal {name: row.`ANIMAL_NAME`})
SET animal += {type:row.`TYPE`, status:row.`Status`, birth_date:row.`DATE`}
MERGE (person:Person { name:row.`PERSON_NAME`})
SET person += {age:row.`AGE`, address:row.`Address`, birth_date:row.`PERSON_DATE`}
MERGE (person)-[:OWNS]->(animal);
neo4j 4.x中使用USING PERIODIC COMMIT
时需要:auto
命令。