我目前正在构建一个应用程序,该应用程序可以在图形数据库中对各种地理特征(道路、城镇、高速公路等)进行建模。地理数据全部采用 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) …
我有一个图形数据库,用于绘制建筑物和公交车站之间的连接,其中图形包含其他连接件,例如道路和十字路口(在许多节点类型中)。
我试图弄清楚的是如何向下过滤路径以仅返回特定的节点类型。我目前正在努力解决两个相关的问题。
问题1:如何返回路径上的节点标签?
似乎逻辑上的第一步是确定哪种类型沿路径出现的节点。
我尝试了以下方法:
MATCH p=(a:Building)-[:CONNECTED_TO*..5]-(b:Bus)
WITH nodes(p) AS nodes
RETURN DISTINCT labels(nodes);
Run Code Online (Sandbox Code Playgroud)
但是,我收到一个类型异常错误,labels()需要类型为node而不是Collection的数据。我想动态知道路径上的节点类型,以便最终过滤路径。
问题2:如何在路径中返回与第一步中标识的标签匹配的节点的子集?
说我发现,之间(a:Building)和(d1:Bus)和(d2:Bus)我可以期望找到(:Intersection)节点和(:Street)节点。
这是我的图形的简化模型:
(a:Building)--(:Street)--(:Street)--(b1:Bus)
\(:Street)--(:Intersection)--(:Street)--(b2:Bus)
Run Code Online (Sandbox Code Playgroud)
我写了一条MATCH语句,该语句将查找(:Building)和(:Bus)节点之间的所有可能路径。接下来,我需要做什么来过滤以选择性地返回Street节点?
MATCH p=(a:Building)-[r:CONNECTED_TO*]-(b:Bus)
// Insert logic to only return (:Street) nodes from p
Run Code Online (Sandbox Code Playgroud)
任何对此的指导将不胜感激!