2013-01-02 61 views
2

我運動我複雜的用戶數據庫,用戶可以在衆多的球隊之一,是朋友相互多以Neo4j的CYPHER查詢。在RDBMS中這樣做是痛苦和緩慢的,但是使用Neo4j很簡單並且很炫。 :)Neo4j的可變關係路徑長度

我希望有一種方式,

  • 查詢的關係是1周跳,距離
  • 相互之間的關係也就是2個跳之外

從相同的查詢。

START n=node:myIndex(user='345') 
MATCH n-[:IS_FRIEND|ON_TEAM*2]-m 
RETURN DISTINCT m; 

的原因是,這是朋友的用戶彼此一個優勢,但用戶可以通過團隊鏈接是通過團隊的節點聯繫,所以它們是兩個邊走。這個查詢是IS_FRIEND * 2和ON_TEAM * 2,它讓隊友(是)和朋友的朋友(boo)。

是否有Cypher支架簡潔的方式來獲得在單個查詢兩種不同長度的關係?

+0

約瑟夫,你可以做console.neo4j.org一個小例子任何機會呢? –

回答

2

我重寫它返回一個集合:

start person=node(1) 
match person-[:IS_FRIEND]-friend 
with person, collect(distinct friend) as friends 
match person-[:ON_TEAM*2]-teammate 
with person, friends, collect(distinct teammate) as teammates 
return person, friends + filter(dupcheck in teammates: not(dupcheck in friends)) as teammates_and_friends 

http://console.neo4j.org/r/oo4dvx

感謝您推薦一起樣品db,維爾納。

+0

這就是票。 3ms的運行時間,與其他節點(*)選擇器的sol'n相比。謝謝您的幫助。 :) –

1

我在http://console.neo4j.org/?id=sqyz7i

創建了一個小的測試數據庫中,我還創建了一個查詢,這將是你所描述的工作:

START n=node(1) 
MATCH n-[:IS_FRIEND]-m 
WITH collect(distinct id(m)) as a, n 
MATCH n-[:ON_TEAM*2]-m 
WITH collect(distinct id(m)) as b, a 
START n=node(*) 
WHERE id(n) in a + b 
RETURN n 
+0

電話良好@ werner-vesteras! –

+0

@ werner-verteras'節點(*)'是否僅限於集合a和b?分別爲IS_FRIEND部分和ON_TEAM * 2部分運行查詢的速度始終比組合查詢快20倍。只需運行兩個查詢並將它們結合到Java中似乎更快。謝謝。 –

+0

@JosephLust我不知道,但我的猜測是,'節點(*)'意味着整個圖形。但是,這是我能做的最好的一個查詢。我相信這可以做得更聰明,但密碼對我來說還是很新的。 –

相關問題