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