2016-05-04 16 views
3

Ich bin neu bei ArangoDB. Ich bin vertraut mit Neo4J, wurde aber von ArangoDBs Performance und Multi-Modell Design angezogen. Die Dokumentation scheint sehr tief zu sein, aber ich habe Probleme damit anzufangen.ArangoDB - Grundlagen der Graphenerstellung

Ich möchte eine einfache Möglichkeit kennen, einige grundlegende Grafikoperationen zu tun. Alles, was ich bisher gefunden habe, sagt mir, wie man ganze Sammlungen miteinander verbindet, aber ich möchte einfach einen Knoten definieren, einen anderen Knoten definieren und die Kante zwischen ihnen definieren können.

Im Idealfall über HTTP, wie kann ich:

  • einen Knoten des Graphen hinzufügen
  • eine Kante zwischen zwei Knoten erstellen ich zu meinem Graph
  • eine Sammlung erstellen und fügen vorhandenen Knoten hinzugefügt haben zu dieser Sammlung

Als Beispiel würde Ich mag eine einfache grafische Darstellung wie der Baum hier dargestellt erstellen: https://www.arangodb.com/2015/07/data-modeling-with-multi-model-databases/

Aircraft fleet maintenance example tree

Ich möchte grundlegende Anweisungen zum Erstellen einer Teilmenge dieses Diagramms. Ich möchte:

  • Knoten airline0 und airline1 in einer Sammlung fleets genannt genannt erstellen.
  • Erstellen Sie Knoten plane0, plane1, plane2 in einer Sammlung namens planes. - Geben Sie ein beliebiges Attribut in das Dokument jeder Ebene ein, sagen wir Farbe.
  • Erstellen Sie in einer Sammlung namens pilots einen Knoten mit der Bezeichnung Jennifer.

Als nächstes würde ich gerne die Grafik verbinden. Basierend auf der Dokumentation sieht es so aus, als wären Kanten selbst Dokumente und können daher Attribute haben. Ich möchte die folgenden Kanten erstellen:

  • (airline0)-[owns]->(plane0)
  • (airline0)-[owns]->(plane1) diese Kante since: 2013 als Attribut
  • (airline1)-[owns]->(plane2)
  • (airline1)-[previouslyOwned]->(plane1)between: [1999,2013]
  • (plane0)-[inFleet]->(airline0)
  • (plane1)-[inFleet]->(airline0)
  • hatbetween: [1999,2013]
  • (plane2)-[inFleet]->(airline1)
  • (jennifer)-[canfly]->(plane0)
  • (plane0)-[hasPilot]->(jennifer)

Bitte zeigen Sie mir, wie ich ein solches Diagramm über HTTP erstellen können. Wenn nicht HTTP, würde ich gerne wissen, wie man das über Arangosh macht.

Antwort

8

Lassen Sie mich mit dem Arangosh beginnen, weil es einfacher zu lesen ist.Ich gebe die HTTP-Befehle als Addendum.

ArangoDB Shell

Sie müssten die drei Dokumentensammlungen „Flotten“, „Ebenen“ und „Piloten“, wie Sie bereits erwähnt und eine zumindest eine Kante Sammlung der Graphenstruktur zu halten. Wenn Sie die Diagrammstruktur zwischen "owners" und "inFleet" und "canfly" durchqueren möchten, empfehle ich , eine Sammlung "relations" zu verwenden und den Kanten ein Attribut "type" zu geben.

Eine alternative Lösung ist die Verwendung von drei Kantensammlungen "ownes" und "inFleet" und "canfly". Um eine fundiertere Empfehlung abzugeben, wäre es gut, mehr über Ihren Anwendungsfall zu erfahren.

arangosh [_system]> db._create("fleets"); 
[ArangoCollection 139792431, "fleets" (type document, status loaded)] 

arangosh [_system]> db._create("planes"); 
[ArangoCollection 140382255, "planes" (type document, status loaded)] 

arangosh [_system]> db._create("pilots"); 
[ArangoCollection 140972079, "pilots" (type document, status loaded)] 

arangosh [_system]> db._createEdgeCollection("relations"); 
[ArangoCollection 141103151, "relations" (type edge, status loaded)] 

Als nächstes erstellen Sie die Dokumente in der Sammlung "Flotten". Ich werde den Namen der Fluggesellschaft als Schlüssel verwenden. Abhängig von Ihrem Anwendungsfall könnte es einen besseren Schlüssel geben. Zum Beispiel gibt es vielleicht eine universelle Abkürzung (wie LH für Lufthansa).

arangosh [_system]> db.fleets.save({ _key: "airline0", name: "Airline 0" }); 
arangosh [_system]> db.fleets.save({ _key: "airline1", name: "Airline 1" }); 

Wiederholen Sie das gleiche für Flugzeuge und Piloten:

arangosh [_system]> db.planes.save({ _key: "plane0", name: "Plane Zero", color: "red" }) 
arangosh [_system]> db.planes.save({ _key: "plane1", name: "Plane One", color: "red" }) 
arangosh [_system]> db.planes.save({ _key: "plane2", name: "Plane One", color: "green" }) 
arangosh [_system]> db.pilots.save({ _key: "jennifer", name: "Jenifer" }); 

Sie sollten die Tasten wählen nach Ihren Anwendungsfall. Wenn keine "natürlichen" Schlüssel vorhanden sind, lassen Sie das Attribut "_key" aus. ArangoDB generiert einen eindeutigen Schlüssel für Sie.

