【问题标题】:Finding the children of each and every node while traversing upto the leaves of the tree using Gremlin在使用 Gremlin 遍历树的叶子时找到每个节点的子节点
【发布时间】:2015-04-21 14:11:33
【问题描述】:

假设我有一棵像这样的树

现在盯着顶点8,我想找到顶点8的孩子,即{3,10},将它们存储在ma​​p中,然后再次对剩余的顶点继续相同的过程顶点直到我到达叶节点(在编写查询时树的高度是未知的)。

我想编写一个查询来执行上述操作,并且应该返回一个包含这些 ma​​psIterator。 请帮助我编写此查询。

【问题讨论】:

  • 你有什么尝试吗?

标签: java titan gremlin tinkerpop


【解决方案1】:

你可以考虑tree步骤:

gremlin> g = TinkerGraphFactory.createTinkerGraph()
==>tinkergraph[vertices:6 edges:6]
gremlin> t=new Tree();g.v(1).out.tree(t).loop(2){true}
gremlin> t
==>v[1]={v[2]={}, v[3]={}, v[4]={}}
==>v[4]={v[3]={}, v[5]={}}

我没有完全遵循您问题的预期格式部分,因此我不确定上述内容是否完全符合您的要求。您可以根据需要使用一些 groovy 从那里转换 t,因为它可以立即完成大部分工作。

【讨论】:

  • 嗨@stephen,查询完美。一个小小的疑问。我的查询类似于g.V().has("mgrNo",814754).out.tree(t).loop(2){true},对应的输出是v[4156928] = {v[24320]={}, v[8156672]={}}v[7980032] = {v[4156928]={}}v[24320] = {v[92160]={}, v[8165376]={}}v[8156672] = {v[92160]={}, v[8165376]={}}。根据查询,mgrNo 对应于 v[7980032]。但它作为树中的第二个条目而不是第一个返回。
  • 不保证Tree 的顺序,因为它基于HashMapgithub.com/tinkerpop/pipes/blob/…
  • 感谢您的澄清 :)
  • 如果查询有循环,那么这个查询会无限循环对吗?
  • 是的 - 我倾向于不喜欢写 .loop(2){true} - 像 loop(2){it.loops<1024} 这样的停止循环的合理默认设置通常被认为是更好的做法。我想我在回答这个问题时假设你没有周期。
【解决方案2】:

在 GremlinPipeLine 中执行相同的查询

Tree tree = new Tree();
    new GremlinPipeline(graph).V().has("mgrNo", 814754).out("manager of").tree(tree).loop(2, new PipeFunction<LoopBundle,Boolean>() {

        @Override
        public Boolean compute(LoopBundle loopBundle) {
            return true;
        }
    }).iterate();
Iterator it = tree.entrySet().iterator();
    while (it.hasNext()) {
        Map.Entry pair = (Map.Entry)it.next();
        System.out.println(pair.getKey() + " = " + pair.getValue());

       }
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-11-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-16
    • 1970-01-01
    相关资源
    最近更新 更多