【问题标题】:Friend relationship modeling in Neo4jNeo4j 中的朋友关系建模
【发布时间】:2019-12-08 07:40:11
【问题描述】:

我需要在 neo4j 中建模“朋友”关系。关系可能有“好友”或“朋友”等类型。 例如,A 和 B 是朋友。 A 将 B 视为“好友”,B 将 A 视为“朋友”。 我看到了两个对此建模的选项。

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

  2. 使用两个属性“Forward_Type”和“Backward_Type”创建一个关系。如果关系是从 A 到 B,则 'Forward_Type' = 'Buddy' 和 'Backward_Type' 将是 'Friend'

请告诉我哪一个在遍历复杂性/性能方面比较好。 谢谢。

【问题讨论】:

    标签: neo4j relationship bidirectional


    【解决方案1】:

    在对双向关系进行建模时,需要考虑几件事情。 第一个是这种关系的语义,在每个方向上。在您的情况下,仅将关系称为 FRIEND 是不够的,因为您有各种类型的朋友。

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

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

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

    【讨论】:

    • 感谢 Luanne,如果我要创建两种关系类型“FRIEND”和“BUDDY”,是否仍然可以遍历节点而不考虑类型?例如,无论关系类型如何,都可以找到认识 A 的人。
    • 是的,你可以使用 :FRIEND|:BUDDY 或者省略关系类型
    • 嗨 Luanne,我按照你的建议创建了两个关系,但最终在遍历节点时遇到了循环问题。
    • 例如,假设 A 连接到 B,A 和 B 之间有两种关系类型。B 连接到 C,C 连接到 D。现在如果我想找人谁通过 3 度连接连接到 A,我只希望 D. (A->B->C->D) 但它也返回 B。 (A->B-C->B) 因为C和B之间有两种关系。
    • 我在下面的帖子中问了同样的问题。 stackoverflow.com/questions/59371986/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-27
    • 2013-08-21
    • 1970-01-01
    相关资源
    最近更新 更多