2013-10-29 124 views
0

我有一個帶有已定義節點的圖形數據庫。我想找到最終節點,給定我的起始節點和最後一個邊(末端節點存在於此)。例如:給定起始節點和結束邊緣的圖中的末端節點

A-(知道) - > B-(喜歡) - > C-(股) - > d 其中(....)是關係

現在,如果我想提出一個問題,讓一個節點'A'給我它直接或間接「共享」的節點。這應該回復'D'。所以基本上給了一個開始節點,並且結束邊緣我可以找到我想要的節點。

我的問題是,Cypher(或者gremlin)有可能嗎?如果是這樣,那麼正確的方法是什麼?

+0

不太明白這個問題。你可以在http://console.neo4j.org上創建一個例子並分享你的樣本圖嗎? –

回答

1

模式「開始節點和最後的邊緣已知,發現端節點」可能在Cypher支架爲

START a=node:nodeIndex({indexQueryParam}) 
MATCH a-[?*]->()-[:SHARES]->d 
RETURN d 

?狀態,該模式的這一部分是可選的,*它可以被稱任何長度。你可能不需要兩者,因爲可變長度可以意味着長度爲零,但在你進一步充實你的模式時要記住。由於您不需要B節點,因此您不必綁定它 - 空括號沒有問題。

但是,這種模式是非常普遍的,根據您的數據,它可能是昂貴的(這有點像用炸藥釣魚)。您可以在圖表中找到其他關係類型的例子,KNOWSLIKES。任何你可以引入來指定你的模式的東西都會使你的查詢執行得更好。

MATCH a-[?:KNOWS|LIKES*]->()-[:SHARES]->d 

,或者如果你知道在哪個訂購這些會發生

MATCH a-[?:KNOWS]->()-[LIKES*]->()-[:SHARES]->d 

這裏的格局KNOWS部分只有一個深沉,而LIKES部分是零到無窮大深。 KNOWS部分是可選的,這意味着通過此可選部分鏈接到a的模式的整個部分也是可選的。

最後,讓可變深度範圍在零和無窮之間通常不是一個好主意。引入一個上限和下限都有意義的數據,像這樣

MATCH a-[?:KNOWS]->()-[LIKES*1..4]->()-[:SHARES]->d 

你必須看看你找到的模式(或強加)數據,並據此制定你的暗號查詢模式,請儘可能多地指定密碼模式,只保留那些您想要由圖表填充的未定義的部分。

+0

謝謝!工作,它也是有道理的。我同意它不是最優的,但我可以解決這個問題。出於好奇,對於這樣的操作,Cypher是最好的選擇嗎?或者我應該使用Gremlin或Java API自己來遍歷自己。或者,這是一個蘋果橙子的比較。 –

2

這裏的所有相同的警告從jjaderberg接受答案的小鬼(即昂貴,因此試圖限制你在圖形碰一下就可能需要):

gremlin> g = new TinkerGraph()                     
==>tinkergraph[vertices:0 edges:0] 
gremlin> g.loadGraphML('data/graph-example-2.xml')                
==>null 
gremlin> ends=[] as Set;g.v(1).as('x').outE.as('e').inV.sideEffect{v,m->if (m.e.label=="followed_by") {ends<<v}}.loop('x'){it.loops<3}.iterate()     
==>null 
gremlin> ends   
==>v[2] 
==>v[3] 
==>v[4] 
==>v[5] 
==>v[6] 
==>v[50] 
... 

爲了打破這種說法倒位,我基本上構造了一個名爲ends的集合,我們將在其中聚合在「followed_by」邊緣結尾處找到的唯一頂點。我們從頂點1開始,遍歷所有邊到頂點...在小鬼的本質這一部分:

g.v(1).as('x').outE.as('e').inV 

然後我sideEffect那些頂點入套,如果他們來了一個「followed_by」標籤的方式。對於sideEffect這兩個參數步驟關閉有時會在Gremlin中被忽略,我認爲...您可以閱讀更多關於它的文章here。該語句通過循環回管道以從這些頂點進一步遍歷出來結束。我強制在3個步驟中斷循環。