Gremlin后置过滤器路径

人气:577 发布:2022-10-16 标签: filter gremlin

问题描述

我有一个符合以下模式的gremlin查询:

g.V().has('LOCATION', textContains('FLORIDA')).
repeat(bothE().otherV().simplePath()).emit().times(5).
has('LOCATION',textContains('VIRGINIA')).
path().by(valueMap('LOCATION')).dedup()

输出可能如下所示:

FLORIDA-->ALABAMA-->TENNESSEE-->VIRGINIA

FLORIDA-->GEORGIA-->TENNESSEE-->VIRGINIA

FLORIDA-->GEORGIA-->SOUTH CAROLINA-->NORTH CAROLINA-->VIRGINIA

etc...

有没有办法在PATH步骤之后进行过滤,以仅获得经过阿拉巴马州的路由(例如)。阿拉巴马州可能也不总是第二跳,所以它需要足够动态,无论要包括的州可能会落在哪里,都要着眼于整个路径。另一个问题是可能有多个州可供过滤,例如,类似于显示包含阿拉巴马州或南卡罗来纳州等的路径的内容。在此查询的实际应用程序中,还有多个属性被馈送到valueMap()中,但在这里只是试图简化它。这可能类似于此问题:

filter the gremlin results

但我想不出如何在过滤步骤后不出错地返回到valueMap()。我尝试了这样的方法,但不确定从哪里开始:

g.V().has('LOCATION', textContains('FLORIDA')).
repeat(bothE().otherV().simplePath()).emit().times(5).
has('LOCATION',textContains('VIRGINIA')).
path().filter(unfold().has('LOCATION', textContains('ALABAMA'))).
by(valueMap('LOCATION')).dedup()

推荐答案

您可以使用sack来跟踪它。这里有一个来自Practice Gremlin的例子,应该会有所帮助。该查询查找从奥斯汀到爱丁堡且至少有一站在曼彻斯特的路线。类似于您在阿拉巴马州的用例。如果在路径上遇到曼彻斯特,则将麻袋加1。由于使用simplePath,因此一个位置永远不会被访问两次。如果在到达EDI时,麻袋中包含1,则我们知道我们是通过MAN完成的。

g.withSack(0).V().
  has('code','AUS').
  repeat(out().simplePath().has('country',within('US','UK')).
         choose(has('code','MAN'),sack(sum).by(constant(1)))).
    until(has('code','EDI')).
  where(sack().is(1)).
  path().by('code').
  limit(10)

进一步阅读http://www.kelvinlawrence.net/book/PracticalGremlin.html#via

167