Neo4j的批量插入

5
我正在从一张表中导入23亿个关联数据,但进度较慢,每小时只能导入500万个,需要耗费20天才能完成迁移。我听说过neo4j批量插入和批量插入工具,可以通过导入csv文件来实现,但是最新的代码有些问题,无法运行。
在neo4j中,我有大约1亿个关联关系,需要检查是否有重复的关系。请问有什么方法可以加速这些操作吗?
当前的代码类似于:
begin transaction
for 50K relationships
create or get user node for user A
create or get user node for user B
check there is relationship KNOW between A to B if not create the relationhsip
end transaction

我还阅读了以下内容:


关于您当前执行导入的详细信息将会很有帮助。批处理服务本质上是一种在单个HTTP请求中发送多个命令到服务器的方式,从而减少HTTP开销。 - Louis-Philippe Huberdeau
我正在从数据库中读取数据并将其导入到嵌入式Neo4j中。 - maaz
你能提供一些错误的细节吗?我们很乐意修复它。 - Peter Neubauer
创建关系是缓慢的,但并非无法实现,目前还没有找到加速的方法。 - maaz
1
批量导入器代码已修复(Neo4j API更改),因此您可以再次尝试。您所说的“无重复关系”是什么意思?您能预处理输入数据吗?例如,在rels.csv中,按start、end排序然后删除重复行应该很容易。 - Michael Hunger
2个回答

3

在处理关系时,并且假设您有足够的存储空间,我建议在导入阶段不要创建唯一关系。目前我正在导入一个包含约300万条记录的SQL表,但我总是会创建关系,无论它是否重复。

您可以在导入后通过cypher查询来创建唯一关系,如下所示:

START n=node(*) MATCH n-[:KNOW]-m
CREATE UNIQUE n-[:KNOW2]-m;

并且

START r=rel(*) where type(r)='KNOW' delete r;

至少目前这是我的做法,运行后面的Cypher查询只需要几分钟时间。问题可能在于当你真正拥有数十亿个节点时,Cypher查询可能会出现内存错误(取决于您为Neo4j引擎设置了多少缓存)。


0

如何从索引中获取用户A的用户节点?索引查找会严重拖慢批量插入的速度。尝试在索引之前使用一个简单的HashMap缓存尽可能多的用户,或者使用BatchInserterIndex#setCacheCapacity。


是的,从索引中查找,如果不存在则创建它,如何使用批量插入? - maaz
请返回翻译后的文本:http://docs.neo4j.org/chunked/milestone/batchinsert.html,以及在http://github.com/jexp/batch-import中的实现示例。 - Michael Hunger

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接