Neo4j OSM 交叉点和空间图设置

Neo4j OSM Intersections and Spatial Graph Setup

我一直在尝试将 Neo4j 设置为用作路由引擎,这导致了两个问题(以及其他问题)。

主要问题

按照README的说明,导入OSM数据后,下一步就是识别路口,如下图:

MATCH (n:OSMNode)
  WHERE size((n)<-[:NODE]-(:OSMWayNode)-[:NEXT]-(:OSMWayNode)) > 2
  AND NOT (n:Intersection)
WITH n LIMIT 100
MATCH (n)<-[:NODE]-(wn:OSMWayNode), (wn)<-[:NEXT*0..100]-(wx),
      (wx)<-[:FIRST_NODE]-(w:OSMWay)-[:TAGS]->(wt:OSMTags)
  WHERE exists(wt.highway)
SET n:Intersection
RETURN count(*);

我还没有弄清楚 >2 在第二行中的工作原理,WHERE size((n)<-[:NODE]-(:OSMWayNode)-[:NEXT]-(:OSMWayNode)) > 2
谁能解释一下这是如何工作的?
我认为它过滤到一个节点的连接,其中一个交叉点应该超过 2 个连接(因为它必须有多条道路才能“相交”)。但是,如果一个交叉路口只有 2 条道路(即,街道在穿过交叉路口时保持相同的名称),那么从每条街道到节点似乎只有 1 个连接,因此 exactly 2 个连接且未通过检查。我想相信我在这里遗漏了一些微不足道的东西......

次要问题

我一直在将 README 中的说明与 演示 结合起来构建路由图。我确信这些说明是完整的...以某种方式。
在 Neo4j 中构建路由图是否有更清晰或更新的说明?

参考文献:

The function size() returns the number of elements in a list. https://neo4j.com/docs/cypher-manual/current/functions/scalar/#functions-size

如果我们只考虑以下查询,您的意思就是这种情况: size((n)<-[:NODE]-(:OSMWayNode)) > 2

这只会计算连接的 OSMWayNode,'Street-Links' 将被归类为交叉点。

但是因为下一个 OSMWayNode 出现在列表中,所以一个 [NODE] 关系可以有多个出现:

  1. (n:OSMNode)<-[nr1:NODE]-(own1:OSMWayNode)-[wr1:NEXT]->(own2:OSMWayNode)
  2. (n:OSMNode)<-[nr2:NODE]-(own3:OSMWayNode)-[wr2:NEXT]->(own4:OSMWayNode)
  3. (n:OSMNode)<-[nr2:NODE]-(own3:OSMWayNode)<-[wr3:NEXT]-(own5:OSMWayNode)

(注意 [:NEXT] 关系在查询中是双向的)

example of an intersection in munich

这显示了通往十字路口的两条交叉路,而不是 link