Можно ли использовать более одного набора вершин в операторе SELECT? - PullRequest
0 голосов
/ 18 января 2020

Мне было интересно, есть ли способ использовать более одного набора вершин в операторе SELECT. Я думаю, это должно быть возможно, потому что ... почему бы и нет?

Например, скажем, у нас есть этот базовый c запрос:

CREATE QUERY coolQuery(VERTEX<Foo> foo, String bar, String biz) FOR GRAPH cool_graph SYNTAX v2 {

  f = {foo};

  x = SELECT i
  FROM SomeVertex:i -(PathType1>)- f

  y = SELECT i
  FROM x:i -(<PathType2)- BarVertex:br
  WHERE br.id == bar;

  z = SELECT i
  FROM y:i -(PathType3>.PathType4>)- BizVertex:bz
  WHERE bz.id == biz;

  PRINT z;
}

Теперь, это все хорошо и прекрасно, но что если я знаю другие вершины, чьи идентификаторы - bar и biz? Могу ли я использовать более одного известного набора вершин в операторе SELECT? Цель здесь - как можно быстрее достичь окончательного набора SomeVertex, используя индексированные значения идентификатора вершины.

Это то, что я думаю:

CREATE QUERY coolQuery2(VERTEX<FooVertex> foo, VERTEX<BarVertex> bar, Vertex<BizVertex> biz) FOR GRAPH cool_graph SYNTAX v2 {

  f = {foo};
  br = {bar};
  bz = {biz};

  x = SELECT i
  FROM SomeVertex:i -(PathType1>)- f

  y = SELECT i
  FROM x:i -(<PathType2)- br

  z = SELECT i
  FROM y:i -(PathType3>.PathType4>)- bz

  PRINT z;
}

Я получаю синтаксические ошибки с этим, и я не могу найти ничего в документах, которые делают подобные вещи, где более чем один известный набор вершин используется в операторе SELECT.

1 Ответ

0 голосов
/ 18 января 2020

в вашем случае рекомендуется написать запрос следующим образом:

Версия 1:

CREATE QUERY coolQuery2(VERTEX<FooVertex> foo, VERTEX<BarVertex> bar, Vertex<BizVertex> biz) FOR GRAPH cool_graph SYNTAX v2 {

  OrAccum<BOOL> @hasFoo, @hasBar, @hasBiz;

  f = {foo, bar, biz};

  result = select t from f:s-((PathType1|PathType2|PathType3):e)-:t
               accum case when s == foo then t.@hasFoo += true end,
                          case when s == bar then t.@hasBar += true end,
                           case when s == biz then t.@hasBiz += true end
               having t.@hasFoo and t.@hasBar and t.@hasBiz;

  print result;
}

Версия 2:

CREATE QUERY coolQuery2(VERTEX<FooVertex> foo, VERTEX<BarVertex> bar, Vertex<BizVertex> biz) FOR GRAPH cool_graph SYNTAX v2 {

  OrAccum<BOOL> @hasFoo, @hasBar, @hasBiz;

  f = {foo};
  br = {bar};
  bz = {biz};

  fooSet = select t from f-(PathType1)-:t;
  barSet = select t from br-(PathType1)-:t;
  bizSet = select t from bz-(PathType1)-:t;

  result = fooSet intersect barSet intersect bizSet;

  print result;
}

В этом случае рекомендуется использовать версию 1, поскольку она обеспечивает лучший параллелизм и выполняет только один SELECT.

...