【问题标题】:Get all paths in a graph from a node, but only ones which terminate从节点获取图中的所有路径,但只有终止的路径
【发布时间】:2020-09-08 11:29:33
【问题描述】:

我编写了以下查询,它返回来自指定节点的所有可能路径。

g.V(<some_id>).repeat(bothE().bothV().simplePath()).emit().dedup().path()

如果我们在这个结构中有一个包含 3 个节点的简单图:

A -- edge_1 -> B -- edge_2 -> C

此查询将返回两条路径:

A, edge_1, B
A, edge_1, B, edge_2, C

但是,我只想返回所有终止的路径(即没有更多的节点可以遍历),在这个例子中只会返回

A, edge_1, B, edge_2, C

这可能吗?

【问题讨论】:

    标签: graph gremlin gremlinpython


    【解决方案1】:

    您可以尝试在没有emit 步骤的情况下执行repeat,并使用until 在路径的末尾停止。

    g.V().hasLabel('A').repeat(bothE().bothV().
        simplePath()).
      until(bothE().simplePath().
        count().is(eq(0))).dedup().path()
    

    示例:https://gremlify.com/jqr8y7p24wb

    【讨论】:

    • 实际上在某些情况下我没有得到我想要的结果,例如图表中有循环时。这是一个这样的例子:gremlify.com/ccocxr1uau。另外要添加到我的原始帖子中,我希望在路径中返回所有节点和所有边,但返回的任何路径都不应该是另一个路径的“子路径”。任何想法如何纠正这个问题?
    • @KOB 在这种情况下,如果您将bothE 更改为both,您将获得路线gremlify.com/tja7crvmg4b
    • 好的,它可以工作,但我不明白为什么第二条路径不会在节点 4 处终止,而是继续到节点 3 和 2。你能解释一下吗?理想情况下,我希望第二条路径只有 1、D、4(即返回第一条路径不包括的边 D。第一条路径已经包含 2、B、3、C,所以我不需要这些在第二个返回。
    • @KOB 因为两者的区别在于一条边从 1 到另一条边,所以没有一个是另一个的子路径,你需要考虑你是否真的需要双向旅行而不是只继续边缘。
    • 好的,我明白了。我不需要双向旅行。简而言之,我需要的是最小数量的最小长度路径,它们共同遍历图中的所有节点和边,如果这有意义吗?我愿意接受有关可以实现此目的的查询的任何其他建议
    猜你喜欢
    • 1970-01-01
    • 2012-03-27
    • 1970-01-01
    • 2014-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-14
    相关资源
    最近更新 更多