簡體   English   中英

在Gremlin中map()真的有用嗎?

[英]In Gremlin how does map() really work?

為什么這兩個產生不同的結果?

graph.traversal()
   .V().map(__.out("contains"))
.valueMap(true).next(100)

相比

graph.traversal()
   .V().out("contains")
.valueMap(true).next(100)

為什么我更喜歡map直接調用.out()方法? 這樣我可以組織我的代碼,我可以從方法中獲取遍歷並“映射”到現有的遍歷。

在考慮這個問題時,請回想一下Gremlin有點像處理管道,其中對象被拉過管道中的每個步驟以應用一些轉換,過濾等等。因此,以最簡單的形式給出您的示例,您會說你得到所有頂點並遍歷out()邊,這意味着你正在比較以下遍歷和結果:

gremlin> g = TinkerFactory.createModern().traversal()
==>graphtraversalsource[tinkergraph[vertices:6 edges:6], standard]
gremlin> g.V().out()
==>v[3]
==>v[2]
==>v[4]
==>v[5]
==>v[3]
==>v[3]
gremlin> g.V().map(out())
==>v[3]
==>v[5]
==>v[3]

那些遍歷返回兩個不同的結果,因為你要求Gremlin兩個不同的東西。 在第一種情況下, out()不是map()的形式,它是flatMap()一種形式,這意味着對於通過管道的每個頂點遍歷,它將迭代所有傳出邊並遍歷並返回相鄰頂點(即一對多變換)。 在第二種情況下,你要求Gremlin做一個頂點到另一個對象的簡單map() (即一對一變換),在這種情況下將是out()的結果,這是第一個對象遍歷流。

為了演示你可以簡單地將map()更改為flatMap() ,如下所示:

gremlin> g.V().flatMap(out())
==>v[3]
==>v[2]
==>v[4]
==>v[5]
==>v[3]
==>v[3]

或者將out() fold()的結果fold()到單個對象以維持一對一的轉換邏輯:

gremlin> g.V().map(out().fold())
==>[v[3],v[2],v[4]]
==>[]
==>[]
==>[v[5],v[3]]
==>[]
==>[v[3]]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM