Neo4j创建多个节点和关系

时间:2014-07-07 13:00:35

标签: neo4j cypher

我正在使用Neo4j构建一个巨大的图形数据库(超过一百万个节点)。我现在正在这样做的方法是为每个节点运行一个密码CREATE (n {property:'value'})查询。正如预期的那样,这是一种效率很低的方法,需要花费大量的时间。有人可以建议我一些替代方法来克服这个问题吗?我听说Neo4j还提供了一些默认的批处理界面来创建多个节点。我目前正在使用此版本的代码(包括关系):

create (a { name: "a" })-[:rel1]->(b {name : "b"}),(c {name: "c"})-[:rel2]->(d {name:"d"}),...

这是一种有效的方法还是有更好的方法? 提前致谢! :)

3 个答案:

答案 0 :(得分:5)

我会考虑两种选择:

  1. 使用LOAD CSV支持:http://docs.neo4j.org/chunked/stable/query-load-csv.html
  2. 使用单个参数化的Cypher语句,并提供一系列参数:http://docs.neo4j.org/chunked/stable/query-create.html#create-create-multiple-nodes-with-a-parameter-for-their-properties
  3. 否则就会有批量插入器,如上所述。

答案 1 :(得分:2)

Neo4j网站上有一个概述:http://www.neo4j.org/develop/import

但简而言之,对于超过一百万个节点我会说:

如果您可以用Java编写代码:

http://docs.neo4j.org/chunked/stable/batchinsert.html

否则:

https://github.com/jexp/batch-import

答案 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倍的加速