AQL中的递归遍历(ArangoDb)
Recursive traversal in AQL (ArangoDb)
在遍历树或图(在我的例子中是 DAG)时,我经常看到递归的使用。 AQL 是否支持或计划在不久的将来支持此功能?
假设我有一个 AQL 查询或子查询(遍历)并且想递归调用它。也许可以用 Foxx 包装完成?
就目前情况而言,AQL 本身没有递归。
可以使用 JavaScript 中的递归将递归包装在 Foxx 中,例如:
var recursion = function(last) {
if (last.length > 3) {
return last;
}
return recursion(db._query("<some AQL query>", {last: last}));
}
controller.get("/recursive", function (req, res) {
res.json(recursion(["a","b","c"]));
}
对于图形遍历,我们计划使用一些运算符扩展 AQL,以在遍历路径上定义 "For All" 或 "For Any" 过滤器。可以直接处理许多模式。语法可能如下所示:
FOR v,e,p IN 1..12 OUTBOUND "vertex/start" edges
FILTER p.vertices[*].age ALL >= 35
RETURN v
这将找到长度为 1
到 12
的所有路径,其中所有顶点的 age
属性大于或等于 35
。
希望对您有所帮助。
在遍历树或图(在我的例子中是 DAG)时,我经常看到递归的使用。 AQL 是否支持或计划在不久的将来支持此功能?
假设我有一个 AQL 查询或子查询(遍历)并且想递归调用它。也许可以用 Foxx 包装完成?
就目前情况而言,AQL 本身没有递归。 可以使用 JavaScript 中的递归将递归包装在 Foxx 中,例如:
var recursion = function(last) {
if (last.length > 3) {
return last;
}
return recursion(db._query("<some AQL query>", {last: last}));
}
controller.get("/recursive", function (req, res) {
res.json(recursion(["a","b","c"]));
}
对于图形遍历,我们计划使用一些运算符扩展 AQL,以在遍历路径上定义 "For All" 或 "For Any" 过滤器。可以直接处理许多模式。语法可能如下所示:
FOR v,e,p IN 1..12 OUTBOUND "vertex/start" edges
FILTER p.vertices[*].age ALL >= 35
RETURN v
这将找到长度为 1
到 12
的所有路径,其中所有顶点的 age
属性大于或等于 35
。
希望对您有所帮助。