【问题标题】:How to improve performance of LOAD CSV in NEO4J如何在 NEO4J 中提高 LOAD CSV 的性能
【发布时间】:2020-05-14 19:14:15
【问题描述】:

我正在使用 neo4j 的社区版。我正在尝试使用 CSV 文件创建 50000 个节点和 93400 个关系。但是 neo4j 中的加载 csv 命令需要大约 40 分钟来创建节点和关系。 在 python 中使用 py2neo 包连接和运行 cypher 查询。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

如何让它更快地工作。在此先感谢

【问题讨论】:

  • 您的查询中有多个语法错误。你能显示你的实际查询(并使用多行使其可读)吗?
  • @cybersam 感谢您的回复。我编辑了查询以使其更具可读性,但真正的问题是如何提高性能,可以通过增加资源或优化查询来实现。顺便说一句,我是在此查询之前创建节点索引
  • 您仍然有一些语法错误,但我可以对您要执行的操作做出有根据的猜测。您已经拥有哪些索引?另外,你真的需要更新已经存在的节点的属性吗?你用的是什么neo4j版本?
  • 语法错误是因为我不得不稍微修改查询,但实际运行成功。我正在使用'CREATE INDEX ON:Animal(name)\ n'为节点Animal和Person创建索引。是的,如果数据发生变化,我需要更新属性。
  • neo4j_version:3.3.9

标签: neo4j cypher load-csv


【解决方案1】:

理想情况下,您应该使用最新的 neo4j 版本,因为自 3.3.9 以来已经有许多性能改进。由于您已经在:Animal(name):Person(name) 上有索引,另一个主要问题可能是Cypher 规划器正在为您的查询生成昂贵的Eager 操作(至少在neo4j 4.0.3 中)。每当您遇到性能问题时,您。应该使用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 命令。

【讨论】:

  • 感谢您的意见,将尝试您的建议。希望它工作得更快
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-06
  • 2013-07-23
  • 2012-12-21
  • 1970-01-01
  • 2019-04-05
相关资源
最近更新 更多