【问题标题】:Gremlin Post Filter PathGremlin 后过滤器路径
【发布时间】:2021-07-14 14:25:11
【问题描述】:

我有一个遵循这种模式的 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 可能也不总是第二跳,因此它需要足够动态以查看整个路径,而不管包含的状态可能落在哪里。另一个问题是可能有多个状态需要过滤,例如向我展示包含 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()

【问题讨论】:

    标签: filter gremlin


    【解决方案1】:

    您可以使用sack 进行跟踪。这是一个来自 Practical Gremlin 的示例,应该会有所帮助。该查询查找从奥斯汀到爱丁堡并在曼彻斯特至少停靠一站的路线。类似于您的阿拉巴马州用例。如果沿路径遇到曼彻斯特,则麻袋加一。由于使用了simplePath,因此一个位置将永远不会被访问两次。如果在到达 EDI 时,sack 包含 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

    【讨论】:

    • 感谢开尔文!没想到会为此使用 sack。
    猜你喜欢
    • 1970-01-01
    • 2022-07-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-19
    • 2020-09-09
    • 1970-01-01
    相关资源
    最近更新 更多