9

我建模为我目前构建应用程序,其中,I具有连接到N个用户N个用户的曲线图,我也有Ñ帖子其可以通过N个用户喜欢。因此,对于给定的用户,结构看起来像这样,对于给定的用户,如果用户喜欢数百个Post节点,则它会产生100个边(realtionships)给节点,当post是n时,边也将be n。 所以一个用户将被连接到n个用户和n个帖子以及n个未来的节点类型。将n个节点连接到单个节点的最佳方法是什么?

因此,使用从而降低了边缘给定的节点,这将是这个样子的中间节点,

enter image description here

当用户有一个名为系列的中间节点,将连接到喜欢,因为这是一个属性图,我可以添加一个属性到中间节点,并使其行为像连接来自用户(类似于Like.username = User.username)

这与此类似问题(Graph database modelling: Should i use a collection node to avoid to many rel on a node

我的想法是

中间连接节点的这种方式可以从主节点分离的垃圾,因此可以加快自定义算法。

我的问题,

  1. 什么是这种可以扩展的最佳解决方案?
  2. 为什么我应该考虑使用其他解决方案?

回答

6

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

还根据这本书,超级节点

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

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

Dense node

的Neo4j的团队一直在努力提高关于超节点的性能,正如可以在this Github commit(例如)中看到的那样改变节点的关系在链接列表结构中的存储方式。

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

您可以在这些链接了解更多的关于图形数据库超级节点:

8

该解决方案将具有优点和缺点。

主要缺点是遍历操作会更昂贵,即。在查找帖子之前,您将不得不遍历一个节点。

的优点如下:

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

关于您的问题,最佳解决方案是更适合您的工作负载的解决方案:如果您在用户上进行了大量更新,第二种解决方案将为您带来直接优势;如果你经常单独提取用户,第二种解决方案也会带来好处;另一方面,如果你的主要担心是快速遍历,那么第二种解决方案将不太适合。

相关问题