【问题标题】:Performant query to find all reacheable nodes查找所有可达节点的高性能查询
【发布时间】:2020-04-10 03:15:56
【问题描述】:

我正在研究 AWS Neptune 和 Gremlin 以构建权限系统。 这个系统基本上有 3 种类型的顶点:用户、权限和组。

  • 一个组有 0..n 个权限
  • 一个用户可以有 0..n 个组
  • 一个用户可以直接连接到0..n权限
  • 一个用户可以连接到另一个用户,在这种情况下,它会“继承”该用户的权限
  • 一个组可以在另一个组内,即在另一个组内.... 以此类推。

我正在寻找一个高性能查询来查找给定用户的所有权限。

这个图可能会变得非常大,所以为了强调一下,我已经构建了一个 17kk 用户顶点图,为每个顶点创建了 10 个随机边,然后创建了一些权限。

然后我用来获取所有权限的查询显然永远运行... n_n'

我正在尝试的只是:

g.V('u01')
    .repeat(out())
    .until(hasLabel('Permission'))
    .simplePath()

有没有更好的查询来实现它?或者甚至可以为这种场景提供更好的建模?

我在想,也许我的 10 个随机边创建了很多“毫无意义”的循环和连接,这就是查询缓慢的原因。有意义吗?

提前致谢!

【问题讨论】:

    标签: graph-databases gremlin amazon-neptune


    【解决方案1】:

    你可能在兜圈子。你应该这样写:

    g.V('u01')
        .repeat(out().simplePath())
        .until(hasLabel('Permission'))
    

    最好在out 步骤中使用特定标签,以避免遍历不相关的路径。

    【讨论】:

    • 嗨,我花了很长时间进行测试,因为我不得不销毁该图并重新创建它。实际上我重新创造了一些不同的东西。仍然是相同的 17kk user 顶点,但每个节点有 3 条边到随机 user (所以,或多或少 51kk 边)。我尝试使用simplePath(),但仍然超时。还有其他想法吗? gremlin> g.V('u3').repeat(out().simplePath()).until(hasLabel('Permission')) {"requestId":"b5fd0ed2-f865-4c5f-ad3f-e748c1696258","code":"TimeLimitExceededException","detailedMessage":"A timeout occurred within the script during evaluation."}
    • 由于是随机生成的图,所以很难判断问题出在哪里。尝试在until 中使用loops().is(eq(4)) 限制跃点数。在查询末尾添加count(),只获取结果数,省去繁重的序列化。您还可以添加 profile() 以了解遍历次数和每次花费的时间。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-25
    • 1970-01-01
    相关资源
    最近更新 更多