2012-12-11 134 views
4

我从表中导入了23亿个关系,导入速度不是很快,每小时获得5M的速度,需要20天的时间才能完成迁移。我听说过neo4j批量插入和和batch insert utility。该实用程序通过从csv文件导入来做有趣的事情,但最新的代码是一些如何破碎和不运行。使用Neo4j批量插入

我在neo4j中有大约100M的关系,我必须全部检查是否应该没有重复的关系。

我怎样才能快速的东西在Neo4j的

通过当前的代码是这样

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 

我也阅读以下内容:

+0

有关当前如何执行导入的更多详细信息会有帮助。批处理服务本质上是一种在单个HTTP请求中向服务器发送多个命令的方式,可减少HTTP开销。 –

+0

我正在读取数据从数据库和导入嵌入式neo4j。 – mtariq

+0

你有什么破的细节吗?我们很想解决它。 –

回答

0

你如何做“获取用户A的用户节点”,从索引查找?索引查找确实减慢了批量插入。尝试在索引的前面简单的HashMap中缓存尽可能大的一部分用户,或者使用BatchInserterIndex#setCacheCapacity

+0

是从索引查找,如果没有那么创建它,如何使用批量插入? – mtariq

+0

http://docs.neo4j.org/chunked/milestone/batchinsert.html以及http://github.com/jexp/batch-import中的实现示例 –

3

如果存在关系,并且假设您有足够的存储空间,那么我会尝试不在导入阶段建立独特的关系 - 现在我实际上也在导入一个带有〜3mil记录的SQL表,但我总是创建一个关系,不介意它是否重复。

您可以稍后后导入简单地做一个暗号查询将了解创建像这种独特的关系:

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

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

至少这是我现在的做法和运行后暗号查询只需要几分钟。问题可能出在你真的有两百个节点时,密码查询可能会陷入内存错误(取决于你为neo4j引擎设置多少缓存)