【问题标题】:Neo4j create multiple nodes and relationshipsNeo4j 创建多个节点和关系
【发布时间】:2014-08-27 23:19:13
【问题描述】:

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

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

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

【问题讨论】:

    标签: neo4j cypher


    【解决方案1】:

    您可以使用unwind 来发挥自己的优势。 假设你使用的是 Java API,这里有一个使用 Groovy 的小 sn-p

    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 倍的加速,具体取决于您的批量大小

    【讨论】:

      【解决方案2】:

      我会考虑两种选择:

      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

      如前所述,否则会有批处理插入器。

      【讨论】:

      • 是否推荐使用单个参数化的 Cypher 语句?对于 Neo4j 来说,这组地图不会是一个非常庞大的地图吗?此外,我的数据采用 scipy 稀疏矩阵格式(因为它更有效)。这就是为什么我在考虑转换为 csv 是否是一个不错的选择?
      • 是的 - 单个地图数组可能会出现大量问题。 CSV应该没问题,否则就是提到的批处理插入器。
      【解决方案3】:

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

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

      如果你会用 Java 编码:

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

      其他:

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

      【讨论】:

      • 有没有办法在 python 中运行批处理?对不起,我有点好奇。
      • CVS 批量插入器只是通过一个 shell 脚本和一些 csv 输入文件运行
      • 从 3.0.0 版本开始,其他客户端库(例如 .NET 客户端库)可以访问批量插入 API。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-01
      • 2014-01-04
      • 1970-01-01
      相关资源
      最近更新 更多