merge - Neo4j 在大数据集上的 MERGE 命令

标签 merge neo4j bigdata nodes graph-databases

目前,我正在从事一个在网络分析领域实现 Neo4j (V2.2.0) 数据库的项目。加载一些样本后,我试图加载一个大数据集(>1GB,>4M 行)。我面临的问题是,随着数据大小的增长,使用 MERGE 命令所花费的时间呈指数增长。当不是每一行都必须作为一个节点加载时,在线资源对于加载大数据集的最佳方法是什么是模棱两可的,我想对这个主题有所了解。强调一下,在这种情况下,我只是加载节点;关系是下一步。

基本上有3种方法

i) 为属性设置唯一性约束,并创建所有节点。该方法主要在引入MERGE命令之前使用。

CREATE CONSTRAINT ON (book:Book) ASSERT book.isbn IS UNIQUE

其次是

USING PERIODIC COMMIT 250
LOAD CSV WITH HEADERS FROM "file:C:\\path\\file.tsv" AS row FIELDTERMINATOR'\t'
CREATE (:Book{isbn=row.isbn, title=row.title, etc})

根据我的经验,如果找到重复项,这将返回错误,从而停止查询。

ii) 合并节点及其所有属性。

USING PERIODIC COMMIT 250
LOAD CSV WITH HEADERS FROM "file:C:\\path\\file.tsv" AS row FIELDTERMINATOR'\t'
MERGE (:Book{isbn=row.isbn, title=row.title, etc})

我曾尝试以这种方式加载我的集合,但在让进程运行超过 36 小时并逐渐停止后,我认为应该有更好的替代方案,因为我最终加载了约 200K ~750K 节点.

iii) 基于一个属性合并节点,然后设置其余的。

USING PERIODIC COMMIT 250
LOAD CSV WITH HEADERS FROM "file:C:\\path\\file.tsv" AS row FIELDTERMINATOR'\t'
MERGE (b:Book{isbn=row.isbn})
ON CREATE SET b.title = row.title
ON CREATE SET b.author = row.author
etc

我现在正在运行一个测试(约 20K 个节点),看看从方法 ii 切换到 iii 是否会缩短执行时间,因为较小的样本给出了相互矛盾的结果。是否有我正在监督并可以缩短执行时间的方法?如果我没记错的话,批量插入器只适用于 CREATE 命令,而不适用于 MERGE 命令。

我已经允许 Neo4j 使用 4GB 内存,从我的任务管理器来看这已经足够了(只使用了超过 3GB)。

最佳答案

方法 iii) 应该是最快的解决方案,因为您针对单个属性MERGE。在执行 MERGE 之前是否创建了唯一性约束?如果没有索引(约束或普通索引),随着节点数量的增加,该过程将花费很长时间。

CREATE CONSTRAINT ON (book:Book) ASSERT book.isbn IS UNIQUE

其次是:

USING PERIODIC COMMIT 20000
LOAD CSV WITH HEADERS FROM "file:C:\\path\\file.tsv" AS row FIELDTERMINATOR'\t'
MERGE (b:Book{isbn=row.isbn})
ON CREATE SET b.title = row.title
ON CREATE SET b.author = row.author

这应该可行,您可以增加PERIODIC COMMIT

通过这种方式,我可以在几分钟内添加几十万个节点。

关于merge - Neo4j 在大数据集上的 MERGE 命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29257729/

相关文章:

Neo4j Facet 字段,如 Solr

neo4j - Rest配置中使用Neo4jTemplate保存数据太慢

java - 传输原始数据,例如 int、float-tuple : More efficient to parse strings or convert to byte array?

Mysql优化算法,保存历史更改的变体

merge - 如何将 ExamDiff Pro 配置为 SourceTree 的外部合并工具

r - 如何合并具有相同列名的多个数据框?

neo4j - 有没有一种简单的基于 GUI 的方法来在 neo4j 中构建图形?

java - 使用 Google pub/sub 更新单例 HashMap

c# - 如何通过主键和外键(右连接)合并两个数据表?

git - git branch -m 对其他开发人员有副作用吗?