Tinkerpop Gremlin Depth First Search Order

时间:2017-10-30 11:13:57

标签: gremlin tinkerpop

我有一个非常简单的示例图表,我试图获得深度优先查询。假设图形边缘看起来像这样

A->B
A->C
B->D
B->E
C->F
C->G

A的深度优先搜索应返回

A-B-D-E-C-F-G

但如果我能得到以下订单,那就更好了

D-E-B-A-F-G-C-A

如何创建将输出此订单的Gremlin查询?如果我做这样的事情

g.V('A').repeat(outE().inV()).emit()

我得到了A,B,C,D,E,F,G的顺序,这是第一个广度。我无法弄清楚如何获得我想要的订单。

2 个答案:

答案 0 :(得分:4)

要让其他人重现,请参阅示例图表:

g = TinkerGraph.open().traversal()
g.addV().property(id, 'A').
  addV().property(id, 'B').
  addV().property(id, 'C').
  addV().property(id, 'D').
  addV().property(id, 'E').
  addV().property(id, 'F').
  addV().property(id, 'G').
  addE('link').from(V('A')).to(V('B')).
  addE('link').from(V('A')).to(V('C')).
  addE('link').from(V('B')).to(V('D')).
  addE('link').from(V('B')).to(V('E')).
  addE('link').from(V('C')).to(V('F')).
  addE('link').from(V('C')).to(V('G')).iterate()
  

A的深度优先搜索应返回

     

A-B-D-E-C-F-G

gremlin> g.V('A').repeat(out('link')).until(__.not(outE('link'))).path().
           unfold().dedup().id().fold()
==>[A,B,D,E,C,F,G]
  

但如果我能得到以下订单,那就更好了

     

D-E-B-F-G-C-A

这个有点卷起后面的路径。这很棘手,但可行:

gremlin> g.V('A').
           repeat(outE('link').aggregate('edges').inV()).
             until(__.not(outE('link'))).
           flatMap(
             union(identity(),
                   repeat(inE('link').where(within('edges')).as('current').
                          map(select('edges').unfold().
                                where(neq('current').and(without('done'))).
                              outV().where(without('ad')).fold()).as('bl').
                          select(last, 'current').store('done').
                            filter(outV().where(without('bl').and(without('ad')))).
                          outV().store('ad')).
                     emit())).
           id().fold()
==>[D,E,B,F,G,C,A]

但是,在应用程序端获取路径并进行排序可能要容易得多。

答案 1 :(得分:1)

目前:你做不到。

我们是共同受害者。这是我最初在mailing list上提出的一个已知问题,然后尝试了fix,遗憾的是,只有在遍历中没有emit步骤时才会有效。你被邀请帮忙解决它,我还没来得及深入挖掘。