【问题标题】:Apache Tinkerpop Gremlin Returns Query Results using Select Values AsApache Tinkerpop Gremlin 使用 Select Values As 返回查询结果
【发布时间】:2019-01-13 14:29:58
【问题描述】:

我有这个查询,它按预期工作。

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")

这个查询产生这个结果。

正如我所料。但是我需要从“目标”中检索更多属性,我需要检索更多 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")

但是我对这个结果感到惊讶。这是我没想到的。

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

我是否可以在不编写长查询的情况下从第一个屏幕截图中检索结果?

【问题讨论】:

    标签: graph-databases gremlin tinkerpop datastax-enterprise-graph


    【解决方案1】:

    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”将是一个所有区域名称的列表,而不是一个扁平的结构,但如果需要,你可以展开我想像的那样。

    【讨论】:

    • 如果 OP 需要从 "out.hasLabels("region") 中检索多个值怎么办?因为据我了解,OP 也希望从该区域中检索更多值(例如 region_name ,区域点等)
    • by() 调制器采用Traversal(除其他外)作为参数,因此您需要的任何 Gremlin 都可以使用。而不是values('name'),而是使用project(),而不是List 的“名称”值,您将获得Map 值的List,其中包含您想要的区域的任何键。
    猜你喜欢
    • 2023-01-15
    • 1970-01-01
    • 2014-02-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-15
    • 1970-01-01
    相关资源
    最近更新 更多