我有一個帶有已定義節點的圖形數據庫。我想找到最終節點,給定我的起始節點和最後一個邊(末端節點存在於此)。例如:給定起始節點和結束邊緣的圖中的末端節點
A-(知道) - > B-(喜歡) - > C-(股) - > d 其中(....)是關係
現在,如果我想提出一個問題,讓一個節點'A'給我它直接或間接「共享」的節點。這應該回復'D'。所以基本上給了一個開始節點,並且結束邊緣我可以找到我想要的節點。
我的問題是,Cypher(或者gremlin)有可能嗎?如果是這樣,那麼正確的方法是什麼?
我有一個帶有已定義節點的圖形數據庫。我想找到最終節點,給定我的起始節點和最後一個邊(末端節點存在於此)。例如:給定起始節點和結束邊緣的圖中的末端節點
A-(知道) - > B-(喜歡) - > C-(股) - > d 其中(....)是關係
現在,如果我想提出一個問題,讓一個節點'A'給我它直接或間接「共享」的節點。這應該回復'D'。所以基本上給了一個開始節點,並且結束邊緣我可以找到我想要的節點。
我的問題是,Cypher(或者gremlin)有可能嗎?如果是這樣,那麼正確的方法是什麼?
模式「開始節點和最後的邊緣已知,發現端節點」可能在Cypher支架爲
START a=node:nodeIndex({indexQueryParam})
MATCH a-[?*]->()-[:SHARES]->d
RETURN d
的?
狀態,該模式的這一部分是可選的,*
它可以被稱任何長度。你可能不需要兩者,因爲可變長度可以意味着長度爲零,但在你進一步充實你的模式時要記住。由於您不需要B
節點,因此您不必綁定它 - 空括號沒有問題。
但是,這種模式是非常普遍的,根據您的數據,它可能是昂貴的(這有點像用炸藥釣魚)。您可以在圖表中找到其他關係類型的例子,KNOWS
和LIKES
。任何你可以引入來指定你的模式的東西都會使你的查詢執行得更好。
MATCH a-[?:KNOWS|LIKES*]->()-[:SHARES]->d
,或者如果你知道在哪個訂購這些會發生
MATCH a-[?:KNOWS]->()-[LIKES*]->()-[:SHARES]->d
這裏的格局KNOWS
部分只有一個深沉,而LIKES
部分是零到無窮大深。 KNOWS
部分是可選的,這意味着通過此可選部分鏈接到a
的模式的整個部分也是可選的。
最後,讓可變深度範圍在零和無窮之間通常不是一個好主意。引入一個上限和下限都有意義的數據,像這樣
MATCH a-[?:KNOWS]->()-[LIKES*1..4]->()-[:SHARES]->d
你必須看看你找到的模式(或強加)數據,並據此制定你的暗號查詢模式,請儘可能多地指定密碼模式,只保留那些您想要由圖表填充的未定義的部分。
謝謝!工作,它也是有道理的。我同意它不是最優的,但我可以解決這個問題。出於好奇,對於這樣的操作,Cypher是最好的選擇嗎?或者我應該使用Gremlin或Java API自己來遍歷自己。或者,這是一個蘋果橙子的比較。 –
這裏的所有相同的警告從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個步驟中斷循環。
不太明白這個問題。你可以在http://console.neo4j.org上創建一個例子並分享你的樣本圖嗎? –