2013-03-01 64 views
0

我相信我應該是一個非常簡單,但由於某種原因,我沒有前進。我有經典的社交網絡設置,用戶可以成爲彼此的朋友。我知道要想象一個用戶的網絡D3.jsNeo4j Cypher:獲得共同的朋友網絡

對於這一點,其明顯的如何讓朋友現在

user -[:friend]- friend 

,我也想顯示用戶的好友之間的聯繫,使之很好地集合在一個力指向圖中。但是,這是我目前的問題,因爲我想知道「朋友」組是如何相互連接的。我第一次想到

with friend 
match friend -[connection:friend]- friend 

會工作,但顯然不會。我似乎忽略了一件非常明顯的事情,但我不確定是什麼。

編輯:小鬼是值得歡迎的也可能是更高性能如果更多的遍歷-Y /明確

+0

不與朋友做賽後後者在聲明'...'而是把它直接進入比賽階段,比如'MATCH用戶 - [:朋友] -firend- [連接:朋友] -friend2'。這對你有用嗎? – ulkas 2013-03-01 08:50:12

+0

感謝您的回答。我知道我怎麼能找到朋友的朋友,但那是我想要的超集。我只想要朋友的朋友也是用戶的朋友,這也是可選的。如果你認爲每個人都有100個朋友,我想要這個用戶,他的100個朋友,以及這101個人如何彼此交朋友 – nambrot 2013-03-01 12:43:36

回答

0

或許這將激發你使用小鬼的解決方案。我將你的問題改編成標準的TinkerPop玩具圖。我着手找出以下幾點:

對於一個特定的頂點,發現所有它連接到頂點,然後各自如何在總集那些頂點都彼此相關。這聽起來像你正在尋找你的描述。

於是我開始:

gremlin> g = TinkerGraphFactory.createTinkerGraph()    
==>tinkergraph[vertices:6 edges:6] 
gremlin> g.v(1).outE.as('x').inV.loop(2){it.loops<3}{true}.select 
==>[x:e[7][1-knows->2]] 
==>[x:e[8][1-knows->4]] 
==>[x:e[9][1-created->3]] 
==>[x:e[10][4-created->5]] 
==>[x:e[11][4-created->3]] 

對於頂點ID爲1,讓所有的出邊,然後循環再次,要得到朋友邊緣,最後選擇了「X」的步驟的值。這讓你至少知道子圖是在g.v(1)附近,但是當我讀到你的問題時,你想進一步將子圖限制在與g.v(1)相連的頂點上。看看結果,e [10]確實不應該被包含,因爲g.v(1)和g.v(5)之間沒有邊界。

我進一步細化查詢,以消除來自子這種關係:

gremlin> x=[g.v(1)];g.v(1).out.aggregate(x).back(2).outE.filter{x.contains(it.inV.next())}.as('e').inV.loop(3){it.loops<3}{true}.select 
==>[e:e[7][1-knows->2]] 
==>[e:e[8][1-knows->4]] 
==>[e:e[9][1-created->3]] 
==>[e:e[11][4-created->3]] 

所以上面基本上說,

  • 初始化列表X將認爲應持有的所有頂點在子圖中。
  • gv(1).out.aggregate(x)基本上把我想要的所有頂點放在子圖中,除了我用
  • 將它初始化的那個頂點追溯到遍歷的開始並找出包含x中頂點的邊,然後像以前那樣循環它,並選擇作爲邊列表的「e」步的值。

現在你可以看到e [10]不再在結果中。從這裏你可以很容易地構建可視化輸出。