2012-04-20 286 views
10

我正在玩neo4j,我想知道,在節點上有一個type屬性是很常見的,它指定了它是什麼類型的節點?我嘗試過尋找這種做法,並且我看到一些人使用name來達到這樣的目的,但我想知道這是否被認爲是一種好的做法,或者索引是否是更實用的方法?Neo4j節點屬性類型

一個例子是一個「用戶」節點,該節點的類型爲:user,這種方式如果索引不好,我可以做一個全節點掃描並尋找user的類型。

回答

7

確實,這取決於您的使用情況。 如果您添加一個類型屬性,然後希望查找所有用戶,那麼您將遇到潛在的麻煩,因爲您必須在每個節點上檢查該屬性以找到用戶。在這種情況下,索引可能會更好 - 但在您需要查詢索引中沒有可用條件和關係的所有用戶的情況下(除非您的索引是「開始」的來源)。 如果你有像我這樣的圖,其中關係類型暗示着兩種不同的節點類型,如A-(知道) - (B),而A或B可以是用戶或客戶,那麼它不起作用。

因此,您的用例非常重要 - 您可以很容易地對一般圖形進行建模,但對於根據您的使用模式「調整」它很重要。

4

恕我直言,你不應該在節點上放置一個類型屬性。相反,引用特定「類型」的所有節點的通用方法是將所有用戶節點連接到稱爲「用戶」的節點。這種方式從用戶節點開始,您可以很容易地找到所有用戶節點。 「用戶」節點本身可以​​編入索引,因此您可以輕鬆找到它,或者它可以連接到參考節點。

+5

與唯一的問題是,如果你擁有的用戶數量巨大,你會開始打超級點球。我現在在neo4django(https://github.com/scholrly/neo4django)中這樣做,並且正在考慮改用hyrbid索引/關係方法。 – 2012-04-20 18:36:25

+1

我見過這個模型,我想我擔心的是,如果索引/關係因爲某種原因而中斷,那麼節點的類型會丟失,但正如@MattLuongo指出的那樣,我們可以推斷使用某些屬性。 – Nicholas 2012-04-20 19:09:46

2

我認爲這真的取決於你。有些人喜歡索引類型屬性,但我發現當你有其他索引屬性來縮小索引點擊數(例如,搜索21歲以上的所有用戶)時,它們最有用。

這就是說,正如@Luanne指出的,我們大多數人都試圖首先解決圖中的問題。另一種方式(我認爲更自然的方式)是使用關係類型來推斷實際的節點類型,即「A-(知道) - > B」,因此A必須是用戶或其他人可以「知道」的東西,B必須是另一個用戶,主題或其他可以「知道」的對象。

2

對於客戶端API,將元素類型建模爲屬性可以很容易地在客戶端代碼中實例化正確的域對象,因此我總是在每個節點/頂點上包含一個type屬性。

「類型」var名稱通常用於此目的,但在Python等某些語言中,「type」是保留字,所以我在燈泡(http://bulbflow.com/quickstart/#models)中使用「element_type」。

這不是邊緣/關係所需要的,因爲它們已經包含了一個類型(標籤) - 注意Neo4j也使用關鍵字「type」代替關係中的標籤。

2

我會說這是常見的做法。作爲一個例子,Spring Data Neo4j完全知道某個節點是哪個實體類型。每個節點具有「類型」屬性,該屬性包含實體的限定類名。這些屬性在「類型」索引中自動編入索引,因此可以快速查找節點。你可以像這樣實現你的用例。

9

Labels已被添加到neo4j 2.0中。他們解決了這個問題。

您可以用標籤創建節點:

CREATE (me:American {name: "Emil"}) RETURN me; 

您可以匹配的標籤:

MATCH (n:American) 
WHERE n.name = 'Emil' 
RETURN n 

您可以設置任意數量的標籤的節點上:

MATCH (n) 
WHERE n.name='Emil' 
SET n :Swedish:Bossman 
RETURN n 

你可以刪除節點上的任意數量的標籤:

MATCH (n { name: 'Emil' }) 
REMOVE n:Swedish 

等...