簡體   English   中英

Gremlin - 在單個查詢中從多個頂點獲取 select 屬性的最佳方法

[英]Gremlin - Best way to select properties from multiple vertices in single query

我有兩個相關的頂點,標簽為“DeviceFamily”和“Device”。 它們的關系如下圖所示:

(DeviceFamily)-[:RELATION]->(Device)

DeviceFamily 頂點有一些屬性,比如 p,q,r,而 Device 頂點有一些屬性,比如 x,y,z。

給定一個設備 id,如果我需要找出相應設備頂點的 x,y,z 屬性和相關設備族的 p,q,r 屬性,我應該執行什么查詢?

我發現的一種解決方案是:

g.V('<id>').hasLabel('Device').as('d1', 'd2', 'd3').inE('RELATION').outV().as('f1', 'f2', 'f3').select('d1', 'd2', 'd3', 'f1', 'f2', 'f3').by('x', 'y', 'z', 'p', 'q', 'r');

此查詢有效,但我不確定這是否是最好的方法。 請讓我知道是否有更好的方法。

謝謝。

我認為你應該使用某種形式的project()

g.V('<id>').
  project('device','family').
    by(__.valueMap('x','y','z'))
    by(__.in('RELATION').valueMap('p','q','r'))

請注意,我省略了hasLabel('Device')因為它是多余的,因為您知道頂點的唯一標識符。 進一步注意,當我在project() () 的by()調制器中使用valueMap()時,你可以輕松地提供任何你想要的 Gremlin 來將你的數據塑造成這兩個鍵(我只是選擇了valueMap() ,因為它方便編寫)。

如果您想要與您的 output 更匹配的東西,您仍然可以以這種直接方式使用project() (我一直假設只有一個“關系”邊緣 - 希望是這樣):

g.V('<id>').
  project('x','y','z','p','q','r').
    by('x').
    by('y').
    by('z').
    by(in('RELATION').values('p')).
    by(in('RELATION').values('q')).
    by(in('RELATION').values('r'))

我認為大多數圖形數據庫不會將最后三個by()調制器優化為在“RELATION”邊緣上的單次遍歷。 因此,我建議稍作調整 - project()改為邊緣:

g.V('<id>').
  inE('RELATION').
  project('x','y','z','p','q','r').
    by(inV().values('x')).
    by(inV().values('y')).
    by(inV().values('z')).
    by(outV().values('p')).
    by(outV().values('q')).
    by(outV().values('r'))

暫無
暫無

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

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