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

时间:2017-03-13 16:38:54

标签: neo4j cypher geojson

问题背景

我目前正在构建一个应用程序,用于模拟图形数据库中的各种地理要素(道路,城镇,高速公路等)。地理数据全部采用GeoJSON格式。

cypher语言中没有 LOAD JSON 函数,因此加载JSON文件需要将完全解析的JavaScript对象作为参数传递,并使用 UNWIND 访问阵列属性和用于创建节点的对象。 (本指南帮助我开始了很多工作:Loading JSON in neo4j)。由于GeoJSON只是一个基于JSON约定的规范,因此加载JSON方法适用于合理大小的文件。

但是,地理数据文件可能很庞大。我试图导入的一些文件范围从100个功能到200,000个功能。

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

我知道有些数据是current recommendation is to convert it to CSV and then use the optimization of 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();
  });

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

0 个答案:

没有答案