Gremlin Post 过滤路径

Gremlin Post Filter Path

我有一个遵循这种模式的 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...

有没有办法在路径步骤之后进行过滤,以仅获取经过阿拉巴马州的路线(例如)。 ALABAMA 可能并不总是第二跳,因此它需要足够动态以查看整个路径,而不管要包含的状态可能落在何处。另一个问题是可能有多个状态要过滤,例如像显示包含 ALABAMA 或包含 SOUTH CAROLINA 等的路径。在这个查询的实际应用中,也有多个属性被输入 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 来跟踪它。这是 Practical Gremlin 的一个例子,应该有所帮助。该查询查找从奥斯汀到爱丁堡且至少在曼彻斯特停靠一站的路线。类似于您的阿拉巴马州用例。如果沿途遇到曼彻斯特,则麻袋加一。当使用 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