在 Windows 上使用批量导入将数十亿个节点和关系导入 Neo4j

Import billions of nodes and relationships to Neo4j using Batch Import on Windows

我想向 Neo4j 中插入数十亿个节点和关系。使用 "LOAD CSV" 在 30 分钟后被浏览器 (Chrome) 取消,因为工作内存过载,尽管我有 16GB RAM。

大型数据集显然可以使用 Batch Importer (Documentation & Download, Explanation for Linux ) 导入到 Neo4j。

简单地使用它(不需要 source/git/maven):

1. download 2.2 zip
2. unzip
3. run import.sh test.db nodes.csv rels.csv (on Windows: import.bat)
4. after the import point your /path/to/neo4j/conf/neo4j-server.properties 
to this test.db directory, or copy the data over to your server cp -r 
test.db/* /path/to/neo4j/data/graph.db/

You provide one tab separated csv file for nodes and one for 
relationships (optionally more for indexes)

我很难在 Windows 上使用该插件。在 Linux-Rik Van Bruggen 的视频(link 以上)中,他提到 "installation of the batch importer".

我解压了文件 "download 2.2 zip"。我的 CSV 文件在另一个文件夹中。如何使用 WIndows 文档中提到的 "import.bat" 命令?在cmd中找不到命令...

  1. 如果您将 LOAD CSV 与 PERIODIC COMMIT 一起使用,您不应该 运行 陷入任何内存问题。不过,几十亿个节点(含糊不清 :-) 可能需要一段时间才能加载。
  2. https://neo4j.com/docs/operations-manual/current/tutorial/import-tool/ 解释了如何在离线模式下加载数据库。您可以使用 neo4j-importneo4j-admin import (两者都是命令行,第二个正在替换第一个)来执行此操作。根本不需要插件。确保您使用的是 Windows zip 安装(CE 或 EE),exe 安装(仅限 CE)可能不包含这些工具
  3. 如果您正在进行任何形式的大规模更新,浏览器绝不是一个好的选择。严重地。它旨在进行可视化,如果您在语法中给它任何机会,它会尝试这样做。这真的是您想要的长期 运行ning 批量更新吗?请改用 cypher-shell(命令行)。 Whosebug 上的许多问题实际上并不是 Neo4j 问题,而只是人们重载了浏览器的 dom 结构(所以它实际上是 Firefox 或 Chrome 问题)

希望对您有所帮助。

此致, 汤姆

在使用该工具处理巨大的数据集之前,我可以向您推荐一些我刚刚学到的在几分钟内导入数百万个节点的东西(Windows 的 Neo4j 社区版)。

关于 Neo4j 导入提示:

  • 不要使用网页界面导入这么大的数据集,内存过载是不可避免的。

  • 而是使用编程语言与Neo4j交互(我最近用的是官方的Python 模块,它只是为了学习,但你可以用古老的 Java).

  • 做同样的事情
  • 在使用LOAD CSV之前,记得写USING PERIODIC COMMIT指令,以便每次迭代导入大数据集。

  • 在从 CSV 导入关系之前,请记住对标签的键属性使用 CREATE CONSTRAINT ON <...> ASSERT <...> IS UNIQUE。它将对建立关系产生 巨大 影响。

  • 对关系过程使用 MATCH(...),而不是 CREATE(...)。它将避免重复。

关于 Neo4j 性能:

  • 首先:阅读官方 Neo4j 页面以调整性能:https://neo4j.com/docs/operations-manual/current/performance/

  • 为您的 Windows 机器设置正确的内存配置:如有必要,手动配置 dbms.memory.pagecache.size 参数(在 neo4j.conf 文件中)。

  • 记住:Java虚拟机不是黑盒子;您可以专门针对您的应用程序改进其性能(编辑 neo4j-community.vmoptions 文件)。 例如,您可以设置 JVM 的最大内存使用量(-Xmx 参数),您还可以设置 -XX:+UseG1GC 参数以使用 G1 垃圾收集器(高性能,Oracle 建议用于生产环境) (https://docs.oracle.com/cd/E40972_01/doc.70/e40973/cnf_jvmgc.htm#autoId0)

我将post我的neo4j.conf自定义行用于我的配置(仅供参考,它可能是您的应用程序设置错误,请当心):

dbms.memory.pagecache.size=3g
dbms.jvm.additional=-XX:+UseG1GC
dbms.jvm.additional=-XX:-OmitStackTraceInFastThrow
dbms.jvm.additional=-XX:+AlwaysPreTouch
dbms.jvm.additional=-XX:+UnlockExperimentalVMOptions
dbms.jvm.additional=-XX:+TrustFinalNonStaticFields
dbms.jvm.additional=-XX:+DisableExplicitGC

还有我的 neo4j-community.vmoptions 自定义行(同样,仅供参考):

-Xmx1024m
-XX:+UseG1GC
-OmitStackTraceInFastThrow
-XX:+AlwaysPreTouch
-XX:+UnlockExperimentalVMOptions
-XX:+TrustFinalNonStaticFields
-XX:+DisableExplicitGC

我的测试机是一台配备酷睿i3(双核)、8GB内存、Windows10和Neo4j 3.2.1社区版的弱笔记本.

我有能力在 3 分钟内导入 7 百万个节点350 万个关系不到 5 分钟(无递归关系)。

在功能更强大的机器中,使用特定的精心设置Neo4j 可以做得比这更好。希望它有所帮助。