簡體   English   中英

Gremlin - 優化查詢

[英]Gremlin - optimize query

我有一個圖表,表示數據庫對象、父子關系和數據流關系(僅在列之間)。

這是我當前的 gremlin 查詢(在 python 中),它應該找到列的數據流影響:

g.V().has('fqn', 'some fully qualified name').
repeat(outE("flows_into").dedup().store('edges').inV()).
until(
    or_(
        outE("flows_into").count().is_(eq(0)),
        cyclicPath(),
    )
).
cap('edges').
unfold().
dedup().
map(lambda: "g.V(it.get().getVertex(0).id()).in('child').in('child').id().next().toString() + ',' + g.V(it.get().getVertex(1).id()).in('child').in('child').id().next().toString()").
toList()

此查詢應返回所有邊緣,這些邊緣以某種方式受到初始列的影響。 問題是,在某些情況下,我不關心列級別的東西,我想獲得“架構級別”的優勢。 這就是 lambda 所做的——對於邊緣中的兩個節點,它在對象樹中向上遍歷兩次,返回模式節點。

問題出在這個 lambda 函數中——我不能只這樣做:

it.get().getVertex(1).in('child').in('child').id().next().toString()

因為 getVertex(1) 不返回可遍歷的實例。 所以我需要通過gV()...開始新的遍歷。 通過我的調試,這條線導致了可怕的減速。 如果我保留此轉換,它會慢大約 50 倍。

您對如何優化此查詢有任何想法嗎?

您可能會考慮根本不使用 lambda,因為它們往往無法在實現之間移植。 也許map步驟可以替換為項目步驟,例如:

project('v0','v1').
  by(outV().in('child').in('child').id())
  by(inV().in('child').in('child').id())

暫無
暫無

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

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