我输入的数据大约有1200万个节点和1300万个关系。
首先,我使用csv
导入定期提交50000并将数据分成不同的块,但仍然需要花费太多时间。
然后我看到了批量插入方法。但是对于批量插入方法,我必须在Excel工作表中创建新的数据集。
基本上我从 SqlServer 导入数据:首先我将数据保存到csv中,然后将其导入我的 neo4j 。
另外,我使用的是neo4j社区版。我确实改变了我在stackoverflow上找到的所有属性。但是最初还是在预先提交50K它会更快但是在100万之后需要花费太多时间。
有没有在短时间内直接从sql导入这些数据,因为neo4j因其快速处理大数据而闻名?有什么建议或帮助吗?
以下是使用的LOAD CSV(数字索引(num)):
USING PERIODIC COMMIT 50000 load csv with headers from "file:c:/Users/hasham munir/Desktop/Numbers/CRTest2/Numbers.csv"
AS csvLine fieldterminator ';'
Merge (Numbers:Number {num: csvLine.Numbers}) return * ;
USING PERIODIC COMMIT 50000 load csv with headers from "file:c:/Users/hasham munir/Desktop/Numbers/CRTest2/Level1.csv"
AS csvLine fieldterminator ';'
MERGE (TermNum:Number {num: csvLine.TermNum})
MERGE (OrigNum:Number {num: (csvLine.OrigNum)})
MERGE (OrigNum)-[r:CALLS ]->(TermNum) return * ;
答案 0 :(得分:2)
需要多长时间?
为了给你一个参考,我的数据库大约是4m节点,650,000个独特的关系,~10m-15m的属性(不是很大,但应该提供一个想法)。加载节点文件+设置多个标签需要不到10分钟,然后加载关系文件+设置关系(全部通过LOAD CSV)。这也是在一台加速计算机上完成的,但是如果你需要几个小时,我会做一些调整。
我的建议如下:
您是否故意在MERGE之后返回节点?我无法想象你正在做任何事情,但不管怎样,考虑删除RETURN *。使用RETURN *,您将返回查询中找到的所有节点,关系和路径,这些都会减慢速度。 (http://neo4j.com/docs/stable/query-return.html#return-return-all-elements)
“num”字段是否唯一?如果是这样,请考虑添加以下约束(注意:这也将创建索引,因此无需单独创建它)。我认为这可能会加速MERGE(我不确定),但请看下一点。
CREATE CONSTRAINT ON(Numbers:Number)ASSERT Numbers.num IS UNIQUE;
如果num字段是唯一的并且这是一个全新的数据库(即,当您运行此脚本时,您从头开始),则调用CREATE来创建节点,而不是MERGE(用于创建仅限节点。
正如Christophe已经提到的那样,你绝对应该将堆大小增加到4g左右。
告诉我们它是怎么回事!
编辑1 我无法找到有关Windows版本的内存/性能调整的相关信息。我发现的东西给我留下了几个问题,并且可能已经过时了。
这可能已经过时,但提供了一些不同设置的背景知识以及Windows和Linux之间的差异 http://blog.bruggen.com/2014/02/some-neo4j-import-tweaks-what-and-where.html
Windows与Windows之间的差异Linux本身已从一个版本更改为下一个版本(如以下链接所示)
Cypher MATCH query speed,
https://stackoverflow.com/a/29055966/4471711
我也经历过这个。 http://neo4j.com/docs/stable/configuration.html
所以,我所做的是将堆(neo4j.vmoptions中的-Xmx)和pagecache都设置为32g。
答案 1 :(得分:1)
您可以将堆设置修改为4096MB。
此外,在第二个LOAD CSV中,数据库中已存在两个第一个MERGE的数字?如果是,请使用MATCH。
我也会承诺10000级。