问题描述
我有一个符合以下模式的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