我正在使用Neo4j构建一个巨大的图形数据库(超过一百万个节点)。我现在正在这样做的方法是为每个节点运行一个密码CREATE (n {property:'value'})
查询。正如预期的那样,这是一种效率很低的方法,需要花费大量的时间。有人可以建议我一些替代方法来克服这个问题吗?我听说Neo4j还提供了一些默认的批处理界面来创建多个节点。我目前正在使用此版本的代码(包括关系):
create (a { name: "a" })-[:rel1]->(b {name : "b"}),(c {name: "c"})-[:rel2]->(d {name:"d"}),...
这是一种有效的方法还是有更好的方法? 提前致谢! :)
答案 0 :(得分:5)
我会考虑两种选择:
LOAD CSV
支持:http://docs.neo4j.org/chunked/stable/query-load-csv.html 否则就会有批量插入器,如上所述。
答案 1 :(得分:2)
Neo4j网站上有一个概述:http://www.neo4j.org/develop/import
但简而言之,对于超过一百万个节点我会说:
如果您可以用Java编写代码:
http://docs.neo4j.org/chunked/stable/batchinsert.html
否则:
答案 2 :(得分:0)
您可以使用unwind
。
假设您使用的是Java API,这里有一个使用Groovy的小片段
List<Map<String, Object>> props = yourList.collect {["prop1": it.prop1, "prop2":it.prop2]}
String q = "UNWIND {props} AS p create(a {name: p.prop1})-[:rel1]->(b {name: p.prop2}) "
neo4jOperations.query(q, ["props" : props])
我用这种方法取得了很大的成功。根据您的批量大小,您应该可以看到5-30倍的加速