【问题标题】:Arangodb custom filter/visitor for my tree graph我的树图的 Arangodb 自定义过滤器/访问器
【发布时间】:2015-11-02 14:14:22
【问题描述】:

我有一个图,其中包含两个这样的边定义:

isDepartment: [organisation] -> [organisation]
hasAccess: [user] -> [organisation]

组织嵌套在树中(无循环)。有多个顶级组织没有任何传入的isDepartment 边缘。

用户被授予访问一个或多个组织的权限。这些可以是顶级组织或树下某个位置的组织。如果用户有权访问某个组织,则它可以访问所有子组织。

我正在尝试构建一个自定义访问者或过滤器,为用户提供所有可访问的组织,包括到根目录的路径,以及是否可访问的属性。

例如,采取如下组织结构:

  • 根 A
    • 部门A.1
    • 部门A.2
  • 根 B
    • 部门B.1
    • 部门B.2
    • 子部门。 B.2.1
  • 根 C
    • 部门C.1
    • 部门C.2

现在选择一个有权访问Root ADept. B.2 的用户。我想生成以下结果树:

  • 根 A,可访问:true
    • 部门A.1,可访问性:true
    • 部门A.2,可访问性:true
  • 根 B,可访问:假
    • 部门B.2,可访问性:true
    • 子部门。 B.2.1,可访问性:true

请注意,Root CDept. B1 不在结果中,因为用户无法访问它们,也无法访问它们的任何子项。

另请注意,Root B 已包含在内,但标记为 not accessible。这是因为用户只被授予访问 Root B 的孩子而不是 root 本身的访问权限。

我如何编写一个自定义函数/访问者/过滤器来完成这个?

【问题讨论】:

    标签: graph tree-traversal arangodb


    【解决方案1】:

    这确实是一个具有挑战性的问题,非常感谢;)

    您可以通过将用户定义的函数添加到 AQL 并在 TRAVERSER 中使用它们来解决此问题。

    首先我通过arangosh注册了两个AQL访问者函数:

    var aqlfunctions = require("org/arangodb/aql/functions");
    aqlfunctions.register("myvisitor::indirectAccess", "function (config, result, vertex) { if(result.length === 0) {result.push({});} result[0][vertex._key] = {hasAccess: true};}")
    aqlfunctions.register("myvisitor::noAccess", "function (config, result, vertex) { if (result.length === 0) {result.push({});} result[0][vertex._key] = {hasAccess: false};}")
    

    这些函数只需执行以下操作:

    • myvisitor::indirectAccess 将用于遍历树。与在 AQL 中结果始终是一个数组一样,我们只需在第一个文档中向它(如果需要)存储所有数据。然后我们给顶点_key属性赋值{hasAccess: true}
    • myvisitor::noAccess 将用于遍历树并以相同的方式存储“{hasAccess: false}”。

    现在我们可以使用这些访问者执行以下查询:

    FOR x IN GRAPH_NEIGHBORS(@graph, @userId, {direction: 'outbound'})
    LET upwards = TRAVERSAL(organisation, isDepartment, x, 'inbound', {visitor: 'myvisitor::noAccess'})[0]
    LET downwards = TRAVERSAL(organisation, isDepartment, x, 'outbound', {visitor: 'myvisitor::indirectAccess'})[0]
    RETURN MERGE(upwards, downwards)
    

    简短说明:

    1. 查找此用户可以直接访问的组织。
    2. 上树 upwards 并将所有内容标记为“noAccess”。
    3. 沿着树下downwards 并将所有内容标记为“访问”。
    4. 合并upwardsdownwards

    如果您想修改结果格式,您必须更改注册访问者功能。

    【讨论】:

    • 哦,这看起来很不错。谢谢,我去试试看:-)
    • 这不太对,但我快到了。我需要添加一些排序和嵌套(或在 vertex.name 上缩进)以获得我需要的结果。
    猜你喜欢
    • 1970-01-01
    • 2010-12-02
    • 1970-01-01
    • 2018-08-26
    • 2011-10-04
    • 2022-01-21
    • 1970-01-01
    • 2021-08-09
    • 1970-01-01
    相关资源
    最近更新 更多