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
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? –
Eine andere Frage: Was ist der Unterschied zwischen 'graph._addVertexCollection' und' db._create'? –
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