2

私は ArangoDB と OrientDB およびその他のグラフ データベースを調べており、階層データ (ツリー、ファイル ディレクトリなど) を格納する機能をサポートし、REST API を介して自動的に、またはほとんどいじらずに公開する機能を知る必要があります。

したがって、http://localhost.com/parent/にアクセスすると、このレベルのすべての子が一覧表示されます。またはhttp://localhost.com/parent/child4/child1/leafでリーフ ノードが表示されます。

4

1 に答える 1

2

ArangoDB はこの REST API を自動的に生成しませんが、ほとんど手間をかけずに生成できます。ノード間の接続をエッジ コレクションに格納すると、次のような小さな Foxx アプリケーションを介してそれらを公開できます。このコードは、ノードがコレクション「v」に格納され、ノード間の接続がコレクション「e」に格納されていることを前提としています。

(function() {
  "use strict";

  // Initialise a new FoxxApplication.
  var FoxxApplication = require("org/arangodb/foxx").Controller,
    controller = new FoxxApplication(applicationContext),
    db = require("org/arangodb").db;

  controller.get("/*", function (req, res) {
    var nodeCollection = db.v;
    var edgeCollection = db.e;

    var requestedNode = req.suffix.pop();

    try {
      var node = nodeCollection.document(requestedNode);
      var subNodes = edgeCollection.outEdges(nodeCollection.name() + "/" + requestedNode);

      res.json({ node: node, subNodes: subNodes });
    }
    catch (err) {
      res.json("oops, some error happened!");
    }
  });
}());

次の JavaScript を使用して、いくつかのサンプル ノードをセットアップしました。

db._create("v");
db._createEdgeCollection("e");

/* nodes */
db.v.save({ _key: "root" });
db.v.save( { _key: "subnode1" });
db.v.save( { _key: "subnode2" });
db.v.save( { _key: "subnode3" });
db.v.save( { _key: "subnode1-1" });
db.v.save( { _key: "subnode1-2" });
db.v.save( { _key: "subnode1-3" });
db.v.save( { _key: "subnode2-1" });
db.v.save( { _key: "subnode2-2" });

/* connections */
db.e.save("v/root", "v/subnode1", { });
db.e.save("v/root", "v/subnode2", { });
db.e.save("v/root", "v/subnode3", { });
db.e.save("v/subnode1", "v/subnode1-1", { });
db.e.save("v/subnode1", "v/subnode1-2", { });
db.e.save("v/subnode1", "v/subnode1-3", { });
db.e.save("v/subnode2", "v/subnode2-1", { });
db.e.save("v/subnode2", "v/subnode2-2", { });

Foxx アプリケーションがマウントされている場合、ノード _key を URL に入力することで、任意のノードのデータをフェッチできます (例: http://example.com:8529/myapp/rootまたはhttp://example.com:8529 )。 /myapp/subnode2-2

上記の API は、ノードのデータと、要求されたノードのすべてのサブノードを返します。完全なリクエスト URI を調べて、パスの各部分 (「root/subnode1/subnode1-1」など) ごとにノードをフェッチするなど、異なる動作に簡単に変更できます。これは、必要に応じて req.suffix を繰り返すことで実現できます。ただし、ノードの _key が既知であり、URL 経由で渡される場合は必要ありません。

また、URL を見るだけではノードとリーフ ノードを区別するのは難しいため、サブノードを返す必要があることを示す URL パラメーター「subNodes=true」を追加することをお勧めします。URL パラメータを省略した場合、サブノードを照会して返す必要はありません。

于 2014-05-27T07:54:01.750 に答える