ArangoDB 从AQL遍历返回一个顶点和边的文档

fhg3lkii  于 2023-09-28  发布在  Go
关注(0)|答案(2)|浏览(142)

当我在Arango中进行遍历时,我得到了一个类似于以下的json结构数组:

{
  "vertex" : {
    "_id" : "vertices/857831247835",
    "_key" : "857831247835",
    "_rev" : "857831247835",
  },
  "path" : {
    "edges" : [
      {
      "_id" : "edges/857831575515",
      "_key" : "857831575515",
      "_rev" : "857831575515",
      "_from" : "vertices/857831247835",
      "_to" : "vertices/857821417435",
    }
    ],
    "vertices" : [
      {
      "_id" : "vertices/857821417435",
      "_key" : "857821417435",
      "_rev" : "857821417435",
    },
    {
      "_id" : "vertices/857831247835",
      "_key" : "857831247835",
      "_rev" : "857831247835",
    }
    ]
  },
  "startVertex" : "vertices/857821417435"
}

有没有一种方法可以使用AQL将遍历中找到的 * 所有 * 边/顶点放入一个类似上面的结构中?

anhgbhbe

anhgbhbe1#

实际上,您可以使用两种方法来获得结果:
轻松扩展您的AQL查询:
FOR x IN (<<Your previous query here>>) RETURN {edges: x.path.edges, vertices: x.path.vertices, vertex: x.vertex, startVertex: x.startVertex}
更高性能的方法(缩短对象创建):注册一个用户定义的函数,如下所示:https://docs.arangodb.com/3.11/aql/user-defined-functions/使用arangosh一次。
这应该是这样的:

require("org/arangodb/aql/functions").register("myVisitors::flatVisitor",
  function (config, result, vertex, path) {
    result.push({ vertex: vertex, edges: path.edges, vertices: path.vertices});
  });

然后在您的AQL中添加与paths: true相同的附加选项visitor: "myVisitors::flatVisitor"
顺便说一句:paths: true在这种情况下将被忽略,因为它只在我们的默认访问者中使用。
提示:如果你只需要在你的结果中的某些属性,而不是整个文档,只在你的访问者中返回这些。这将显著提高性能。

hlswsv35

hlswsv352#

有点老,但为了新的游客这个问题。另一种方法是从路径中唯一地累积边(语法是arangojs官方客户端的):

graph.traversal('verticies/startkey', {
    direction: 'any',
    init: `result.verticies = [];
    result.edges = [];`,
    visitor: `
        path.edges
            .forEach(function (x) {
                if (result.edges.indexOf(x) === -1) {
                    result.edges.push(x);
                }
            });
        result.verticies.push(vertex);
    `,
    uniqueness: {
        "vertices": "global",
        "edges": "global"
    }
});

相关问题