2013-08-27 153 views
3

我試圖通過neo4j瞭解高效的使用模式,特別是參考高度節點。爲了說明我在說什麼,我有User具有我已經建模爲節點的屬性的節點。所以我的表中有關係,如neo4j中的高度節點

(:User)-[:HAS_ATTRIB]->(:AgeCategory) 

等等等等。問題是,一些AgeCategory節點都是非常高的程度,10萬的量級,和查詢等

MATCH (u:User)-->(:AgeCategory)<--(v:User), (u)-->(:FavoriteLanguage)<--(v) 
WHERE u.uid = "AAA111" AND v.uid <> u.uid 
RETURN v.uid 

(匹配共享同一年齡組和最喜歡的語言作爲AAA111所有用戶)是非常,非常慢,因爲你必須爲AgeCategory鏈表中的每個元素運行一次FavoriteLanguage鏈表(或者至少這是我的理解)。

我認爲從這個查詢需要幾分鐘的時間來解決我做錯了事情的事實很清楚,但我很好奇處理這樣的查詢的正確過程是什麼。我應該從每個查詢中分別查找匹配的用戶,並將它們與內存中的哈希進行比較?有沒有辦法將索引放在節點上的關係上?這是一個模式開始的好主意嗎?

回答

6

我的直覺是首先檢索給定節點u的兩個端點(AgeCategory和FavoriteLanguage),然後向中間節點v查詢具有這兩個固定端點的路徑會更有效。

爲了證明這一點,我創建了一個測試圖具有以下組分,

  1. 甲節點u:用戶與u.uid = 'AAA111'
  2. 甲節點c:AgeCategory
  3. 的節點升:FavoriteLanguage
  4. u和C的關係中,u - [:HAS_AGE] - >ç
  5. u和升之間的關係中,u - [:LIKE_LANGUAGE] - >升
  6. 100000節點v,EA ch其中shar與ndoe u相同c:AgeCategory和l:FavoriteLanguage,即每個v連接到l和c,v - [:HAS_AGE] - > c,v - [:LIKE_LANGUAGE] - > l

我運行以下查詢10次,得到平均運行時間10500毫秒。

Match l:FavoriteLanguage<-[:LIKE_LANGUAGE]-u:User-[:HAS_AGE]->c:AgeCategory 
Where u.uid = 'AAA111' 
With l,c 
Match l<-[:LIKE_LANGUAGE]-v:User-[:HAS_AGE]->c 
Where v.uid <> 'AAA111' 
Return v.uid 

對於10,000個v節點,此查詢大約需要2000毫秒,您的查詢大約需要27000毫秒。

有了100,000個v節點,這個查詢需要大約10500毫秒,它似乎永遠與您的原始查詢。

因此,您可以試試這個查詢,看看它是否可以提高圖表的性能。