2015-09-29 73 views
1

我想獲得從給定開始節點到給定範圍內的所有節點的最短路徑列表。每條邊都是加權的,我試圖用這些權重的總和作爲範圍,而不是步數。如何使用gremlin查找加權邊緣範圍內的所有節點?

限制措施下工作,但我不知道如何聚合和極限道路邊權或正確返回路徑。

g.v(1).out.loop(1){it.loops < 3}{true}.dedup 

感謝您的幫助!

+0

這是Tinkerpop 2還是3? –

+0

2.尚未移動到3,但如果需要它是一個選項。 – tomatosource

+1

我不知道如何用2來做,因爲循環是寬度優先的,所以你需要爲每個路徑分開累加器,或者在循環閉合內求和整個路徑。後者會好得多。我知道Tinkerpop 3已經(或將要)具有深度優先作爲選項,但是我已經嘗試過了,但是隨着深度的增加和深度的增加,它似乎就變成了一個變量或一組變量。 –

回答

1

循環步驟的it.path屬性是關鍵。由於權重的邊緣,我們需要明確地穿越它們,所以它們會在路徑中可見:

g.v(1).as("start").outE().inV().loop("start"){it.path.collect{it.weight==null ? 0.0 : it.weight}}.sum()<=0.3f}.dedup() 

如果你想在和出邊遍歷你都需要添加simplePath()防止遍歷從迴轉自身。

g.v(1).as("start").bothE().bothV().loop("start"){it.path.collect{it.weight==null ? 0.0 : it.weight}}.sum()<=0.3f}.simplePath().dedup() 
2

TinkerPop有關3語法可能看起來像這樣:

g.withSack(0.0F).V(1).repeat(OUTE()袋(總和, '權重')INV()。 ).times(2).sack()路徑()

它輸出完整的路徑,包括邊緣,與邊緣的相加重量沿着:

==> [v [4256], e [178-3a8-1lh-374] [4256-onetwo-> 4144],v [4144],e [16u-374-36d-3a0] [4144-twothree-> 4248],v [4248],3.0]

相關問題