rest - 是否有一个图数据库可以自动为每个节点生成静态端点?

标签 rest graph-databases orientdb arangodb

我正在研究 ArangoDB 和 OrientDB 以及其他图形数据库,需要知道哪些支持存储层次结构数据(树、文件目录等)的能力,然后通过 REST api 自动或很少修改地公开它。

所以如果我去http://localhost.com/parent/它应该列出该级别的所有 child 。或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/roothttp://example.com:8529/myapp/subnode2-2

上述API将返回节点的数据以及所请求节点的所有子节点。它可以很容易地改变为不同的行为,例如查看完整的请求 URI 并按路径的每个部分获取节点(例如“root/subnode1/subnode1-1”)。如果需要,这可以通过迭代 req.suffix 来实现。不过,如果节点的 _key 已知并通过 URL 传递,则没有必要。

仅通过查看 URL 也很难区分节点和叶节点,因此我建议添加 URL 参数“subNodes=true”来指示应返回子节点。如果省略URL参数,则不需要查询和返回任何子节点。

关于rest - 是否有一个图数据库可以自动为每个节点生成静态端点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23882833/

相关文章:

sqlite - SQLITE3:恒定时间行寻址

sql - 查询分组

geolocation - OrientDB 地理定位

javascript - 如何在 SailsJS 应用程序中使用 OrientDB

c++ - How to call the function in derived class to process handle_post?(Function call missing argument list to create pointer)

android - 如何开发返回 JSON 数据的 Web 服务

graph-databases - 查找具有特定关系Gremlin的所有间接连接的节点

rest - 在 Clojure 中开发 RESTful Web 服务的良好起点是什么?

javascript - UAT 环境中 url 未定义的奇怪问题。在本地它正在工作 :

javascript - 在 OrientDB 中嵌入函数中的记录