gpt4 book ai didi

graph - 我的 TreeMap 的 Arangodb 自定义过滤器/访问者

转载 作者:行者123 更新时间:2023-12-01 11:29:47 25 4
gpt4 key购买 nike

我有一个带有两个边定义的图,如下所示:

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,可访问:false
  • B.2 部门,可访问:true
  • 分部B.2.1,可访问:真

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

    另请注意 Root B包含但标记为 not accessible .这是因为用户仅被授予访问 Root B 的 child 的权限。但不是根本身。

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

    最佳答案

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

    您可以通过向 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 中结果始终是一个 Array,我们只需在第一个文档中(如果需要)来存储所有数据。然后我们分配给顶点 _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)

    简短说明:
  • 查找该用户可以直接访问的组织。
  • 上树upwards并将所有内容标记为“noAccess”。
  • 下树downwards并将所有内容标记为“访问”。
  • 合并 upwardsdownwards .

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

    关于graph - 我的 TreeMap 的 Arangodb 自定义过滤器/访问者,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33479649/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com