我正在查看 ArangoDB 和 OrientDB 以及其他图形数据库,并且需要知道哪些支持存储分层数据(树、文件目录等)然后通过 REST api 自动或几乎不加修改地公开它的能力。
所以如果我去http://localhost.com/parent/它应该列出这个级别的所有孩子。或http://localhost.com/parent/child4/child1/leaf应该给我一个叶子节点。
我正在查看 ArangoDB 和 OrientDB 以及其他图形数据库,并且需要知道哪些支持存储分层数据(树、文件目录等)然后通过 REST api 自动或几乎不加修改地公开它的能力。
所以如果我去http://localhost.com/parent/它应该列出这个级别的所有孩子。或http://localhost.com/parent/child4/child1/leaf应该给我一个叶子节点。
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 参数,则不需要查询和返回子节点。