Neo4j 中的好友关系建模
Friend relationship modeling in Neo4j
我需要在 neo4j 中建模 'Friend' 关系。关系可能有 'Buddy' 或 'Friend' 等类型。
例如,A 和 B 是朋友。 A认为B是'Buddy',B认为A是'Friend'。
我看到两个对此建模的选项。
创建两个关系。 A --> B 属性 'type' = 'Buddy' 和 B --> A 属性 'type' = 'Friend'。
创建一个具有两个属性 'Forward_Type' 和 'Backward_Type' 的关系。如果关系是从 A 到 B,'Forward_Type' = 'Buddy' 和 'Backward_Type' 将是 'Friend'
请告诉我哪一个在遍历方面比较好complexity/performence。
谢谢。
在为双向关系建模时,有几件事需要考虑。
首先是该关系在每个方向上的语义。在你的情况下,简单地称这种关系为 FRIEND 是不够的,因为你有不同类型的朋友。
另一个考虑因素是是否可以从任一方向暗示(以直接或相反的方式)该关系的含义。这些示例是 PARENT
和 CHILD
关系,其中 parent 表示相反方向的 child。在你的情况下,它没有。传出的 FRIEND 关系并不意味着传入的 FRIEND 关系。
在 Neo4j 中沿任一方向遍历关系对性能没有任何影响。
由于您的关系类型并非真正的 bidirectional,您的选择取决于您的用例。
如果您对 FRIEND 关系建模以在其上使用 属性 来指示友谊类型,那么在任何给定的一对节点之间最多有两个关系,每个方向一个。如果您的用例涉及始终遍历 FRIEND 关系,而不管友谊的类型如何,那么这是一个很好的高性能模型。
如果需要根据好友类型进行遍历,比如查找所有的Buddies而不是Friends,那么刚才描述的模型可能表现不佳。 可能不会,因为这完全取决于图形的形状 - 如果您没有密集节点,那么这将不是问题。如果这样做,那将是因为来自密集节点的每个 FRIEND 类型的关系都将被遍历以通过其上的 属性 进行过滤。在这种情况下,您最好选择两种关系类型,FRIEND
和 BUDDY
。
我需要在 neo4j 中建模 'Friend' 关系。关系可能有 'Buddy' 或 'Friend' 等类型。 例如,A 和 B 是朋友。 A认为B是'Buddy',B认为A是'Friend'。 我看到两个对此建模的选项。
创建两个关系。 A --> B 属性 'type' = 'Buddy' 和 B --> A 属性 'type' = 'Friend'。
创建一个具有两个属性 'Forward_Type' 和 'Backward_Type' 的关系。如果关系是从 A 到 B,'Forward_Type' = 'Buddy' 和 'Backward_Type' 将是 'Friend'
请告诉我哪一个在遍历方面比较好complexity/performence。 谢谢。
在为双向关系建模时,有几件事需要考虑。 首先是该关系在每个方向上的语义。在你的情况下,简单地称这种关系为 FRIEND 是不够的,因为你有不同类型的朋友。
另一个考虑因素是是否可以从任一方向暗示(以直接或相反的方式)该关系的含义。这些示例是 PARENT
和 CHILD
关系,其中 parent 表示相反方向的 child。在你的情况下,它没有。传出的 FRIEND 关系并不意味着传入的 FRIEND 关系。
在 Neo4j 中沿任一方向遍历关系对性能没有任何影响。
由于您的关系类型并非真正的 bidirectional,您的选择取决于您的用例。 如果您对 FRIEND 关系建模以在其上使用 属性 来指示友谊类型,那么在任何给定的一对节点之间最多有两个关系,每个方向一个。如果您的用例涉及始终遍历 FRIEND 关系,而不管友谊的类型如何,那么这是一个很好的高性能模型。
如果需要根据好友类型进行遍历,比如查找所有的Buddies而不是Friends,那么刚才描述的模型可能表现不佳。 可能不会,因为这完全取决于图形的形状 - 如果您没有密集节点,那么这将不是问题。如果这样做,那将是因为来自密集节点的每个 FRIEND 类型的关系都将被遍历以通过其上的 属性 进行过滤。在这种情况下,您最好选择两种关系类型,FRIEND
和 BUDDY
。