我目前正在构建一个应用程序,用于模拟图形数据库中的各种地理要素(道路,城镇,高速公路等)。地理数据全部采用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对象作为我的密码查询中的参数传递。有没有更好的方法来处理非常大的文件,以避免我遇到的超时问题?