【问题标题】:Gremlin: need an efficient query to check whether two vertices are connected?Gremlin:需要一个高效的查询来检查两个顶点是否连接?
【发布时间】:2019-05-31 16:08:33
【问题描述】:

我们的应用需要检查两个顶点是否通过任意路径连接。

应用不关心路径中的分段或最短路径。

应用只需要知道两个顶点是否共享一个公共子图。

我的问题:给定两个分别具有 id(s) A 和 B 的顶点,什么 gremlin 查询可以很好地回答“A 和 B 是否以某种方式连接?”的问题。

【问题讨论】:

    标签: gremlin


    【解决方案1】:

    这个应该可以解决问题:

    g.V(A).
      repeat(both().dedup()).
        until(hasId(B)).
      hasNext()
    

    A开始,然后开始访问邻居,不要访问任何顶点两次,如果到达B就停止。显然,如果您正在处理巨大的子图,这可能会遇到超时(或内存问题)。

    【讨论】:

    • 谢谢!这在两个顶点连接的情况下效果很好,但在它们未连接的情况下,它会在几秒钟后返回 false。在两者未连接的情况下,我可以插入一个以合理方式终止遍历的步骤吗?
    • 不确定您所说的“以合理的方式”是什么意思。
    • 对不起,我的意思是......假设你有一个有 4 个顶点的图:A、B、C 和 D。假设 A 和 B 在一个子图中连接并且 C 和D 在子图中连接,并且图中不存在其他边,如果我检查 A 和 C 之间的连接(没有),那么查询在似乎很长一段时间后返回 false (秒)。有没有办法告诉这个查询在指定数量的唯一跃点后退出?
    • 抱歉——请忽略我之前的编辑,您的查询非常完美!我在驾驶座上遇到雾气。
    • 您可以在经过一定数量的跃点后终止,例如until(hasId(B).or().loops().is(20)),但是结果当然是false,但是这两个顶点仍然可以是同一个子图的一部分,只是相距很远。
    猜你喜欢
    • 2012-12-01
    • 2020-08-13
    • 1970-01-01
    • 1970-01-01
    • 2020-04-08
    • 1970-01-01
    • 2015-07-06
    • 1970-01-01
    • 2021-10-11
    相关资源
    最近更新 更多