2013-03-12 80 views
5

我想表示數百萬個屬於幾十個類別中的一個或多個的產品。Neo4j中的類別設計,根節點關係vs與索引節點的關係

我考慮了幾個方法:

  1. 索引目錄節點 - 爲每個類別的節點上,然後創建一個CATEGORY_NAME auto_index中。然後在我的每個產品節點和它們各自的類別節點之間創建「isCategoryOf」關係。

  2. 個人分類關係類型 - 分別創建「isCategoryGames」,「isCategoryFood」,「isCategoryLifestyle」等產品和根節點之間的關係。

  3. 將類別存儲爲一個關係類型的屬性 - 在prduct節點和根節點之間創建「isCategory」關係並將它們各自的類別類型存儲在關係的屬性中。關係「isCategory」{categoryName:「food」}

哪種方法最有效率和/或可擴展性?數據庫中幾乎每個節點都連接到根節點會有限制或性能影響嗎?

回答

4

如果您將數百萬個節點連接到根節點,則會使根節點成爲超節點。 This can be problematic

選項1的一般概念顯示了承諾。如果您正在爲食物建模,則可能會有名爲「堅果」,「乳製品」,「甜品」,「農產品」和類別屬性爲「類別」的名稱屬性的節點。然後,您將擁有其他名爲「Cherry Cheesecake」的名稱屬性的節點,並向「乳製品」和「甜品」節點傳出「類別」邊緣。

此結構是否足夠高性能取決於您的查詢。如果你有類似'食物'的廣泛類別,你可能會得到一個超級節點,並且你將通過連接節點進行線性掃描來找到具有給定屬性的節點。對成千上萬的東西進行線性掃描可能足夠滿足您的需求,但是對超過1M個事物的掃描可能不會。

爲了找到答案,我建議創建一個快速原型,在其中生成一些隨機產品和類別節點,然後將每個產品節點連接到隨機數量的類別節點。按名稱對產品和類別節點進行索引可幫助您找到單個產品或類別,但如果您點擊超節點,則會導致性能問題。嘗試一些Gremlin遍歷或Cypher查詢,您認爲這些問題可能是最有問題的。嘗試按比例增加1K,10K,100K和1M的節點數量,並使用相應數量的邊緣。你的遍歷/查詢時間如何改變?