【发布时间】:2018-01-18 17:51:23
【问题描述】:
我的用例是系统的当前用户有access to 一组组。这些群组可以belong to 其他群组。所以我想在一个查询中访问所有基本组和父组。
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。
运行上述查询的种子样本数据
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();
我们将不胜感激任何提示或改进想法。
更新: 下面的查询似乎对我有用。不确定这是否是最好的方法。
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")
)
【问题讨论】:
-
可以提供一个 Gremlin 脚本来构造一些可以执行此遍历的示例数据。我认为如果你能提供,你收到的答案的质量会好得多。您还可以解释更多关于您希望最终结果是什么样子的信息 - 现在您有一个
Map并且您说您想要顶点但是您如何想要“baseGrp”和“nestedGrp” - 所有在一起?还是应该保持分开?如果你能更好地解释最终结果,它们可能是优化你的整个遍历以获得答案的方法。 -
@stephenmallette :嘿,最终结果应该是一起遍历而不应该是单独的键。我在看类似
g.V(currentUser).union(<traversal returning all grps>, <another traversal returning a different set of grps>) -
还对问题添加了另一个更新。不确定它是否是最佳查询,但有点工作。
标签: tinkerpop3 datastax-enterprise-graph