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

3
当我在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获取遍历中发现的所有边/顶点并将它们放入类似上面那样的单个结构的方法?


你能提供一个示例展示结果结构应该是什么样子的吗? - stj
除了遍历过的所有顶点和边缘被放置在顶点和边缘数组中之外,结构完全相同:{vertex: {}, vertices:[...所有顶点!...], edges: [... 所有边缘!!...], startVertex: ""}。我觉得应该可以通过向遍历函数传递选项来指定结果以这种方式格式化...就像我可以传递“paths:true/false”一样。 - mikewilliamson
2个回答

1
您实际上可以使用两种方式来获取结果:
一种是简单的扩展AQL查询: FOR x IN (<<在此处输入您之前的查询>>) RETURN {edges: x.path.edges, vertices: x.path.vertices, vertex: x.vertex, startVertex: x.startVertex} 另一种更高效的方式(您可以短路对象创建): 注册一个用户定义的函数,如下所示:https://docs.arangodb.com/AqlExtending/Functions.html 使用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中添加额外选项visitor: "myVisitors::flatVisitor",与paths: true相同。
顺便说一句:paths: true在这种情况下将被忽略,因为它仅在我们的默认访问者中使用。
提示:如果你只需要结果中的某些属性而不是完整文档,只需在访问者中返回这些属性即可。这将显著提高性能。

0

虽然有点老,但为了新访客的利益,这里提供另一种方法,即通过唯一地累积路径边缘(语法是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"
    }
});

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接