AQL's PRUNE: Как сочетать условия? - PullRequest
0 голосов
/ 21 мая 2019

Я использую ArangoDB 3.4.5 и играю с заявлениями PRUNE. У меня возникли некоторые трудности при комбинировании условий.

Предполагая, что некоторые вершины v на моем пути p имеют целочисленные атрибуты ia, а некоторые v имеют логические атрибуты ba. Четный индекс v вдоль p, такой как p.vertices[2], все имеют ba.

PRUNE HAS(v, "ia") AND v.ia != 5 работает само по себе. PRUNE p.vertices[2].ba == false OR p.vertices[4].ba == false также работает само по себе.

Я замечаю, что я не могу объединить их в одном запросе ни с помощью нескольких операторов PRUNE, ни путем помещения их в один запрос PRUNE (condition_1) OR (condition_2). Также я не могу поместить один в PRUNE, а следующий в FILTER. Кто-нибудь еще испытывает это или это только я?

UPDATE: Операторы FILTER и PRUNE не дали желаемых результатов, однако причина была в пропущенном OPTIONS {uniqueEdges: "none"}. В отличие от uniqueVertices, none не является значением по умолчанию.

1 Ответ

1 голос
/ 21 мая 2019

Я не могу воспроизвести вашу проблему в ArangoDB 3.4.5 Если вы создаете коллекции edge и vertex и заполняете их примером дерева:

FOR n in 0..100000
  INSERT {_key: TO_STRING(n), val: n, modulo: n%2} INTO vertex
  FILTER n > 0
  INSERT {_from: CONCAT("vertex/", FLOOR((n-1)/2)), _to: NEW._id} INTO edge

Теперь я выполняю обход:

WITH vertex
FOR v,e,p IN 0..5 OUTBOUND "vertex/0" edge
    RETURN TO_STRING(p.vertices[*].val)

Результат:

   [
  "[0]",
  "[0,1]",
  "[0,1,3]",
  "[0,1,3,7]",
  "[0,1,3,7,15]",
  "[0,1,3,7,15,31]",
  "[0,1,3,7,15,32]",
  "[0,1,3,7,16]",
  "[0,1,3,7,16,33]",
  "[0,1,3,7,16,34]",
  "[0,1,3,8]",
  "[0,1,3,8,17]",
  "[0,1,3,8,17,35]",
  "[0,1,3,8,17,36]",
  "[0,1,3,8,18]",
  "[0,1,3,8,18,37]",
  "[0,1,3,8,18,38]",
  "[0,1,4]",
  ...

Затем я добавляю "stop": true и "hide": 1 к вершине _key: 7 и некоторые другие комбинации к вершинам 17 и 18. Теперь нужно удалить PRUNE.прекратить обход, если условие выполнено.Будьте осторожны, сама вершина включена в результаты.

WITH vertex
FOR v,e,p IN 0..5 OUTBOUND "vertex/0" edge
  PRUNE v.hide == 1 AND v.stop == true
RETURN TO_STRING(p.vertices[*].val)

Результат:

[
  "[0]",
  "[0,1]",
  "[0,1,3]",
  "[0,1,3,7]", <-- stop: true, hide: 1
  "[0,1,3,8]",
  "[0,1,3,8,17]", <-- stop: true, hide: 1
  "[0,1,3,8,18]",
  "[0,1,3,8,18,37]",
  "[0,1,3,8,18,38]", 
   ...

В условии PRUNE можно использовать AND / OR, но поддерживается только одно условие PRUNE (в отличие от FILTERS).

...