2013-09-01 157 views
3

我試圖決定是否應該將類別實現爲節點或標籤。
特別是獲取屬於某個類別的節點數的查詢並不那麼容易。
節點必須能夠屬於更多類別!節點類別作爲標籤,節點還是標籤和節點?

分類標籤,變體1
保留類別列表某處,然後:

MATCH a:cat1, b:cat2, c:cat3, ... 

與很多類別的,我會得到很多的列..所以這不是真的很好。也很多的預處理查詢。
甚至不能確定我是否可以輕鬆地從中得到一個數。

分類標籤,變型2

MATCH n:category <-- the category label is used to limit the amount of nodes 
RETURN DISTINCT labels(n), count(*) as count 

將返回類似:

["category","the actual category label"], 2 

看上去很完美,但是當一個節點有多個類別

["category","cat1","cat2"], 2 <-- two nodes found with category "cat1" and "cat2" 
["category","cat1"], 4 <-- four nodes found with category "cat1" 
這是不行的

現在我不知道如何獲得每個類別的計數...
也許extract(..labels()..)filter(..labels()..)能夠做到這一點,但我不知道如何。

節點類別 是的,這是有效的......這是非常直接的轉發。但是標籤是否被認爲是分類節點的東西?加上所有額外的關係,我會創造..

也許我應該實現它作爲標籤和節點?
然後用標籤我可以快速地獲得每個節點的類別。有了一個節點,我可以得到類別數量。

我仍然在尋找這個問題的一個很好的觀點,所以我不能給一個具體的實現問題呢。

+0

有多少種類?這些節點是否會被其他類別分類,還是隻有一類? –

+0

我最初只有1個用戶用於我的應用程序,我想1個用戶會創建10-50個類別。用戶可以定義他們自己的類別,所以隨着用戶羣的增長,類別也會隨之增長。這只是一種類別。節點有不同的方式將它們分組,但是通過將它們附加到分組節點來完成。我想過用'cat_「'爲類別添加前綴標籤。 – Flip

回答

5

我的兩毛錢。

對於您所屬的類別,我會爲每個類別添加一個節點,並從屬於該類別的節點創建一個BELONGS_TO關係。我的這種偏好有很多原因。

添加標籤的原因之一是許多人在節點上放置「type」屬性。另一種討論標籤的方式是,它們爲圖形添加一點「架構」 - 就您可以對節點進行分類而言。

隨着標籤的引入,他們總會有被濫用的風險。它只是一個主要用於存儲圖形的數據庫中的額外工具。在極端情況下,您幾乎可以使用標籤進行所有操作,最終獲得一系列「標記」節點。

最後,遍歷關係是Neo4j做的最快的事情。我們說的是微秒單位。不要害怕添加數以千計的關係到一個節點。我會爲開發人員定義的「模式」信息留下標籤。

因此,在您的用戶添加類別的情況下,我肯定會創建類別節點和BELONGS_TO關係,以支持標籤。

最後一件事是聲明這是一個自我推銷。如果你達到了每個節點有數萬或數百萬個關係的點,並且你所追求的所有關係都在計算關係,那麼將這些計數緩存爲屬性可能是一個好主意。我爲GraphAware Framework開發了一個名爲「Relationship Count Module」的模塊,它確實如此。我已經在我的碩士證明。論文將在幾周內公開發布,該模塊將高度頂點的計數查詢加速了幾個數量級,只需10-25%的寫入吞吐量懲罰。讓我知道你是否需要更多的細節。

+0

Thx爲答案,我會接受,因爲它給出了足夠的解釋標籤應該用什麼和什麼不用。我在REST API上,是通過REST提供的框架和模塊嗎?也許有框架定義了額外的密碼功能?我想知道後續的信息。 – Flip

+0

謝謝。是的,這個框架可以從REST和Cypher中使用,因爲它現在所做的只是在後臺編寫額外的元數據到圖中。這些可以使用所有的API讀取,包括Cypher。然而,這種支持可能會更好,並且正在路線圖上。我建議你先不用它,先開發你的功能。當你開始測量和優化性能時,回到我身邊(graphaware.com上的任何事情)。這個框架有可能在這一點上做得更多。祝你好運。 –