在titan(hbase)图中,我想获得给定节点的共同祖先。 使用gremlin有什么方法可以让我们得到共同的祖先? 或者任何其他的Utils / libs可以在给定节点的Titan图中找到共同的祖先吗?
答案 0 :(得分: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}
闭包只是意味着在循环的所有步骤输出值。共同的祖先是每条路径不止一次终止的祖先:
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
被包含为共同的祖先。它有顶点6
和5
的子节点。鉴于顶点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]
中更全面地讨论了这个主题