[英]Tinkerpop/Gremlin: select vertices together with outgoing edge count
我嘗試找到一個有效的gremlin查詢,該查詢返回帶有頂點和傳出邊數的遍歷。 如果不存在傳出邊緣,則使用布爾值代替傳出邊緣的數量甚至更好。
背景:我試圖提高程序的性能,該程序在頂點上寫入一些屬性,然后在傳出的邊緣上進行迭代以刪除其中的一些屬性。 在許多情況下,沒有輸出邊緣,並且for (Iterator<Edge> iE = v.edges(Direction.OUT); iE.hasNext();) { ... }
的迭代消耗了運行時間的很大一部分。 因此, gts.V(ids)
將id解析為頂點(而不是使用gts.V(ids)
我想盡可能地收集有關出站邊存在信息的信息,以跳過迭代。
我的第一次嘗試是:
gts.V(ids).as("v").choose(__.outE(), __.constant(true), __.constant(false)).as("e").select("v", "e");
第二個想法是:
gts.V(ids).project("v", "e").by().by(__.outE().count());
兩者似乎都可行,但是有沒有更好的解決方案,不需要底層圖形實現來獲取或計算所有邊?
(我們目前將Tinkerpop / gremlin的sqlg實現與Postgresql一起使用,並且兩個查詢似乎都從Postgresql獲取所有傳出的邊。這可能是缺少某些優化的情況。但是我的問題不是特定於sqlg的。)
如果只需要知道邊緣是否存在,則應在by()
調制器中使用limit()
結果:
gremlin> g.V().project('v','e').by().by(outE().limit(1).count())
==>[v:v[1],e:1]
==>[v:v[2],e:0]
==>[v:v[3],e:0]
==>[v:v[4],e:1]
==>[v:v[5],e:0]
==>[v:v[6],e:1]
這樣,您無需計算所有邊緣,僅計算第一個就足以回答您問題的邊緣。 如果願意,可以做一些true
與false
修改:
gremlin> g.V().project('v','e').by().by(coalesce(outE().limit(1).constant(true),constant(false)))
==>[v:v[1],e:true]
==>[v:v[2],e:false]
==>[v:v[3],e:false]
==>[v:v[4],e:true]
==>[v:v[5],e:false]
==>[v:v[6],e:true]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.