在Gremlin中,map()如何真正起作用?

时间:2018-06-25 02:37:00

标签: java gremlin tinkerpop3 tinkergraph

为什么这两个产生不同的结果?

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

相比

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

为什么我更喜欢map而不是直接调用.out()方法? 这样,我可以组织我的代码,在其中我可以从方法获得遍历并“映射”到现有遍历。

1 个答案:

答案 0 :(得分:3)

在考虑这个问题时,请记住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]

或将fold()的结果out()到单个对象,以保持一对一的转换逻辑:

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