如何将列表中的每个元素包装到对象中?

时间:2018-05-27 18:43:48

标签: graph-databases gremlin tinkerpop tinkerpop3

我有以下gremlin查询,其中我查询多个边,然后查询其伴随的顶点

     outE('childSolution')
                .inV()
                .local(union(
                     identity()
                     .valueMap(true)
                     .project('solution')
                    ,
                     outE('writtenBy')
                    .inV()
                    .valueMap(true)
                    .project('originator')
                    , 
                    outE('childProblem')
                    .inV()
                    .valueMap(true)
                    .project('childProblem')
                ))
                .fold()
                .project('childSolutions')

我要回来了

    "childSolutions": [
          { "solution" : { properties... }
          },
          {
            "originator": { properties... }
          }
     ]

我想要的是

"childSolutions": [
        { "fullSolution : {
          { "solution" : { properties... }
          },
          {
            "originator": { properties... }
          }
         },
        { "fullSolution : {
          { "solution" : { properties... }
          },
          {
            "originator": { properties... }
          }
         }
     ]

非常感谢任何帮助

1 个答案:

答案 0 :(得分:3)

在询问有关Gremlin的问题时,最好提供一个可以生成样本图的Gremlin脚本,以便将其粘贴到Gremlin Console会话中。那样回答的人可以测试他们的结果。在这种情况下,我只需轻轻一点重写你的遍历,但我认为你需要反转你使用project()的方式,你得到一个更易读的遍历和一个你想要的东西:

out('childSolution').
project('childSolutions').
  by(project('solution','originator','childProblem')
       by(valueMap(true)).
       by(out('writtenBy').valueMap(true)) 
       by(out('childProblem').valueMap(true)))

使用project(),您可以预先指定您想要的密钥,然后使用by()说明这些密钥应该包含哪些内容。这次遍历的输出并不完全符合您的要求,但我认为我的精神正确。如果您希望它完全匹配,那么最好是您在问题中提供样本图表。