3

我正在尝试将 Neo4J 与 neomodel 一起使用来表示一些图形关系。但是,当我尝试构建具有数百万个节点和关系的图形时,我遇到了性能问题。

当我有 10k 个节点和它们之间的 30k 个关系的图形时,需要 4:20 秒才能将其导入 Neo4j。创建节点需要 1:40,与 call 建立关系需要 2:40 foo.connect(bar)。它非常慢。

当我使用neomodel提供的批处理api时,我可以在4s内创建所有节点,但不影响创建关系所需的时间。

Neomodel 使用 CYPHER 查询来逐一创建关系。因此,我决定编写自己的查询,首先匹配创建 100 个关系所需的所有节点,然后创建这些关系。它发生了一两次,它在几秒钟内完成。在其他情况下,它又需要几分钟。当我使用 htop 查看时,我可以看到发生了什么,neo4j 数据库充分利用了 2 个内核。

我发现了以下文章:Import 10M Stack Overflow Questions into Neo4j In Just 3 Minutes正在使用neo4j-import,但我想避免它。

我使用的是默认配置,但我使用dbms.jvm.additional=-Xss256M的是能够执行那些批量关系查询。我对用于节点查找的属性具有唯一索引。在每次实验之前,我都会删除所有节点和关系。

你有什么想法,如何加快速度?

4

1 回答 1

1

你的节点有多少个rel?

通常我不认为对象映射器适合大量插入。

请查看:https ://medium.com/@mesirii/5-tips-tricks-for-fast-batched-updates-of-graph-structures-with-neo4j-and-cypher-73c7f693c8cc

您可以为耗时超过 1 秒的查询启用查询日志记录并共享 neomodel 生成的查询吗?

dbms.jvm.additional=-Xss256M是过度的。这意味着每个线程分配 256M 内存,通常 2M 就足够了。

于 2018-03-01T14:20:11.070 回答