Рекурсивный обход в AQL (ArangoDb)

При обходе деревьев или графов (в моем случае DAG) я часто вижу использование рекурсии. Поддерживается ли это или планируется ли поддержка в AQL в ближайшем будущем?

Скажем, у меня есть запрос AQL или подзапрос (обход), и я хотел бы вызвать его рекурсивно. Может быть, это можно сделать завернутым в «Фокс»?


person specimen    schedule 31.01.2016    source источник


Ответы (1)


в настоящее время в самом AQL нет рекурсии. Рекурсию можно обернуть в Foxx, используя рекурсию в JavaScript, например:

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 v,e,p IN 1..12 OUTBOUND "vertex/start" edges
  FILTER p.vertices[*].age ALL >= 35
  RETURN v

Тогда будут найдены все пути длиной от 1 до 12, где все вершины имеют атрибут age, больший или равный 35.

Надеюсь это поможет.

person mchacki    schedule 01.02.2016