【问题标题】:Best way to connect n nodes to a single node?将n个节点连接到单个节点的最佳方法?
【发布时间】:2017-09-14 18:44:17
【问题描述】:

我正在为我当前正在构建的应用程序建模一个图表,其中我有 n 个用户连接到 n 个用户,我也有 n 个帖子,可以是 被 n 个用户点赞。所以结构看起来像这样,对于给定的用户,

如果一个用户喜欢一百个 Post 节点,它会为该节点生成 100 条边(relationships),当 post 为 n 时,边也将是 n。 所以一个用户将连接到 n 个用户、n 个帖子和 n 个未来的节点类型。

所以使用中间节点从而减少给定节点的边,看起来像这样,

用户有一个名为 Collection 的中间节点,它将连接到喜欢,因为这是一个属性图,我可以向中间节点添加一个属性并使其表现得像来自用户的连接(类似于, Likes.username = User.username)

这将类似于这个问题 (Graph database modelling: Should i use a collection node to avoid to many rel on a node)

我的想法是

这种中间连接节点的方式可以将垃圾与主节点隔离,从而可以加快自定义算法的速度。

我的问题,

  1. 什么是可扩展的最佳解决方案?
  2. 为什么我应该优先考虑这个解决方案?

【问题讨论】:

    标签: database-design neo4j architecture orientdb graph-databases


    【解决方案1】:

    根据非常好的书Learning Neo4j(Rik Van Bruggen,可用于download in the Neo4j's web site),您的问题被称为“密集节点”或“超级节点”:连接太多的节点。

    还是照书,超节点

    " 成为图遍历的一个真正问题,因为图 数据库管理系统必须评估所有连接的 与该节点的关系以确定下一步是什么 将在图遍历中。”

    Rik 提出的解决方案非常接近您的解决方案(添加中间节点):它包括在用户和您喜欢的帖子之间添加一个“元”节点。这个元节点最多应该有一百个连接。如果当前元节点达到 100 个连接,则必须创建一个新的元节点并将其添加到层次结构中,根据图中的示例,显示了一个流行艺术家和您的粉丝的示例:

    Neo4j 团队一直在努力提高超级节点的性能,如this Github commit(例如)所示,它改变了节点的关系以链表结构存储在磁盘上的方式。

    我相信最好的办法是一开始就让你的图模型尽可能简单。您还没有密集节点问题,过早的优化可能会给您的模型增加一些不必要的复杂性。如果将来密集节点成为问题,您可以更准确地更改模型。一开始,简单是一个不错的选择。

    您可以在这些链接中阅读更多关于图形数据库中超级节点的信息:

    【讨论】:

      【解决方案2】:

      这种解决方案各有优缺点。

      主要缺点是遍历操作会更昂贵,即。在找到帖子之前,您必须再遍历一个节点。

      优点如下:

      • 当您添加新的“喜欢”时,用户节点上的争用较少,即。用户 @version 不会增加,因此您将能够同时更新用户,而不会发生版本冲突
      • 能够将信息添加到“喜欢”节点。您也可以单独使用边缘来执行此操作,但您必须在所有边缘上复制信息。
      • 较小的用户,特别是低于嵌入式/树 ridbag 阈值http://orientdb.com/docs/2.2.x/RidBag.html 只需考虑使用二进制协议,当您拥有树 RidBag 时,它不会立即序列化到客户端,但您将拥有一个迭代器为此,因此获取单个用户的开销不会很大。另一方面,使用 HTTP 协议,您将收到带有顶点的所有边缘 RID,因此在这种情况下,您将使用第二种方法节省大量带宽和计算时间。

      关于您的问题,最好的解决方案是更适合您工作量的解决方案:如果您对 User 进行大量更新,则第二种解决方案将为您带来立竿见影的优势;如果您经常单独获取用户,则第二种解决方案也会带来优势;另一方面,如果您主要关心的是快速遍历,那么第二种解决方案将不是一个很好的选择。

      【讨论】:

        猜你喜欢
        • 2015-04-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-03-20
        • 1970-01-01
        • 1970-01-01
        • 2017-11-13
        相关资源
        最近更新 更多