neo4j:自行车导航计算高度差

时间:2015-11-13 14:15:33

标签: neo4j cypher

我试图找到两个节点之间的最短路径。这种关系有一个属性" length_km"我可以用作重量属性。这种关系还有一个属性" altitude_difference"它连接的两个节点之间:(altitude-EndNode减去altitude-StartNode)。现在是棘手的部分:

我希望积累圆柱体必须攀爬的所有空间差异。如果骑车人正在下坡,则不应累积altitude_difference。

我可以通过在两个节点之间建立两个关系来轻松实现这一点:该关系始终将altitude_difference设置为与其方向相对应。在查询时,我只会根据关系的方向遍历图形,并可以累积给定的altitude_differences。

但是因为我读过有两个"互惠"两个节点之间的关系是一个反模式,因为信息已经包含在一个关系中,我想知道在查询时是否有一种方法可以尊重关系的方向。

现在再次以纯文本形式提出问题:我是否需要在每两个节点之间建立两个关系,或者在搜索最短路径时是否可以处理关系的遍历方向?基本上我会使用遍历的方向(与关系的方向相反)或作为聚合函数中的多重(1或0)

1 个答案:

答案 0 :(得分:2)

在你的情况下,它不是反模式,因为你的模型是有向图。换句话说,关系的方向很重要。 Neo4j不支持双向关系。你需要创建关系作为传入和第二个输出。

<强>模型

CREATE (mountain1:Mountain {name: "Mount Whitney", altitude: 4421})
CREATE (mountain2:Mountain {name: "Mount Williamson", altitude: 4382})
CREATE (mountain1)-[:DESCENT {length_km: 20, altitude_difference: 39}]->(mountain2)
CREATE (mountain2)-[:ASCEND {length_km: 20, altitude_difference: 39}]->(mountain1)

您可以选择如何处理问题

  • 您可以拥有&#39; altitude_difference&#39;关于这种关系,但是当你改变高峰的高度时,你还需要更新两个关系。

  • 计算&#39; altitude_difference&#39;作为高度之间的差异。您应该能够在Cypher或应用程序中执行此操作。