如何将非常大的geojson文件导入neo4j?

dfd*_*226 6 neo4j geojson cypher

问题背景


我目前正在构建一个应用程序,该应用程序可以在图形数据库中对各种地理特征(道路、城镇、高速公路等)进行建模。地理数据全部采用 GeoJSON 格式。

cypher 语言中没有LOAD JSON函数,因此加载 JSON 文件需要将完全解析的 JavaScript 对象作为参数传递,并使用UNWIND访问数组属性和对象以创建节点。(本指南对我的入门帮助很大:在 neo4j 中加载 JSON)。由于 GeoJSON 只是一个建立在 JSON 约定之上的规范,因此 load JSON 方法非常适合大小合理的文件。

但是,地理数据文件可能非常庞大。我尝试导入的一些文件的范围从 100 个特征到 200,000 个特征。

遇到的问题是,对于这些非常大的文件,查询在完全处理完文件之前不会合并数据库中的任何节点。对于大文件,这通常会超过neo4j 中设置的 3600 秒超时限制。所以我最终等了一个小时才发现我的数据库中没有新数据。

我知道对于一些数据,当前的建议是将其转换为 CSV,然后使用 LOAD CSV 的优化。但是,我认为将 GeoJSON 压缩为 CSV 并不容易。

主要问题


是否可以从非常大的 JSON/GeoJSON 文件中分批发送数据,以便 neo4j 间歇性地提交数据?

当前方法


为了导入我的数据,我构建了一个简单的 Express 应用程序,它通过 Bolt 协议(使用官方二进制 JS 驱动程序)连接到我的 neo4j 数据库。我的 GeoJSON 文件对每个功能都有一个众所周知的文本 (WKT) 属性,以便我可以使用 neo4j-spatial。

这是我用于导入一组道路数据的代码示例:

session.run("WITH {json} as data UNWIND data.features as features MERGE (r:Road {wkt:features.properties.wkt})", {json: jsonObject})
  .then(function (result) {
    var records = [];
    result.records.forEach((value) => {
      records.push(value);
    });
    console.log("query completed");
    session.close();
    driver.close();
    return records;
  })
  .catch((error) => {
    console.log(error);
    // Close out the session objects
    session.close();
    driver.close();
  });
Run Code Online (Sandbox Code Playgroud)

如您所见,我将整个解析的 GeoJSON 对象作为参数传入我的密码查询中。有没有更好的方法来处理非常大的文件以避免我遇到的超时问题?

chr*_*rkl 0

这个答案可能会有所帮助:/sf/answers/4173257721/


apoc.load.jsonArray()将传输给定 JSON 文件的值。然后可以将其用作通过apoc.periodic.iterate进行批处理的数据源。

CALL apoc.periodic.iterate(
  "CALL apoc.load.json('https://dummyjson.com/products', '$.features') YIELD value AS features",
  "UNWIND features as feature MERGE (r:Road {wkt:feature.properties.wkt})",
  {batchSize:1000, parallel:true}
)
Run Code Online (Sandbox Code Playgroud)