本文介紹了如何在janusgraph中選擇正確的節(jié)點(diǎn)的處理方法,對(duì)大家解決問(wèn)題具有一定的參考價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)吧!
問(wèn)題描述
我需要所有藍(lán)色節(jié)點(diǎn)或id匹配的節(jié)點(diǎn)在樹中的不同節(jié)點(diǎn)之間,基于最大級(jí)別。我有此代碼
GraphTraversal<Vertex, Map<String, List>> values = graphDbConnection.getGraphTraversalSource().V()
.hasLabel('uuid').has('uuid', uuid).emit()
.repeat(in().choose(values('color').is('blue'), identity(), in()))
.times(levels)
.map(or(has('color', 'blue'),
has('uuid', uuid)))
.valueMap('uuid', 'color');
如果一個(gè)藍(lán)色節(jié)點(diǎn)和另一個(gè)藍(lán)色節(jié)點(diǎn)之間的錯(cuò)誤節(jié)點(diǎn)超過(guò)3個(gè)或4個(gè),則算法將忽略最后一個(gè)可能的節(jié)點(diǎn)。
例如,使用該代碼,如果我請(qǐng)求uuid=1
中四級(jí)以上的所有藍(lán)調(diào)包括一級(jí),它將返回1,2,3,而不會(huì)返回4,因?yàn)?和4之間是3黑色。
但對(duì)于本例,它將返回1,2,3,4,因?yàn)?和4之間只有一個(gè)或兩個(gè)錯(cuò)誤的節(jié)點(diǎn)
注意:這里有一個(gè)細(xì)節(jié),如果我移除times(levels)
調(diào)用,無(wú)論中間有多少錯(cuò)誤的顏色,都會(huì)顯示所有藍(lán)色,但沒有停止條件,這是關(guān)鍵。
推薦答案
問(wèn)題是,當(dāng)您遇到黑色節(jié)點(diǎn)時(shí),如第二張圖所示,您將執(zhí)行in
,但在每次重復(fù)開始時(shí),您將執(zhí)行另一個(gè)in
。因此,如果藍(lán)色節(jié)點(diǎn)之后的節(jié)點(diǎn)是黑色的,它現(xiàn)在也將被發(fā)射。解決此問(wèn)題的一種可能方法是沿emit(has('color','blue'))
的線條更改emit
,以便只保留藍(lán)色的節(jié)點(diǎn)。
這里有一個(gè)簡(jiǎn)單的例子,希望能清楚地顯示emit
的這種用法。
g.addV('blue').as('b1').
addV('red').as('r1').
addV('blue').as('b2').
addV('red').as('r2').
addV('blue').as('b3').
addE('link').from('b1').to('r1').
addE('link').from('r1').to('b2').
addE('link').from('b2').to('r2').
addE('link').from('r2').to('b3')
使用這種方法最有可能簡(jiǎn)化您的查詢。
gremlin> g.V()
==>v[42762]
==>v[42763]
==>v[42764]
==>v[42765]
==>v[42766]
gremlin> g.V(42762).emit(hasLabel('blue')).repeat(out()).times(4).label()
==>blue
==>blue
==>blue
gremlin> g.V(42762).emit().repeat(out()).times(4).label()
==>blue
==>red
==>blue
==>red
==>blue
最后是添加了choose
步驟的相同示例。
gremlin> g.V(42762).emit(hasLabel('blue')).repeat(out().choose(hasLabel('blue'),identity(),out())).times(2).label()
==>blue
==>blue
==>blue
這篇關(guān)于如何在janusgraph中選擇正確的節(jié)點(diǎn)的文章就介紹到這了,希望我們推薦的答案對(duì)大家有所幫助,