2013-05-12 116 views
0

我有圖(見下圖)。我使用A中的gremlin並且需要沿着「影響」和「類似到」邊緣循環所有樹。Gremlin循環遍歷各個邊緣方向

所以我需要的東西,如:

g.v(A.id).out('impacts', 'similarTo').loop(1){it.loops < 4}{true} 

該查詢的問題,即關係「性相似」,可有時候部邊緣,有時在邊緣(見圖表),取決於如何存儲應用數據。我不能簡單地使用「both」(g.v(A.id).both('impact','similarTo')...)來檢索邊緣,因爲我只需要邊緣來處理「影響」關係。也有可能,對某些頂點(例如C)缺少「類似到」邊緣,在這種情況下,循環只應遵循「影響」關係。

graph

最後我想這樣的事情,但我想我使用它錯,結果是不恰當的:

g.v(A.id).as('x').copySplit(_().out('impacts'), _().both('similarTo')).fairMerge.loop('x'){it.loops < 4}{true} 

我也試圖穿越期間過濾通過方向的邊緣,但它可能不支持,所以這也不起作用:

g.v(A.id).as('x').bothE.filter{((it.label=='impacts' & it.direction=='out') || it.label=='similarTo')}.bothV.loop('x'){it.loops < 4}{true} 

有什麼建議嗎?

回答

1

所以最後我意識到在小鬼的正確方法應該是:

g.v(A.id).as('x').copySplit(_().out('impacts'), _().both('similarTo')).fairMerge.loop('x'){it.loops < 4}{true} 

但在小鬼錯誤的時刻(see bug report)和copySplit在循環中不能很好地工作。無論如何,我必須在copySplit之前添加._()以使其正常工作:

g.v(A.id).as('x')._().copySplit(_().out('impacts'), _().both('similarTo')).fairMerge.loop('x'){it.loops < 4}{true} 
0

我有跟小鬼沒有經驗,但在Cypher支架,你可以做到這一點,如下所示:

START n=node({id}) 
MATCH p=n-[:impacts|similarTo*3]-m 
RETURN p 

該查詢返回包含類型影響和性相似的單向關係的所有路徑與3

深度