【发布时间】:2017-03-24 05:24:24
【问题描述】:
我在 Java 中创建了分层树的泰坦图。 如何使用 gremlin 从指定节点中查找总子节点层次结构。 建议我 gremlin 查询计数,它应该更快。
【问题讨论】:
标签: gremlin
我在 Java 中创建了分层树的泰坦图。 如何使用 gremlin 从指定节点中查找总子节点层次结构。 建议我 gremlin 查询计数,它应该更快。
【问题讨论】:
标签: gremlin
遍历树的基本模式在于repeat() 步骤。例如,我使用 TinkerPop 文档的Tree Recipes 部分中描述的图表:
gremlin> g = TinkerGraph.open().traversal()
==>graphtraversalsource[tinkergraph[vertices:0 edges:0], standard]
gremlin> g.addV(id, 'A').as('a').
......1> addV(id, 'B').as('b').
......2> addV(id, 'C').as('c').
......3> addV(id, 'D').as('d').
......4> addV(id, 'E').as('e').
......5> addV(id, 'F').as('f').
......6> addV(id, 'G').as('g').
......7> addE('hasParent').from('a').to('b').
......8> addE('hasParent').from('b').to('c').
......9> addE('hasParent').from('d').to('c').
.....10> addE('hasParent').from('c').to('e').
.....11> addE('hasParent').from('e').to('f').
.....12> addE('hasParent').from('g').to('f').iterate()
gremlin> g.V('F').repeat(__.in('hasParent')).emit().count()
==>6
gremlin> g.V('C').repeat(__.in('hasParent')).emit().count()
==>3
gremlin> g.V('A').repeat(__.in('hasParent')).emit().count()
==>0
获取计数的关键在于使用emit(),它允许计算repeat() 中遇到的所有遍历器。
只是为了比较使用 TinkerGraph(内存中)可以获得什么样的速度,我生成了一个 400,000 顶点深的树:
gremlin> graph = TinkerGraph.open()
==>tinkergraph[vertices:0 edges:0]
gremlin> g = graph.traversal()
==>graphtraversalsource[tinkergraph[vertices:0 edges:0], standard]
gremlin> lastV = g.addV().next()
==>v[0]
gremlin> (0..<400000).each{lastV=g.V(lastV).as('f').addV().as('t').addE('next').from('f').to('t').select('t').next()}
==>0
==>1
==>2
==>3
...
gremlin> graph
==>tinkergraph[vertices:400001 edges:400000]
gremlin> clockWithResult{ g.V(0L).repeat(__.out('next')).emit().count().next() }
==>171.44102253
==>400000
在 171 毫秒内完成。 TinkerGraph 显然更快,因为它将数据完全保存在内存中。 Titan/JanusGraph 和其他图表必须从磁盘读取。
【讨论】: