通过gremlin查询计算titangraph中的子节点总数

通过gremlin查询计算titangraph中的子节点总数,gremlin,Gremlin,我用Java创建了层次树的titan图。 如何使用gremlin从指定节点中查找总子节点层次结构。 建议我使用gremlin查询进行计数,它应该更快。遍历树的基本模式在于步骤。作为一个例子,我使用TinkerPop文档部分中描述的图表: gremlin> g = TinkerGraph.open().traversal() ==>graphtraversalsource[tinkergraph[vertices:0 edges:0], standard] gremlin> g.

我用Java创建了层次树的titan图。 如何使用gremlin从指定节点中查找总子节点层次结构。
建议我使用gremlin查询进行计数,它应该更快。

遍历树的基本模式在于步骤。作为一个例子,我使用TinkerPop文档部分中描述的图表:

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(内存中)的速度,我生成了一棵400000顶点深的树:

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
gremlin>graph=TinkerGraph.open()
==>tinkergraph[顶点:0边:0]
gremlin>g=graph.traversal()
==>graphtraversalsource[tinkergraph[顶点:0边:0],标准]
gremlin>lastV=g.addV().next()
=>v[0]
小精灵>(0..0)
==>1
==>2
==>3
...
小精灵>图形
==>tinkergraph[顶点:400001边:400000]
gremlin>clockWithResult{g.V(0L)。重复(uuu.out('next'))。发射().count().next()}
==>171.44102253
==>400000

完成时间为171ms。TinkerGraph显然更快,因为它将数据完全保存在内存中。Titan/JanusGraph和其他图形必须从磁盘读取。

你是对的……我已经这样做了……我的问题是如何加快Titan graph的查询执行。我已经正确地完成了索引。请给我一些建议,让总节点数达到4个Lacd它的查询执行只需要5-10秒,在titan graph中只有大约3.5条边……如何加快遍历查询?请帮助我。给我一些java实现的编码Shere的一些一般建议:给定400000个顶点,假设数据不变,您可能只需使用TinkerGraph并保留所有数据a内存中。如果您需要事务处理,并且不希望有大量的增长,那么Neo4j就可以了。如果您希望在最终拥有数十亿个顶点的情况下实现大规模增长,那么您应该坚持使用Titan/JanusGraph。如果您坚持使用Titan/JanusGraph,并且您的树保持深/宽,那么我认为您可能需要对如何做到这一点变得更聪明遍历(如前所述,值的预计算可能是处理它的一种方法)。请注意,您也在使用TinkerPop-不要错过使用它的最佳部分之一-您可以轻松地从一个图形数据库切换到另一个图形数据库。请尝试OrientDB或Neo4j或其中任何一种-对于所有这些数据库,Gremlin仍然是相同的。此外,如果您使用Gremlin控制台,您可以从那里快速进行测试,尤其是在您的图形很小。我用TinkerGraph的快速基准更新了我的答案。你可以对所有其他图形数据库使用相同的脚本来粗略测试速度。他测试的树的深度与我测试的树的深度相同-400000。他针对JanusGraph(以前的Titan)的所有不同后端运行了我的脚本-正如我建议您尝试的那样。我仍然建议您尝试在Gremlin控制台中构建您自己的个人基准测试,以粗略测试不同配置和设置的速度。这非常简单-只需几行代码。对于图表,没有一刀切的答案。您只需要测试您自己的情况。就Grem而言lin代码说,您无法以更优化的方式编写它。