Neo4j 设计选择:关系与节点

Neo4j design choice: relationships vs nodes

我正在处理以下情况:许多城市之间存在许多行程。两者都有不同的属性。例如,城市有一个名称和经过它们的旅行次数,而旅行有距离和时间。

Neo4j 中的 'best practise' 是什么?

a) 添加所有城市和行程作为节点,通过'STARTED_AT'和'ENDS_IN'关系将行程连接到起点和终点。

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

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

谢谢!

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

'This means there are many of the same relations between nodes' <<- 在此注释中,如果您需要根据旅行的时间来区分每次旅行,您可以在关系 属性 中添加 date/timestamp 或你可以使用时间树(参见 Mark Needham's Article on that here and Graphgrid's take) 希望这有帮助。

我认为最好将行程存储为节点,因为无法为关系属性编制索引,而且执行更复杂的查询(如按时间查找最短路线)会很慢所以如果您按 ID 或一些东西,你需要将它们存储为节点。

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

决定某物是否应该是节点或关系的一个好方法是问问自己 "are there any other relations that would make sense here?" 如果您谈论的是两个城市是否相连,那么关系就更重要,因为它们要么是要么是不是。但是,如果您谈论的是公路旅行,则该旅行可以经过多个城市,可以有旅行参与者(或其中的团体)并且可以有所有者。那样的话,为了以后的灵活性,节点会更容易维护。