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,因此在這種情況下,您將使用第二種方法節省大量帶寬和計算時間。

關於您的問題,最佳解決方案是更適合您的工作負載的解決方案:如果您在用戶上進行了大量更新,第二種解決方案將爲您帶來直接優勢;如果你經常單獨提取用戶,第二種解決方案也會帶來好處;另一方面,如果你的主要擔心是快速遍歷,那麼第二種解決方案將不太適合。

相關問題