1

我想知道是否有任何方法可以在 SELECT 语句中使用多个顶点集。我认为这应该是可能的,因为......为什么不呢?

例如,假设我们有这个基本查询:

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;
}

现在,这一切都很好,很花哨,但是如果我知道其他 id 为 bar 和 biz 的顶点呢?我可以在 SELECT 语句中使用多个已知顶点集吗?这里的目标是通过使用索引的顶点 id 值尽快到达最终的 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 语句中使用了多个已知顶点集的此类事情的文档中找不到任何内容。

4

1 回答 1

1

在您的情况下,建议以这种方式编写查询:

版本 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。

于 2020-01-17T22:54:26.663 回答