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

apache tinkerpop gremlin使用选择值作为

  •  3
  • user962206  · 技术社区  · 6 年前

    我有一个疑问,它是为我预期的工作。

    g.V().or(hasLabel("poi"),hasLabel("business")).as("dest")
    .outE().inV().hasLabel("region").as("reg")
    .select("dest").values("name").as("dest_name")
    .select("dest").values("budget").as("dest_budget")
    .select("reg").values("name").as("reg_name")
    .select("reg_name","dest_name","dest_budget")
    

    此查询产生此结果。

    enter image description here

    如我所料。但是,我需要从“目的地”检索更多的属性,我需要检索更多的10个属性。这会让我变成这样

    g.V().or(hasLabel("poi"),hasLabel("business")).as("dest")
    .outE().inV().hasLabel("region").as("reg")
    .select("dest").values("name").as("dest_name")
    .select("dest").values("budget").as("dest_budget")
    .select("dest").values("property3").as("property3")
    .select("dest").values("property4").as("property4")
    //insert more queries like from the above
    .select("reg").values("name").as("reg_name")
    .select("reg_name","dest_name","dest_budget","property3","property4")
    

    查询最终会变长,这是我试图避免的,因为我还需要从区域中选择值。所以我最初的想法是使用select来选择多个值,并用如下别名标记它们

    g.V().
    or(hasLabel("poi"),hasLabel("business"))
    .as("destination")
    .outE().inV().as("region")
    .select("destination").values("name","budget").as("dest_name","dest_budget")
    .select("region").values("name").as("reg_name")
    .select("dest_name","reg_name","dest_budget")
    

    然而,我对这个结果感到惊讶。我没想到。

    enter image description here

    据我所知,值中的名称将映射到as步骤中传递的每个值。我错了吗?

    我是否可以从第一张截图中检索结果而不必编写长查询?

    1 回复  |  直到 6 年前
        1
  •  2
  •   stephen mallette    6 年前

    这个 as() 标记步骤,而不是该步骤中的值。这样做:

    .select("destination").values("name","budget").as("dest_name","dest_budget")
    

    你只是在命名 values() 一步两步。我认为您可以大大简化这个遍历,从而得到您想要的结果,而且不需要将很多 select() 步骤:

    g.V().or(hasLabel("poi"),hasLabel("business")).
      project('dest_name','dest_budget','reg_name').
        by('name').
        by('budget').
        by(out().hasLabel("region").values('name').fold())
    

    你会得到一个稍微不同的结构,因为“reg_name”将是一个所有区域名的列表,而不是一个扁平结构,但是如果需要的话,你可以展开我想象的。