2014-03-06 74 views
1

在泰坦(hbase)圖中,我想爲給定節點獲得共同的祖先。 使用gremlin有什麼辦法可以獲得共同的祖先? 或任何其他Utils/libs可用於在給定節點的Titan圖中找到共同的祖先?泰坦圖中的共同祖先..

回答

3

我會對你在這裏找到的具體內容做一些假設,但也許這個答案會激勵你想出你正在尋找的東西。我用toy graph來演示這種方法,並假定邊緣定向指向兒童。顯然,這不是一個完美的樹,但有足夠的數據來證明遍歷。以下是我所想找到祖先的「孩子」:

gremlin> g = TinkerGraphFactory.createTinkerGraph() 
==>tinkergraph[vertices:6 edges:6] 
gremlin> children = [g.v(2),g.v(5),g.v(6)] 
==>v[2] 
==>v[5] 
==>v[6] 

我可以通過祖先遞歸循環向上穿過樹,看到如下路徑:

gremlin> children._().in.loop(1){it.loops<5}{true}.path 
==>[v[2], v[1]] 
==>[v[5], v[4]] 
==>[v[5], v[4], v[1]] 

以上線帽距離祖先和閉包5步的循環僅僅意味着在循環的所有步驟輸出值。一個共同的祖先將是其中的每個路徑終止一次以上:

gremlin> children._().in.loop(1){it.loops<5}{true}.groupCount.cap.next().findAll{it.value>1} 
==>v[1]=2 

在這個意義上v[1]是三個子節點中唯一的共同祖先,並且只有3個節點2共享祖先。爲了使它更有趣,讓我們連接頂點6到頂點4和重新執行遍歷:

gremlin> children._().in.loop(1){it.loops<5}{true}.groupCount.cap.next().findAll{it.value>1} 
==>v[1]=3 
==>v[4]=2 

現在頂點4是作爲一個共同的祖先。它有頂點65的孩子。鑑於頂點4的共享性質,6現在也共享頂點1,以便祖先現在由所有三個頂點共享。

更新:以上答案適用於TinkerPop 2.x,以下內容適用於TinkerPop 3.x.

鑑於此樹:

gremlin> g.addV().property(id, 'A').as('a'). 
      addV().property(id, 'B').as('b'). 
      addV().property(id, 'C').as('c'). 
      addV().property(id, 'D').as('d'). 
      addV().property(id, 'E').as('e'). 
      addV().property(id, 'F').as('f'). 
      addV().property(id, 'G').as('g'). 
      addE('hasParent').from('a').to('b'). 
      addE('hasParent').from('b').to('c'). 
      addE('hasParent').from('d').to('c'). 
      addE('hasParent').from('c').to('e'). 
      addE('hasParent').from('e').to('f'). 
      addE('hasParent').from('g').to('f').iterate() 

你可以找到共同的祖先有:

gremlin> g.V('A'). 
......1> repeat(out('hasParent')).emit().as('x'). 
......2> repeat(__.in('hasParent')).emit(hasId('D')). 
......3> select('x').limit(1) 
==>v[C] 

本主題在TinkerPop recipes更充分的討論。