【问题标题】:counting total child nodes in titangraph through gremlin query通过gremlin查询计算titangraph中的子节点总数
【发布时间】:2017-03-24 05:24:24
【问题描述】:

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

【问题讨论】:

    标签: gremlin


    【解决方案1】:

    遍历树的基本模式在于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 和其他图表必须从磁盘读取。

    【讨论】:

    • 你是对的....我已经这样做了....我的问题是如何加快泰坦图的查询执行。我已经正确地完成了索引。给我一些关于最多 4 个 lacs 的总节点树的建议,它的查询执行只需要 5-10 秒的时间
    • titan-graph 中大约有 3.5 条边.....如何加快遍历查询?请帮我。给我一些java实现的编码
    • 这里有一些一般性建议:给定 400000 个顶点并假设您的数据没有改变,您可能只使用 TinkerGraph 并将所有数据保存在内存中。如果您需要交易并且不期望有很大的增长,那么 Neo4j 就可以了。如果您预计最终将拥有数十亿个顶点的大规模增长,那么您应该坚持使用 Titan/JanusGraph。如果您坚持使用 Titan/JanusGraph 并且您的树仍然很深/很宽,那么我认为您可能需要对如何进行这种遍历变得聪明(如前所述,值的预计算可能是处理它的一种方法)。
    • 请注意,您也在使用 TinkerPop - 不要错过使用它的最佳部分之一 - 您可以轻松地从一个图形数据库切换到另一个。尝试 OrientDB 或 Neo4j 或其中任何一个 - Gremlin 对所有这些仍然是相同的。此外,如果您使用 Gremlin 控制台,您可以从那里快速测试,特别是因为您的图表很小。我用 TinkerGraph 的快速基准更新了我的答案。您可以对所有其他图形数据库使用相同的脚本来粗略测试速度。
    • 他测试的树的深度与我测试的相同 - 400000。他针对 JanusGraph(以前的 Titan)的所有不同后端运行我的脚本 - 正如我建议你尝试的那样。我仍然建议您尝试在 Gremlin 控制台中构建自己的个人基准测试,以粗略测试不同配置和设置的速度。做起来非常简单——几行代码。没有一种尺寸适合所有图表的答案。你只需要测试你自己的情况。就 Gremlin 代码而言,您无法以更优化的方式编写它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-03-18
    • 1970-01-01
    • 2018-11-18
    • 2012-01-26
    • 2013-06-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多