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

时间:2016-03-11 15:22:59

标签: titan gremlin tinkerpop3

很明显,在两个顶点之间找到边缘的直接方法是:

std.range

我觉得std.algorithm步骤必须遍历所有边缘,这对于一些有很多边缘的应用来说非常慢。

另一种方式可能是:

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

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

哪一个更快更有效(就IO而言)?

我正在使用Titan,所以你也可以让你的回答特定于Titan。

修改

就时间而言,似乎第一种方法更快(边缘为20k的顶点filter

traversal = graph.traversal()
                  .V(outVertex)
                  .bothE(edgeLabel)
                  .as("x")
                  .otherV()
                  .is(outVertex) // uses index?
                  .select("x");

IO怎么样?

2 个答案:

答案 0 :(得分:6)

我希望第一个查询更快。但是,很少有事情:

  1. 所有查询都不是最佳的,因为它们都启用了路径计算。如果您需要在两个方向上找到连接,请使用2个查询(我将在下面给出一个示例)
  2. 当您使用clock()时,请确保iterate()您的遍历,否则您只会衡量无所作为所需的时间。
  3. 这些是我用来在两个方向上找到边缘的查询:

    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()
    }
    

答案 1 :(得分:5)

如果一个人不知道顶点Id,则另一个解决方案可能是

g.V().has('propertykey','value1').outE('thatlabel').as('e').inV().has('propertykey','value2').select('e')

这也只是单向的,因此需要重新制定相反方向的查询。