当我在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 将遍历中找到的所有边/顶点放入单个结构中,如上面所示?
实际上,您可以使用两种方法来获得结果:
轻松扩展您的 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/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 中添加与 paths: true
相同的附加选项visitor: "myVisitors::flatVisitor"
顺便说一句:在这种情况下,paths: true
将被忽略,因为它仅在我们的默认访问者中使用。
提示:如果您只需要结果中的某些属性而不是完整的文档,请在访问者中返回这些属性。这将带来显著的性能改进。
有点旧,但为了这个问题的新访问者。另一种方法是从路径中唯一地积累边(语法是 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"
}
});