首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在TinkerPop3中展平图形遍历映射

在TinkerPop3中展平图形遍历映射
EN

Stack Overflow用户
提问于 2018-01-19 01:51:24
回答 1查看 193关注 0票数 0

我的用例是系统的当前用户拥有access to一组组。这些组可以belong to其他组。因此,我希望在一个查询中获得所有基本组和父组。

代码语言:javascript
运行
复制
g.V(currentUser)
        .out("access-to")
        .has(label, "groups")
        .as("baseGrps")
        .aggregate("baseGrps")
        .until(out("belongs-to").count().is(0))
        .repeat(out("belongs-to").simplePath().aggregate("grps"))
        .cap("grps")
        .unfold()
        .dedup()
        .as("nestedGrps")
        .select("baseGrp", "nestedGrps")

然而,这显然是返回一个地图,但是我只想返回顶点,这样我就可以在另一次遍历中使用union

要对其运行上述查询的种子样本数据

代码语言:javascript
运行
复制
g.addV("user")
  .property("name", "AUser")
  .as("aUser")
  .addV("group")
  .property("name", "UserGroup")
  .as("userGroup")
  .addV("userGroup")
  .property("name", "AdminUserGroup")
  .as("adminUserGroup")
  .addV("group")
  .property("name", "AllUserGroup")
  .as("allUserGrp")
  .select("aUser")
  .addE("access-to")
  .to("userGroup")
  .select("userGroup")
  .addE("belongs-to")
  .to("adminUserGroup")
  .select("adminUserGroup")
  .addE("belongs-to")
  .to("allUserGrp")
  .select("aUser")
  .next();

任何提示或改进的想法都将非常感谢。

更新:下面的查询看起来很适合我。我不确定这是不是最好的方法。

代码语言:javascript
运行
复制
g.V().has(T.label, "user").has("name", "AUser")
        .union(
            out("access-to")
                .as("baseGroups")
                .until(out("belongs-to").count().is(0))
                .repeat(out("belongs-to").simplePath())
                .emit()
                .dedup()
                .as("subGroups"),
            out("access-to")
        )
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-01-19 20:08:36

感谢您更新您的答案。请注意,您的示例数据脚本可以编写为:

代码语言:javascript
运行
复制
g.addV("user").
  property("name", "AUser").as("aUser").
  addV("group").property("name", "UserGroup").as("userGroup").
  addV("userGroup").property("name", "AdminUserGroup").as("adminUserGroup").
  addV("group").property("name", "AllUserGroup").as("allUserGrp").
  addE("access-to").from("aUser").to("userGroup").
  addE("belongs-to").from("userGroup").to("adminUserGroup").
  addE("belongs-to").from("adminUserGroup").to("allUserGrp").
  iterate()

这对一些人来说可能更直观。另请注意,您提供的工作遍历可以简化为:

代码语言:javascript
运行
复制
gremlin> g.V().has("user","name", "AUser").
......1>   union(out("access-to").
......2>         until(outE("belongs-to").count().is(0)).
......3>           repeat(out("belongs-to").simplePath()).
......4>         emit().
......5>         dedup(),
......6>         out("access-to"))
==>v[4]
==>v[6]
==>v[2]

注意在until()中使用outE(),而不是在out()中-这是一个重要的优化,因为您只需要计算那里的边数就可以打破循环。计算这些边上的相邻顶点的成本更高。

以下是我对您目前所获得的改进的尝试:

代码语言:javascript
运行
复制
gremlin> g.V().has("user","name", "AUser").
......1>   repeat(out('access-to','belongs-to').simplePath()).
......2>     until(outE("belongs-to").count().is(0)).
......3>   emit().
......4>   dedup()
==>v[2]
==>v[4]
==>v[6]

也许我对你提供的示例数据做了太多的假设,但是如果你可以假设没有从"group“顶点传出的"access-to”边,那么Gremlin只会在离开"user“的第一步之后遍历”归属地“边,遍历就会得到你想要的结果。我猜您仍然需要simplePath()dedup()步骤,因为我想象组可以属于多个父组,此时您可能会一遍又一遍地遍历相同的路径。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48327473

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档