gpt4 book ai didi

titan - Gremlin:找到两个顶点之间的边的有效方法是什么?

转载 作者:行者123 更新时间:2023-12-04 17:54:38 27 4
gpt4 key购买 nike

很明显,在两个顶点之间找到边的简单方法是:

graph.traversal().V(outVertex).bothE(edgeLabel).filter(__.otherV().is(inVertex))

我觉得 filter步骤将必须遍历所有边缘,这对于具有许多边缘的某些应用程序来说确实很慢。

另一种方法可能是:
traversal = graph.traversal()
.V(outVertex)
.bothE(edgeLabel)
.as("x")
.otherV()
.is(outVertex) // uses index?
.select("x");

我假设第二种方法可能更快,因为它将使用ID索引,这将使其比第一种方法更快。

哪一个是更快,更高效(就IO而言)?

我使用的是Titan,因此您也可以针对Titan做出特定的答案。

编辑

就时间而言,第一种方法似乎更快(顶点 b的边缘为20k
gremlin> clock(100000){g.V(b).bothE().filter(otherV().is(a))}
==>0.0016451789999999999
gremlin> clock(100000){g.V(b).bothE().as("x").otherV().is(a).select("x")}
==>0.0018231140399999999

IO呢?

最佳答案

我希望第一个查询更快。但是,几件事:

  • 这些查询都不是最佳查询,因为它们都启用了路径计算。如果您需要双向查找连接,请使用2个查询(我将在下面提供示例)
  • 当您使用clock()时,请确保对您的遍历进行iterate(),否则您将只测量不执行任何操作所需的时间。

  • 这些是我用来查找两个方向上的边的查询:
    g.V(a).outE(edgeLabel).filter(inV().is(b))
    g.V(b).outE(edgeLabel).filter(inV().is(a))

    如果您希望获得最多的优势:
    edge = g.V(a).outE(edgeLabel).filter(inV().is(b)).tryNext().orElseGet {
    g.V(b).outE(edgeLabel).filter(inV().is(a)).tryNext()
    }

    这样,您就可以摆脱路径计算的麻烦。这些查询的执行方式在很大程度上取决于基础图形数据库。 Titan的查询优化器可以识别该查询模式,并且几乎应该在短时间内返回结果。

    现在,如果要测量运行时间,请执行以下操作:
    clock(100) {
    g.V(a).outE(edgeLabel).filter(inV().is(b)).iterate()
    g.V(b).outE(edgeLabel).filter(inV().is(a)).iterate()
    }

    关于titan - Gremlin:找到两个顶点之间的边的有效方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35943897/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com