【问题标题】:Discover all vertices of a type from origin从原点发现一个类型的所有顶点
【发布时间】:2019-12-19 02:39:12
【问题描述】:

我正在使用图形数据库对权限系统进行建模。 这是一个示例场景:

用户 u1 具有直接权限,并且在组 g1 中,该组具有权限并扩展了另一个组。

一个用户也manages 一个系统s1 并且可以将与s1 相关的权限授予其他用户。

基本上我需要做的是获得我的u1 的所有权限。 我怀疑这是一个简单的查询,但我很难使用 gremlin。

我尝试了repeat()s、out()s、emit()s、path()s 等的组合,但找不到我需要的。我所尝试的所有方法都返回了比需要更多的节点(如权限路径中的组节点,或与系统相关的权限)或更少的节点(如未达到G2

所以总结一下我需要的是:

gremlin> g.V('u1').__misteriousQueryThatShouldntBeThatHard()
==> v[p1]
==> v[p2]
==> v[p3]
==> v[p4]

感谢任何帮助。

【问题讨论】:

  • 顶点颜色是否表示它们具有相同的标签?
  • Kfir 对您上一个问题的回答有什么问题?我测试了它,它似乎在这个用例上工作正常

标签: graph-databases gremlin amazon-neptune


【解决方案1】:

如果 Kfir 对上一个问题的回答的唯一问题是将路径限制为某些边缘标签,您可以尝试:

g.V('u1')
    .repeat(out('is-in', 'extends', 'has-permission').simplePath())
    .until(hasLabel('Permission'))

【讨论】:

  • 诺姆你是对的。上一个问题的问题就是这个。我试过out(not(too)),但还没有尝试传递更多标签-_-。而且我仍然无法测试另一个答案的性能,这就是它没有回复的原因。谢谢!
  • @JoãoMenighin 如果您想要除“管理”以外的所有标签,您可以:outE().not(hasLabel('manage')).inV()
  • 伟大的诺姆!还有一个问题:在某些情况下,我想在一个查询中获取用户本身及其权限,以避免过多地访问数据库。所以我的例子中的输出应该有权限节点和用户节点(v[u1])。你知道这是否可能吗?我在g.V('u1') 之后尝试了emit(),但它发出的不仅仅是用户。也许使用sideEffect..?
  • 你可以使用union( identity(), repeat(....)...)project一步
猜你喜欢
  • 2019-08-09
  • 2018-04-26
  • 1970-01-01
  • 2019-09-03
  • 2021-01-23
  • 2019-02-14
  • 1970-01-01
  • 2018-07-14
  • 1970-01-01
相关资源
最近更新 更多