Neo4j 中的好友关系建模

Friend relationship modeling in Neo4j

我需要在 neo4j 中建模 'Friend' 关系。关系可能有 'Buddy' 或 'Friend' 等类型。 例如,A 和 B 是朋友。 A认为B是'Buddy',B认为A是'Friend'。 我看到两个对此建模的选项。

  1. 创建两个关系。 A --> B 属性 'type' = 'Buddy' 和 B --> A 属性 'type' = 'Friend'。

  2. 创建一个具有两个属性 'Forward_Type' 和 'Backward_Type' 的关系。如果关系是从 A 到 B,'Forward_Type' = 'Buddy' 和 'Backward_Type' 将是 'Friend'

请告诉我哪一个在遍历方面比较好complexity/performence。 谢谢。

在为双向关系建模时,有几件事需要考虑。 首先是该关系在每个方向上的语义。在你的情况下,简单地称这种关系为 FRIEND 是不够的,因为你有不同类型的朋友。

另一个考虑因素是是否可以从任一方向暗示(以直接或相反的方式)该关系的含义。这些示例是 PARENTCHILD 关系,其中 parent 表示相反方向的 child。在你的情况下,它没有。传出的 FRIEND 关系并不意味着传入的 FRIEND 关系。 在 Neo4j 中沿任一方向遍历关系对性能没有任何影响。

由于您的关系类型并非真正的 bidirectional,您的选择取决于您的用例。 如果您对 FRIEND 关系建模以在其上使用 属性 来指示友谊类型,那么在任何给定的一对节点之间最多有两个关系,每个方向一个。如果您的用例涉及始终遍历 FRIEND 关系,而不管友谊的类型如何,那么这是一个很好的高性能模型。

如果需要根据好友类型进行遍历,比如查找所有的Buddies而不是Friends,那么刚才描述的模型可能表现不佳。 可能不会,因为这完全取决于图形的形状 - 如果您没有密集节点,那么这将不是问题。如果这样做,那将是因为来自密集节点的每个 FRIEND 类型的关系都将被遍历以通过其上的 属性 进行过滤。在这种情况下,您最好选择两种关系类型,FRIENDBUDDY