我想獲得從給定開始節點到給定範圍內的所有節點的最短路徑列表。每條邊都是加權的,我試圖用這些權重的總和作爲範圍,而不是步數。如何使用gremlin查找加權邊緣範圍內的所有節點?
限制措施下工作,但我不知道如何聚合和極限道路邊權或正確返回路徑。
g.v(1).out.loop(1){it.loops < 3}{true}.dedup
感謝您的幫助!
我想獲得從給定開始節點到給定範圍內的所有節點的最短路徑列表。每條邊都是加權的,我試圖用這些權重的總和作爲範圍,而不是步數。如何使用gremlin查找加權邊緣範圍內的所有節點?
限制措施下工作,但我不知道如何聚合和極限道路邊權或正確返回路徑。
g.v(1).out.loop(1){it.loops < 3}{true}.dedup
感謝您的幫助!
循環步驟的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()
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]
這是Tinkerpop 2還是3? –
2.尚未移動到3,但如果需要它是一個選項。 – tomatosource
我不知道如何用2來做,因爲循環是寬度優先的,所以你需要爲每個路徑分開累加器,或者在循環閉合內求和整個路徑。後者會好得多。我知道Tinkerpop 3已經(或將要)具有深度優先作爲選項,但是我已經嘗試過了,但是隨着深度的增加和深度的增加,它似乎就變成了一個變量或一組變量。 –