2014-03-06 4 views
1

타이탄 (hbase) 그래프에서 주어진 노드에 공통 조상을 얻고 싶습니다. gremlin을 사용하면 공통 조상을 얻을 수있는 방법이 있습니까? 또는 다른 노드/libs 주어진 노드에 대한 타이탄 그래프에서 공통 조상을 찾을 수 있습니까?타이탄 그래프의 공통 조상 ..

답변

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 단계 떨어져있는 루프와 {true} 클로저는 단순히 루프의 모든 단계에서 값을 출력하는 것을 의미합니다. 이런 의미 v[1]에서

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

세 개의 자식 노드 사이의 유일한 공통 조상입니다 만 2 세 자식 노드의 그 조상을 공유 공통 조상은 각 경로가 두 번 이상 종료 하나가 될 것입니다.

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

지금 4을 정점 공통 조상으로 포함되어 있습니다 : 그것은 더 흥미로운 수 있도록하기 위해,이 4을 정점과 순회를 다시 실행 정점 6를 연결할 수 있습니다. 그것은 버텍스가 6이고 5입니다. 정점 4의 공유 특성을 감안할 때 6도 이제 정점 1을 공유하므로 조상은 세 개의 정점 모두에서 공유됩니다.

업데이트 : 위의 대답은 TinkerPop 2.x 용이고 다음은 TinkerPop 3.x 용입니다.

은이 나무를 감안할 때 :이 항목은 TinkerPop recipes에 자세히 설명되어

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] 

:

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() 

는 당신이 공통의 조상을 찾을 수 있습니다.

관련 문제