代码之家  ›  专栏  ›  技术社区  ›  Ram

在gremlin中,map()是如何工作的?

  •  1
  • Ram  · 技术社区  · 8 年前

    为什么这两种方法会产生不同的结果?

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

    与…相比

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

    为什么我更喜欢map直接调用.out()方法? 通过这种方式,我可以组织代码,从方法中获取遍历,并“映射”到现有的遍历。

    1 回复  |  直到 8 年前
        1
  •  3
  •   stephen mallette    8 年前

    在考虑这个问题时,回想一下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请求两个不同的东西。在第一种情况下, 不是一种形式 map() flatMap() 地图() 它是该遍历器流中的第一个对象。

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

    或者 fold() 到单个对象以维护一对一转换逻辑:

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