Предельные ребра, используемые при обходе именованного графа - PullRequest
0 голосов
/ 10 октября 2018

В: Можно ли ограничить наборы ребер, которые система попытается использовать при обходе именованных графов AQL?

Сценарий:

Если у меня есть именованный граф productGraph с двумя наборами вершин и двумяграничные коллекции:

  • Вершины: продукт, цена
  • prodParentOf (продукт A является родителем продукта B)
  • prodHasPrice (продукт A имеет цену $ X)

Если сейчас я хочу получить дочерние продукты продукта А (а не цены), я бы хотел сделать что-то вроде этого

WITH product
FOR v, e, p IN OUTBOUND 'product/A'
GRAPH 'productGraph'
RETURN {vertice:v, edge:e, path: p}

Однако, если я посмотрю на объяснениеВ плане, я вижу, что система пыталась использовать индексы как для prodParentOf, так и для prodHasPrice (даже если я явно поместил коллекцию продуктов в предложение «С»):

Indexes used:
 By   Type   Collection     Unique   Sparse   Selectivity   Fields               Ranges
  2   edge   prodHasPrice   false    false        75.00 %   [ `_from`, `_to` ]   base OUTBOUND
  2   edge   prodParentOf   false    false        65.37 %   [ `_from`, `_to` ]   base OUTBOUND

Можно ли ограничить коллекции реберсистема будет пытаться использовать при запросе именованных графов?Или я должен использовать краевые коллекции в запросе вместо этого.(что, на мой взгляд, означало бы, что было бы лучше обходить коллекции ребер в целом, чем именованные графы).

Вот тот же запрос с использованием коллекции ребер

FOR v, e, p IN OUTBOUND 'product/A'
prodParentOf
RETURN {vertice:v, edge:e, path: p}

1 Ответ

0 голосов
/ 11 октября 2018

Предложение 1002 * не накладывает ограничений на то, какие коллекции, являющиеся частью вашего именованного графа, будут использоваться при обходе.Это в основном для обходов в кластере, чтобы объявить, какие коллекции будут задействованы.Это помогает избежать взаимоблокировок, которые могут возникать, если коллекции лениво блокируются во время выполнения запроса.

Если вы используете один экземпляр сервера, предложение WTIH является необязательным.Это не влияет на результат.Если вы хотите исключить коллекции из обхода, вы можете использовать наборы коллекций вместо названного графа или использовать FILTER s вместе с IS_SAME_COLLECTION().Использование наборов наборов более эффективно, поскольку при меньшем количестве наборов ребер обходится меньше ребер, тогда как в большинстве случаев после обхода применяются фильтры.

FOR v, e, p IN 1..5 OUTBOUND 'verts/start' GRAPH 'named-graph'
  FILTER (FOR id IN p.edges[*]._id RETURN IS_SAME_COLLECTION('edgesX', id)) ALL == true
  RETURN p

Если ваш обход имеет только глубину 1, тозапрос фильтра проще:

FOR v, e, p IN INBOUND 'product/A' GRAPH 'productGraph'
  FILTER IS_SAME_COLLECTION('prodParentOf', e)
  RETURN {vertex: v, edge: e, path: p}

В будущем может появиться способ сокращения путей, что также должно помочь в сценарии с указанным вами графом.

...