簡體   English   中英

Gremlin:在兩個頂點之間找到邊緣的有效方法是什么?

[英]Gremlin: What's an efficient way of finding an edge between two vertices?

很明顯,在兩個頂點之間找到邊緣的直接方法是:

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而言)?

我正在使用泰坦,所以你也可以讓你的答案泰坦具體。

編輯

就時間而言,似乎第一種方法更快(頂點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怎么樣?

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

  1. 沒有一個查詢是最佳的,因為它們都啟用了路徑計算。 如果您需要在兩個方向上找到連接,請使用2個查詢(我將在下面給出一個示例)
  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()
}

如果一個人不知道頂點Id,那么另一個解決方案可能就是

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

這也只是單向的,因此需要重新構造相反方向的查詢。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM