2017-05-31 69 views
1

我正在使用IBM圖並使用gremlin嘗試過濾某些頂點。我的邊有兩個標籤,可選。這種情況:如何使用gremlin/IBM graph來排除基於邊緣的頂點

V3 -- V5 -- V6 
/\ 
V1 \ 
    \ \ 
    V2 -- V4 

這有點像供應鏈/需求鏈。 V1是提供兩種電源(V3和V2)的物體。 V4需要這兩種耗材才能工作。 V5需要V3和V6都能夠工作。因爲我只有V2和V3。我需要一個查詢,允許我從V2和V3移動到每個外出頂點,但根據該頂點是否具有所需邊(但允許可選邊)來排除頂點。

經過大量嘗試,這是一個同事想出了:

def g = graph.traversal(); g.V(1).out().outE().aggregate('edges').inV().where(inE('required').where(not(within('edges'))).count().is(eq(0))).dedup() 

這是做到這一點的最好方法是什麼?還是有更聰明的方法?

回答

4

假設這是你的圖表:

gremlin> g.addV().property(id,1).as('1'). 
......1> addV().property(id,2).as('2'). 
......2> addV().property(id,3).as('3'). 
......3> addV().property(id,4).as('4'). 
......4> addV().property(id,5).as('5'). 
......5> addV().property(id,6).as('6'). 
......6> addE('supplies').from('1').to('2'). 
......7> addE('supplies').from('1').to('3'). 
......8> addE('required').from('2').to('4'). 
......9> addE('required').from('3').to('4'). 
.....10> addE('required').from('3').to('5'). 
.....11> addE('required').from('6').to('5').iterate() 

,這是預期的輸出:

gremlin> g.V(1). 
......1> out(). 
......2> outE(). 
......3> aggregate('edges'). 
......4> inV(). 
......5> where(inE('required'). 
......6>   where(not(within('edges'))). 
......7>   count().is(eq(0))). 
......8> dedup() 
==>v[4] 

然後聚集邊緣已經走過邊緣可能是最好的辦法。 (它總是最好的,包括一個示例圖表作爲您的問題一個小鬼腳本)我想這是值得注意的是,你不需要在你的is()not(without(...))eq()只是without

gremlin> g.V(1). 
......1> out(). 
......2> outE(). 
......3> aggregate('edges'). 
......4> inV(). 
......5> where(inE('required'). 
......6>   where(without('edges')). 
......7>   count().is(0)). 
......8> dedup() 
==>v[4] 

或者只是所有計數一起做掉,因爲你想那些不返回新邊的頂點穿越:

gremlin> g.V(1). 
......1> out(). 
......2> outE(). 
......3> aggregate('edges'). 
......4> inV(). 
......5> not(inE('required'). 
......6>  where(without('edges'))). 
......7> dedup() 
==>v[4] 

上述方法可能是因爲只有一個邊緣從 立即返回你的inE('required').where(not(within('edges')))過濾器會立即過濾更好頂點出來,你不必等待所有邊的計數。

+0

你的假設是正確的。本來希望添加一個示例圖,但不知道我會如何去做這件事。我們花了很多時間嘗試一些類似的東西,但無法使其發揮作用。用你的解決方案就可以。感謝您的建議,我認爲這改善了我們的查詢。 – Mischa

相關問題