本文介紹了如何在janusgraph中選擇正確的節點的處理方法,對大家解決問題具有一定的參考價值,需要的朋友們下面隨著小編來一起學習吧!
問題描述
我需要所有藍色節點或id匹配的節點在樹中的不同節點之間,基于最大級別。我有此代碼
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');
如果一個藍色節點和另一個藍色節點之間的錯誤節點超過3個或4個,則算法將忽略最后一個可能的節點。
例如,使用該代碼,如果我請求uuid=1
中四級以上的所有藍調包括一級,它將返回1,2,3,而不會返回4,因為3和4之間是3黑色。
但對于本例,它將返回1,2,3,4,因為3和4之間只有一個或兩個錯誤的節點
注意:這里有一個細節,如果我移除times(levels)
調用,無論中間有多少錯誤的顏色,都會顯示所有藍色,但沒有停止條件,這是關鍵。
推薦答案
問題是,當您遇到黑色節點時,如第二張圖所示,您將執行in
,但在每次重復開始時,您將執行另一個in
。因此,如果藍色節點之后的節點是黑色的,它現在也將被發射。解決此問題的一種可能方法是沿emit(has('color','blue'))
的線條更改emit
,以便只保留藍色的節點。
這里有一個簡單的例子,希望能清楚地顯示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')
使用這種方法最有可能簡化您的查詢。
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
這篇關于如何在janusgraph中選擇正確的節點的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,