【问题标题】:Why import a 10X bigger file takes way more time than 10X time of the orginal fiel in Neo4j?为什么导入一个 10 倍大的文件比 Neo4j 中原始文件的 10 倍花费更多的时间?
【发布时间】:2014-08-06 22:21:47
【问题描述】:

您好,我正在尝试通过 csv 文件将数据导入 Neo4j。

假设我有 10 个 csv 文件,每个文件大约有 3000 行和 2 列。都是一样的格式。

当我导入一个文件时,大约需要 30 秒,但是当我将 10 个 csv 文件组合成一个现在有 30000 行和 2 列的大 csv 文件并尝试使用相同的代码导入它时,需要花费很多时间和永远之后它给出一个“UnknowError”。有谁知道为什么会这样?

【问题讨论】:

  • 你能分享你用来加载文件的代码吗?

标签: csv neo4j


【解决方案1】:

使用 NEO4J 2.1.3

这应该表现得足够好,并且对于多达 10M 行的文件可以线性扩展:

CREATE INDEX ON :Label(id);

USING PERIODIC COMMIT 1000
LOAD CSV FROM "file:///home/me/import/data.csv" AS line
WITH distinct line[0] as id
MERGE (:Label {id:id});

USING PERIODIC COMMIT 1000
LOAD CSV FROM "file:///home/me/import/data.csv" AS line
WITH distinct line[1] as id
MERGE (:Label {id:id});

USING PERIODIC COMMIT 1000
LOAD CSV FROM "file:///home/me/import/data.csv" AS line
WITH line[0] as id1, line[1] as id2
MATCH (n1:Label {id:id1})
MATCH (n2:Label {id:id2})
CREATE (n1)-[:REL]->(n2)
;

原因是:

  • 更复杂的合并/匹配 + 创建操作急切地拉入所有文件内容,以将匹配与数据创建分开
  • tx-size 过大的定期提交会影响查找时间
  • 约束比编写索引更昂贵,单线程插入不需要约束

关于您的问题:

  • 如果您将最后一个查询中的定期提交更改为 50 或 100k,您会看到差异。
  • 时间由 neo4j-shell 输出。
  • 您在 11 秒内导入了多少东西?
  • 超过 10M:要么更有耐心,要么使用像我的 batch-inserter 这样的东西。

【讨论】:

  • 非常感谢您再次回答我的问题!!!如果您不介意我还有 2 个关于 Neo4j 和 Cypher 的问题,它现在效果会更好。
  • 1.我没有看到与 USING PERIODIC COMMIT 1000 相关的结果??
  • 2.如果我想跟踪添加节点或关系所用的时间怎么办? “在 11432 毫秒内返回 0 行”是 11432 毫秒吗?
  • 3.如果超过 10M 怎么办?
  • 更新了对您的 3 个问题的回答。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-24
  • 2012-08-14
  • 2014-01-16
  • 2012-08-13
  • 2014-07-13
相关资源
最近更新 更多