2017-10-30 2 views
2

Ich habe ein sehr einfaches Beispieldiagramm, in dem ich versuche, eine erste Tiefenabfrage zu erhalten. Lassen Sie uns die Graphkanten wie dieseTinkerpop Gremlin Depth Erste Suchreihenfolge

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

Eine Tiefensuche von A aussehen sollte sagen

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

zurückkehren Aber wenn ich die folgenden Auftrag erhalten könnte, es wäre noch besser

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

Wie kann ich eine Gremlin-Abfrage erstellen, die diese Bestellung ausgibt? Wenn ich etwas zu tun wie dies

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

erhalte ich eine Reihenfolge von A, B, C, D, E, F, G, die Breiten sind. Ich kann nicht herausfinden, wie ich die oben angegebene Bestellung bekommen kann.

Antwort

4

Für andere, hier zu reproduzieren ist die Probe Graph:

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() 

Eine Tiefensuche von 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] 

Aber wenn ich zurückkehren sollte könnte das unten bekommen oder Der würde es

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

Dieser irgendwie noch besser sein wird, um die Pfade Aufrollen von hinten. Es ist schwierig, aber machbar:

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] 

Allerdings ist es wahrscheinlich viel einfacher, nur die Wege zu erhalten und die Bestellung auf der Anwendungsseite zu tun.

1

Im Moment: Sie können nicht.

Wir sind Mitleidende. Dies ist ein bekanntes Problem, das ich zunächst auf die mailing list angesprochen habe und dann versuchte eine fix, die leider nur funktioniert, wenn es keine emit Schritt in der Traversal ist. Sie sind eingeladen, bei der Lösung zu helfen, ich hatte noch keine Zeit, tiefer zu graben.

+0

Es ist wirklich überraschend, dass Gremlin Tiefentiefe-Suche nach beliebigen Tiefengraphen nicht machen kann. Es ist ein sehr gebräuchlicher Algorithmus, den Sie in einem Diagramm ausführen möchten. Danke für Ihre Antwort, denn es hat mir gesagt, dass dies nicht für Produktionssysteme bereit ist. – Jon49

+2

Es tut mir leid, dass Gremlin nicht zu Ihrem Anwendungsfall passt, aber bitte gehen Sie nicht so weit zu denken, dass es nicht produktionsbereit ist. Es wird in vielen hochkarätigen Systemen verwendet, die Graph-Datenbanken verwenden. –

Verwandte Themen