Fügen Sie als Nächstes die Beziehungen zwischen den oben erstellten Knoten hinzu. Die Syntax in ArangoDB 2.8 ähnelt der Erstellung eines Dokuments oben. Außerdem müssen Sie die "from" und "to" Schlüssel der Scheitelpunkte angeben, die Sie verbinden möchten.

arangosh [_system]> db.relations.save("fleets/airline0", "planes/plane0", { type: 'owns' }); 
arangosh [_system]> db.relations.save("fleets/airline0", "planes/plane1", { type: 'owns', since: 2013 }); 
arangosh [_system]> db.relations.save("fleets/airline1", "planes/plane2", { type: 'owns' }); 
arangosh [_system]> db.relations.save("fleets/airline1", "planes/plane1", { type: 'previouslyOwned', begin: 1999, end: 2013 }); 
arangosh [_system]> db.relations.save("pilots/jennifer", "planes/plane0", { type: 'canfly' }); 

Wenn ‚InFLEET‘/‚wasInFleet‘/‚hasPilot‘ ist das Gegenteil von ‚besitzt‘/‚previouslyOwned‘/‚canfly‘, als Sie keine separate Kante dafür schaffen müssen, weil Kanten sind direktional.

Wenn es Unterschiede zwischen ‚besitzt‘ und ‚InFLEET‘ können Sie die Beziehungen ähnlich der oben schaffen:

arangosh [_system]> db.relations.save("planes/plane0", "fleets/airline0", { type: 'inFleet' }); 
... 

Jetzt zu folgen, um den Pfad Verwendung „jennifer kann Planex von airlineY Besitz fliegen“ :

arangosh> db._query("FOR v, e IN OUTBOUND 'pilots/jennifer' relations FILTER e.type == 'canfly' FOR w, f IN INBOUND v relations FILTER f.type == 'owns' RETURN { plane: v, airline: w }") 
[ 
    { 
    "plane" : { 
     "color" : "red", 
     "name" : "Plane Zero", 
     "_id" : "planes/plane0", 
     "_rev" : "153686063", 
     "_key" : "plane0" 
    }, 
    "airline" : { 
     "name" : "Airline 0", 
     "_id" : "fleets/airline0", 
     "_rev" : "149884975", 
     "_key" : "airline0" 
    } 
    } 
] 

oder den Pfad zu umkehren (ohne 'InFLEET' und 'hasPilot') senden:

arangosh> db._query("FOR v, e IN OUTBOUND 'fleets/airline0' relations FILTER e.type == 'owns' FOR w, f IN INBOUND v relations FILTER f.type == 'canfly' RETURN { plane: v, w: w }") 
[ 
    { 
    "plane" : { 
     "color" : "red", 
     "name" : "Plane Zero", 
     "_id" : "planes/plane0", 
     "_rev" : "153686063", 
     "_key" : "plane0" 
    }, 
    "w" : { 
     "_id" : "pilots/jennifer", 
     "_rev" : "330240047", 
     "_key" : "jennifer" 
    } 
    } 
] 

HTTP

Lassen Sie mich Ihnen ein Beispiel für die verschiedenen Arten von Befehlen geben, die oben ausgeführt wurden.

arangosh [_system]> db._create("fleets"); 

dies führt zu

curl -X POST --data-binary @- --dump - http://localhost:8529/_api/collection <<EOF 
{ 
    "name" : "fleets" 
} 
EOF 

Weiter

arangosh [_system]> db._createEdgeCollection("relations"); 

übersetzt

curl -X POST --data-binary @- --dump - http://localhost:8529/_api/collection <<EOF 
{ 
    "name" : "relations", "type": 3 
} 
EOF 

Weiter

arangosh [_system]> db.fleets.save({ _key: "airline0", name: "Airline 0" }); 

übersetzt

curl -X POST --data-binary @- --dump - http://localhost:8529/_api/document?collection=products <<EOF 
{ "_key": "airline0", "name": "Airline 0" } 
EOF 

Weiter

db.relations.save("pilots/jennifer", "planes/plane0", { type: 'canfly' }); 

übersetzt

curl -X POST --data-binary @- --dump - http://localhost:8529/_api/edge/?collection=relations&from=pilots/jennifer&to=planes/plane0 <<EOF 
{ 
    "type" : "canfly" 
} 
EOF 
+1

Perfect! Vielen Dank! Nachdem ich mich in der Dokumentation vertieft hatte, fand ich einiges davon, aber die Durchquerung war mir bis jetzt nicht klar. Ich würde gerne mehr über die Vorteile einer einzelnen Randsammlung im Vergleich zu mehreren erfahren. Kann ich mehrere Edge-Sammlungen durchsuchen? Oder kann ich nur innerhalb eines gehen? –

+1

Eine andere Frage: Was ist der Unterschied zwischen 'graph._addVertexCollection' und' db._create'? –

+0

ArangoDB unterstützt benannte und unbenannte Graphen. Benannte Graphen werden mit "graph ...." erstellt. Sie können auch anonyme Graphen verwenden, die Kantensammlungen verwenden, die mit "db ...." erstellt wurden. Und ja, Sie können mehrere Randsammlungen verwenden. Da die Kommentare in ihrer Größe eingeschränkt sind, ist es möglicherweise einfacher, die Diskussion unter https://groups.google.com/forum/#!forum/arangodb fortzusetzen – fceller