2016-07-13 11 views
0

Kommend von Neo4j und neu nach Arango.AQL Arango - Vertex und Nachbarn mit Kanten

Ich versuche meine Daten abzufragen und eine entsprechende Datenstruktur aufzubauen.

So habe ich so etwas wie:

Circle A 
    /  \ 
Square A Circle B 
      / \   \ 
     Circle C Square B Square D 

Kreis in einer Dokumentensammlung gespeichert werden. Square wird in einer Dokumentensammlung gespeichert.

Ich habe dann zwei Rand Sammlungen HAS_CIRCLE und HAS_SQUARE, die entsprechend entsprechen.

Ich weiß, ich möchte Kreis B und seine Nachbarn - in einer Struktur wie so.

{ 
    circle: {data from Circle B}, 
    parents: [{data from Circle A}], 
    children: [{data from Circle C}], 
    squares: [{data from Square B}, {data from Square D}] 
} 

* Auch zu beachten, ich suche nicht, diese Struktur zu verschachteln. Wie wenn ich {Daten von Circle A} in parents möchte - erwarte ich nicht, dass dies auch Eltern, Kinder, Quadrate hat - nur buchstäblich nach den Metadaten in diesem Knoten suchen.

Ich weiß, dass ich so anfangen kann ... aber ich verliere mich schnell. Und selbst wenn ich die Grundlagen mache - ich kann es nicht richtig sammeln und das Array einem Schlüssel zuordnen.

FOR c in Circle 
    FILTER c.name === 'Circle B' 
    FOR hc in HAS_CIRCLE 
     FILTER hc._from === c._id 

Antwort

2

Sie müssen the trip to the graph documentation in ArangoDB verpasst haben. Natürlich können Sie Dokumentabfragen mit klassischen Joins (wie Sie es ausprobiert haben) verwenden, um Graphiterationen durchzuführen und sie ähnlich wie in herkömmlichem SQL auf anderen RDBMS abzubilden.

jedoch enthüllt ArangoDB seine wirkliche Grafikleistung, wenn Sie use the pattern matching traversals in Abfragen wie folgt:

FOR vertex, edge, path IN 
    1..5 
    OUTBOUND 
    'circle/A' 
    GRAPH circesAndSquares 
    FILTER edge.name == 'Circle B' 
    RETURN {vertices: vertex, edges: edge, paths: path} 

edge den Rand Dokument des aktuellen Traversal Schritt enthält, vertex den Scheitelpunkt. FILTER Sie werden die nicht übereinstimmenden Dokumente aus der RETURN-Anweisung ausblenden. Pfade können auf Iteration Tiefen herausgefiltert werden, die dann in Begriff abbrechen kann eine Traversal:

FILTER path.edges[1].name == 'Circle B' 

Sie können auch auf jeder Iterationstiefe filtern:

FILTER path.vertices[*].isValid == true 

Die Beispiele in der Dokumentation zeigen Howto Arbeit mit dem Namen und anonyme Graphen und wie Sie Ihre Daten in ArangoDB einfügen. ArangoDB hat eine spezielle edge collection type, die implizit _from und _to Attribute auf Edge-Dokumente kennt und erzwingt - aber abgesehen von dieser Einschränkung können Sie sie mit beliebigen Dokumenten füllen.

Sie können auch combine regular AQL queries with graph traversals, as demonstrated in this example.

+1

danke. fügte meinen letzten Ansatz dazu unten hinzu. – savv

+0

Hallo, du solltest deine Lösung dann als 'akzeptiert' markieren ;-) – dothebart

1

Vielen Dank @dothebart - das hat mich in die richtigen Richtungen gerichtet.

meine Abfrage endete wie aus. immer noch nicht 100%, wenn das am idealsten ist, aber ergibt die Ergebnisse, die ich suchte.

FOR c IN Circle 
    FILTER c.name == 'Circle B' 
     RETURN { 
      "circle" : c, 
      "parents": (FOR parents IN INBOUND b._id HAS_CIRCLE RETURN parents)), 
      "children": (FOR children IN OUTBOUND b._id HAS_CIRCLE RETURN children), 
      "squares": (FOR squares IN OUTBOUND b._id HAS_SQUARE RETURN squares) 
     }