假設這是你的圖表:
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')))
過濾器會立即過濾更好頂點出來,你不必等待所有邊的計數。
你的假設是正確的。本來希望添加一個示例圖,但不知道我會如何去做這件事。我們花了很多時間嘗試一些類似的東西,但無法使其發揮作用。用你的解決方案就可以。感謝您的建議,我認爲這改善了我們的查詢。 – Mischa