【问题标题】:Tinkerpop Gremlin Depth First Search OrderTinkerpop Gremlin 深度优先搜索顺序
【发布时间】:2017-10-30 11:13:57
【问题描述】:

我有一个非常简单的示例图,我正在尝试对其进行深度优先查询。假设图形边缘看起来像这样

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 的顺序,这是广度优先的。我不知道如何获得上面我想要的订单。

【问题讨论】:

    标签: gremlin tinkerpop


    【解决方案1】:

    为了让其他人重现,这是示例图:

    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]
    

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

    【讨论】:

      【解决方案2】:

      目前:你不能。

      我们是共同受难者。这是我最初在mailing list 上提出的一个已知问题,然后尝试了fix,不幸的是,只有在遍历中没有emit 步骤时才有效。邀请您帮助修复它,我还没有时间深入挖掘。

      【讨论】:

      • Gremlin 不能对任意深度图进行深度优先搜索,这真是令人惊讶。这是您希望在图形上执行的一种非常常见的算法。感谢您的回答,因为它告诉我这还没有准备好用于生产系统。
      • 很抱歉 Gremlin 不适合您的用例,但请不要认为它还没有准备好投入生产。它在许多使用图形数据库的高端系统中使用。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多