[英]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怎么樣?
我希望第一個查詢更快。 但是,很少有事情:
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.