本文介紹了如何在Java中使用gremlin遍歷圖形時(shí)收集屬性值?的處理方法,對(duì)大家解決問題具有一定的參考價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧!
問題描述
我的圖中的每個(gè)頂點(diǎn)至少有一個(gè)名稱屬性。我有一個(gè)名稱值的標(biāo)簽L集合S。現(xiàn)在,我想從集合S中具有名稱的頂點(diǎn)中收集可通過帶有邊標(biāo)簽EL的特定傳出邊(遞歸地)到達(dá)的所有頂點(diǎn)的名稱屬性值。
我當(dāng)前針對(duì)名為s1的單個(gè)開始節(jié)點(diǎn)的解決方案如下所示:
g.traversal().V().hasLabel(L)
.has("name", S1)
.repeat(__.optional(__.out(EL)))
.until(__.out(EL).count().is(0))
.path()
.forEachRemaining(path -> {
path.forEach(e -> System.out.println(((Vertex)e).property("name").value()));});
println
只是為了看到這會(huì)產(chǎn)生預(yù)期的結(jié)果,通常我會(huì)將姓名收集在一組中。
是否有更好的方法來收集可通過標(biāo)簽為EL的傳出邊到達(dá)的所有頂點(diǎn)的名稱屬性值?
從多個(gè)頂點(diǎn)(其中只知道集合S中的名稱)開始的最佳方法是什么?
目前,該結(jié)構(gòu)是一個(gè)樹,但如果可能存在循環(huán),上面的代碼是否可以防止無盡的循環(huán)?如果沒有,如何做到這一點(diǎn)?
推薦答案
您的方法是一個(gè)良好的開端。
要從一組多個(gè)頂點(diǎn)開始,請(qǐng)使用P.within()
謂詞。TinkerPop提供了幾個(gè)other predicates。
使用simplePath()
防止循環(huán)重復(fù)。
使用store()
跟蹤遍歷圖形的項(xiàng)目。by("name")
調(diào)制器將存儲(chǔ)”name”屬性,而不是頂點(diǎn)。
要得到結(jié)果,請(qǐng)使用cap()
輸出它在遍歷過程中存儲(chǔ)的項(xiàng)。此時(shí)的結(jié)果是可能包含重復(fù)項(xiàng)的Set
。使用unfold()
將Set
轉(zhuǎn)換為我們可以dedup()
然后使用toSet()
完成的迭代器。
graph.traversal().V().hasLabel(L).has("name", P.within(S)).
repeat( __.out(EL).simplePath().store("x").by("name") ).
until( __.outE(EL).count().is(0) ).
cap("x").unfold().dedup().toSet()
這篇關(guān)于如何在Java中使用gremlin遍歷圖形時(shí)收集屬性值?的文章就介紹到這了,希望我們推薦的答案對(duì)大家有所幫助,