簡體   English   中英

Tinkerpop / Gremlin:選擇頂點以及傳出邊數

[英]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]

這樣,您無需計算所有邊緣,僅計算第一個就足以回答您問題的邊緣。 如果願意,可以做一些truefalse修改:

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.

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