Neo4j设计选择:关系与节点

时间:2018-05-29 19:01:00

标签: neo4j cypher spring-data-neo4j

我处理以下情况:许多城市之间存在许多旅行。两者都有各种属性。例如,城市有一个名字和通过它们的旅行数量,而旅行有距离和时间。

Neo4j中的'最佳做法' 是什么?

a)将所有城市和旅行作为节点添加,并通过' STARTED_AT'将旅程连接到开始和结束节点。和' ENDS_IN'关系。

b)仅将城市添加为节点,并将每个行程表示为2个节点之间的关系。这意味着节点之间存在许多相同的关系,唯一的区别是它们具有其他属性。

可能有用的信息:我们只需要进行各种查询。无需插入。

谢谢!

2 个答案:

答案 0 :(得分:0)

我会说这实际上取决于你如何模拟这些旅行,我们假设我们可以将其概括为(城市) - [旅行] - >(城市)。请注意,neo4j的关系始终有一个方向,所以我们可以继续在城市之间添加无限次的旅行,而不必为每次旅行重新定义每个城市 - 这实际上回答(a)顺便说一句,我们不需要定义在哪里它开始和结束关系是否适用于你。

'这意味着在此笔记中节点'<< - 之间存在许多相同的关系,如果您需要根据旅行时间来区分每次旅行,您可以在关系中添加日期/时间戳您可以使用时间树(请参阅Mark Needham's Article on that hereGraphgrid's take) 希望这会有所帮助。

答案 1 :(得分:0)

我认为最好将旅行存储为节点,因为关系属性无法编入索引,并且执行更复杂的查询(例如按时间查找最短路径)会很慢。因此,如果您正在搜索旅行ID或其他东西,您需要将它们存储为节点。

另一方面,可以使用关系进行论证,因为这样您就可以充分利用APOC的加权图搜索功能。

决定某事物应该是节点还是关系的好方法是问问自己"还有其他任何有意义的关系吗?"如果你在谈论两个城市是否有联系,那么一段关系会因为它们是否存在而产生更多。如果您正在谈论公路旅行,那么旅行可以通过多个城市,可以让旅行的参与者(或其中的团体)并且可以拥有所有者。在这种情况下,为了将来的灵活性,节点将更容易维护。