【问题标题】:Neo4j Performance for large dataset大型数据集的 Neo4j 性能
【发布时间】:2016-08-28 05:59:46
【问题描述】:

我正在尝试将大型数据集加载到 neo4j-3 并寻找选项。我找到了一个 neo4j-import,但问题在于它仅用于初始加载。我每周必须加载 2M 条记录。 我尝试通过 shell 加载,但遇到了一些性能问题,我尝试了以下操作。 1)预先创建约束。 2)在单独的查询中创建节点和关系。 3)堆空间8G 4) dbms.memory.pagecache 4G

很多时候导入只是挂起,几个小时什么都不做。

编辑 - 正在执行 CSV 加载:

USING PERIODIC COMMIT 5000
LOAD CSV WITH HEADERS
FROM "file:///my_sds_39_joe.csv"
AS row
OPTIONAL MATCH (per:Person {UID : "Person."+row.player_cardnum})
WHERE per IS NULL
MERGE (p:Person {CardNumber : row.player_cardnum})
ON CREATE SET p.Creation Date = timestamp(), p.Modification Date = timestamp() ;

【问题讨论】:

  • 如何加载数据?
  • 我正在使用从 neo4j-shell 加载 CSV 命令。
  • @user2813165 请务必通过编辑您的问题来添加详细信息,而不是隐藏在 cmets 中(尤其是代码/查询,它们作为 cmets 相当不可读)。我编辑了您的问题以包含您评论中的 csv-load,因此您现在应该删除评论。
  • 谢谢..我会记住的..

标签: neo4j cypher


【解决方案1】:

编辑

再看一遍,您似乎正在尝试对插入实现某种条件逻辑。

看起来您要做的是确定是否存在带有 UID 的 :Person(源自与 row.player_cardnum 的某些串联),以及在该 :Person 不存在且匹配的情况下失败,MERGE a :拥有由 row.player_cardnum 给出的 CardNumber 的人。

如果这是您的目标,那么您的查询几乎就完成了。问题在于您的 WHERE 子句。

了解WHERE 子句与前面的MATCHOPTIONAL MATCHWITH 链接,并且只影响链接的子句。

OPTIONAL MATCH 上加上WHERE,per 将始终为空,但更重要的是,您的行仍然存在,并且以下MERGE 将始终发生在CSV 中的所有行上。这可能是您速度变慢的原因,因为它正在为所有行创建新的 :Person 节点。

如果您试图在 OPTIONAL MATCH 命中现有的 :Person 时完全取消该行(因此 MERGE 在这种情况下不会发生),您需要添加一个 WITH子句,并确保将 WHERE 子句应用于它而不是 OPTIONAL MATCH

此外,请确保您在 Person.UID 和 Person.CardNumber 上具有唯一约束或索引。至于UID匹配,我听说当你匹配的东西有某种字符串连接时不使用索引,所以你可能需要先组装它并用WITH传递它。

您的最终查询将如下所示:

USING PERIODIC COMMIT 5000
LOAD CSV WITH HEADERS
FROM "file:///my_sds_39_joe.csv"
AS row
// first build the UID so we can take advantage of the index
WITH row, "Person." + row.player_cardnum AS UID
OPTIONAL MATCH (per:Person {UID : UID})
// the WHERE now applies to the WITH, which will filter out and null out the row when an OPTIONAL MATCH is found
WITH row, per
WHERE per IS NULL
MERGE (p:Person {CardNumber : row.player_cardnum})
ON CREATE SET p.Creation Date = timestamp(), p.Modification Date = timestamp() ;

【讨论】:

  • 首先使用一些测试数据而不是 LOAD CSV 对其进行测试,以确保它符合您的预期,无论是带有匹配 :Person 的 player_cardnum 还是不匹配的。
猜你喜欢
  • 2013-04-20
  • 2018-12-14
  • 2019-06-29
  • 2018-01-27
  • 2019-02-09
  • 1970-01-01
  • 2018-12-25
  • 2021-01-05
  • 2017-07-13
相关资源
最近更新 更多