我的树形图的 Arangodb 自定义过滤器/访问者

2024-02-11

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

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

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

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

我正在尝试构建一个自定义访问者或过滤器,为我提供用户的所有可访问组织,包括它的根路径,以及属性(如果它们可访问或不可访问)。

以以下组织结构为例:

  • Root A
    • A.1部
    • A.2部
  • Root B
    • B.1部
    • B.2部
    • 下属部门B.2.1
  • Root C
    • C.1部
    • C.2部

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

  • Root A, accessible: true
    • A.1 部门,可访问:true
    • A.2 部门,可访问:true
  • Root B, accessible: false
    • B.2 部门,可访问:true
    • 下属部门B.2.1,可访问:true

注意Root C and Dept. B1不在结果中,因为用户无法访问它们,其子级也无法访问。

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

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


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

您可以通过向 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. Merge upwards and downwards.

如果您想修改结果格式,您必须更改注册的访问者函数。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

我的树形图的 Arangodb 自定义过滤器/访问者 的相关文章

  • 如何在使用邻接矩阵表示的大型网络中找到桥梁(社区连接节点)

    我有大约 10K 到 100K 个节点的网络 这些节点都已连接 这些节点通常被分组为社区集群 这些社区集群之间通过许多边紧密相连 并且存在集线器等 在社区之间存在具有一些边的节点bridging 连接社区在一起 这些数据集位于邻接矩阵中 我
  • 在 R 中使用 igraph 获取连接组件

    我想找到一张图的所有连接组件 其中组件具有多个元素 使用clusters给出不同集群的成员资格并使用cliques不给出连通分量 这是后续 R中列表的多重交集 https stackoverflow com questions 304065
  • 给定最大成本,找到具有最小成本和最大长度的路径

    我正在寻找一种算法 以在无向加权完整图中给定最大成本的情况下找到具有最小成本和最大长度的两个节点之间的路径 权重非负 就我现在而言 我正在使用 DFS 而且它非常慢 节点数量较多 长度也最大 我已经在 DFS 的每次迭代中丢弃了所有不可能的
  • 如何在 R 中创建类似箱线图的分类散点图?

    有谁知道如何创建散点图R创建像这样的情节these http graphpad com support faq graph tip how can i make a barcolumn graph that also shows the i
  • 投影 - 将 3d 转换为 2d

    我有问题或者很好 我不知道如何将具有 x y z 值的 3d 点转换为 2d 点 我必须绘制投影 其中我确实有点的 x y z 值 但我不知道如何将它们转换为 2d 以便我可以将它们移动到我的轴上 我一直在浏览维基和谷歌 但是我不太确定应该
  • 迭代 DFS 与递归 DFS 以及不同的元素顺序

    我编写了一个递归 DFS 算法来遍历图 void Graph
  • ggplot2:将面/条文本分割成两行

    考虑以下带有长面 条带文本的 ggplot2 图 断成两行 该文本超出了专门用于分面标题的区域 library ggplot2 x lt c 1 3 1 3 y lt c 3 1 1 3 grp lt c 0 0 0 1 1 1 p lt
  • R/Javascript:崩溃和扩展的网络

    我正在使用 R 编程语言 我有以下图形网络数据 library igraph library visNetwork from lt c Boss TeamA TeamA TeamA SubteamA1 SubteamA1 SubteamA1
  • 如何使用 Chart.js 在堆积条形图中显示内联值?

    我正在使用 Chart js 库在堆叠条形图中显示一些值 但我正在努力找出如何显示条形图中的值 即 现在 我有以下代码 可以在条形顶部显示数字 但我想知道如何在条形内部显示它们 var numberWithCommas function x
  • 在 python matplotlib 中格式化损坏的 y 轴

    我正在 matplotlib 中处理一个 相当复杂的 条形图 它包含来自多个源的摘要数据 每个源都沿 x 轴标记 y 轴上有一系列结果 许多结果都是异常值 我尝试使用断开的 y 轴来显示这些结果 而不会使用以下组合来扭曲整个图表这个方法 h
  • boost::property_map 在 boost 中是如何实现的以及如何更改它

    我想知道属性映射是如何在提升图中实现的 例如 我的顶点和边属性定义如下 vertex property gt struct NodeInfo int a b c actual bundled property struct NodeInfo
  • ZedGraph 垂直线与 LineObj 问题

    我有一个 ZedGraphControl 里面有几条曲线 我想在一些固定的 x 位置添加垂直线 当然 这些线只能位于实际图形区域内 我尝试以下 LineObj line new LineObj Color Black xPos myPane
  • 向图节点添加标签

    我使用 visnetwork 库制作了下图 library tidyverse library igraph set seed 123 n 15 data data frame tibble d paste 1 n relations da
  • Bellman-Ford 算法检测什么?负重还是负循环?

    如果给定一个图 现在我们要从源头计算最短路径 现在 如果一条边具有负权重 但在到达目的地时有边到后边返回到该边 我的意思是如果没有循环 那么我们就没有负循环 但是here http en wikipedia org wiki Bellman
  • 在无向图中查找强连通分量

    我想在无向图中找到强连接的组件 即如果我从节点开始A然后我会回到节点A并且每条边都被恰好访问一次 对于有向图可以使用Tarjan算法来寻找强连通分量 但是对于无向图怎么办 我认为您错过了强连通分量的含义 强连接组件 如果所有顶点对之间都存在
  • 非二叉树的中序树遍历

    对于比二叉树更宽的树 术语 中序遍历 是否有明确定义的含义 或者 前 和 后 顺序是唯一有意义的 DFS 类型吗 我的意思是与n每个节点 gt 2 个子节点 我猜是为了n这甚至可能意味着之后要转到 根 n 2孩子们 但这曾经这样使用过吗 那
  • 如何使用 ArangoJs 将文档存储在 ArangoDb 图中?

    我正在使用 Nodejs 应用程序中的最新版本的 ArangoDb 和 ArangoJs 我有以下两个顶点 users tokens tokens顶点包含向其中一个用户发出的安全令牌users顶点 我有一个名为的边缘定义token belo
  • 用表达式分割轴标签

    我有一个带有包含表达式的长标签的图 我想将其分成两行 在表达式中添加 n 结果不符合预期 ylabel lt expression A very long label with text and n expression alpha bet
  • 更改 3D 图形颜色 (matplotlib)

    我使用以下代码在 matplotlib 中绘制了 3D 图形 Previously defines lists of data to plot fig plt figure ax fig add subplot 111 projection
  • 公式的后序遍历

    在数据结构中 我将按顺序转换和预排序公式转换为树 不过 我不太擅长后期订购 对于给定的公式x y z a b c 我想出了 divide x c y z a b 在大多数情况下 这似乎很合适 除了左子树中的 是牌组中的小丑 在后序遍历中 最

随机推荐

  • 预下载所有依赖项

    我需要将 Maven 构建 Java 项目发布给远程 QA 团队 为此 我想下载所有依赖项 然后发送它们 这样他们就不需要下载它们 目前所有依赖项都定义在pom xml文件 我们使用mvn install or mvn package构建项
  • 如何删除Selectbox/Checkbox的默认状态?

    我想知道如何删除选择框的默认箭头和复选框中的渐变 并且我想在其上使用自定义图像 例如 这是一些代码
  • 尝试解析 LocalDateTime 时出现异常

    我正在使用以下时间戳格式 yyyyMMddHHmmssSSS 以下方法效果很好 public static String formatTimestamp final Timestamp timestamp final String form
  • 如何查看 select2 实例的设置选项?

    我想要将选项设置为 select2 实例 特别是如果allowClear 选项设置为 true 或 false 浏览对象我发现了allowClear选项 jQuery gt select2 gt 选项 gt 选项 but I don t k
  • 为什么我无法为对话框视图中的按钮设置 onClickListener?

    我有一个自定义对话框 如下所述 我的自定义对话框布局 my dialog xml 其中只包含一个 关闭 按钮
  • CSS动画闪烁,尝试了我能找到的所有技巧

    我正在 Codepen 中制作一个简单的动画 诗淡入 然后单词 也是按钮 淡入 用户单击单词 它会更改为诗的下一部分 我的问题是 在淡出开始之前 诗歌和单个单词会闪烁 我已经尝试了所有我能找到的技巧 并添加 webkit backface
  • Heroku pg:psql 停止运行

    当我跑步时heroku pg psql i get gt Connecting to postgresql cylindrical 38664 并熄火 一切看起来都很顺利 但它只是卡住了 什么也没做 我似乎在 gitbash 中遇到了同样的
  • 在 perl 中读取和写入文件

    this is just an example 假设上面是out txt 我想读书out txt并写入同一个文件
  • 在 Android 中从纬度/经度获取企业名称或地标

    好吧 我已经为此搜索了相当长的时间 我有一个距我新发现的位置的纬度 经度 geocoder 的 getFromLocation 从纬度 经度返回一定数量的地址 这一切都很好 然后我将它放入一个适配器中 该适配器填充了一个旋转器 也运行得很好
  • UIButton 在单元格被触摸时也会突出显示

    I ve a UIButton在我弹出的表格单元格上 touchUpInside a UIAlertView并询问用户是否要删除与该单元格关联的文件 否则 触摸单元格本身会突出显示该单元格 然后移动到下一个级别以显示内容 问题是当细胞sel
  • 如何在一定时间后重试功能请求

    如果用户数据为空 如何让它重试发送尝试 最多重试 2 次 10 秒后重试 1 次 public class UserHandler private List users new ArrayList public void addUser u
  • 绕过 requiredfieldvalidator

    我有一个网络表单 上面有验证器 当用户按下提交按钮时 验证器可以很好地工作 但是 当用户按下注销按钮时 验证器会停止该按钮的工作 关于如何解决这个问题有什么建议吗 您需要使用CausesValidation按钮上的属性
  • nf_conntrack_helper注册未注册端口返回错误

    我有以下代码从内核 3 18 取消注册和注册 sip conntrack static void nf conntrack sip fini void int i j for i 0 i lt ports c i for j 0 j lt
  • 在没有 gitosis/gitolite 的情况下通过 SSH 运行“安全”git 服务器?

    是否可以通过 ssh 运行 git 服务器 使用authorized keys and command 限制仅访问 git 存储库 而不使用 gitosis gitolite 是的 分配git shell http www kernel o
  • 获取 Youtube 数据 API 的 403 禁止错误

    我在对 YouTube 数据 API 进行 API 调用时收到 403 禁止错误 我尝试生成不同类型的密钥 Web 浏览器 服务器等 钥匙不受限制 我尝试从服务器和 Chrome 的邮递员拨打电话 请求 URL 和响应如下 https ww
  • 访问 AVRO GenericRecord (Java/Scala) 中的嵌套字段

    我有一个带有嵌套字段的 GenericRecord 当我使用genericRecord get 1 它返回一个包含嵌套 AVRO 数据的对象 我希望能够像这样访问该对象genericRecord get 1 get 0 但我不能 因为 AV
  • 在 woocommerce 中隐藏折扣信息而不取消优惠券

    我在 Woocommerce 购物车中使用优惠券进行计算 它会自动为总额添加折扣 以便可以将正确的金额发送到支付网关 我想向访客隐藏有关此优惠券 折扣的所有信息 Problem 我发现的唯一方法 见下文 隐藏优惠券字段 行 总计 和消息 但
  • COBOL:GDG 文件描述符 (FD) 可以引用多代吗?

    我有一个程序可以读取 GDG 文件并将数据移动到工作存储 我很想知道是否可以使用对文件定义的引用对多代 GDG 重复此过程 也许有一种方法可以在文件定义上使用下标 我的想法是必须有一种方法将不同的文件定义移动到引用变量中以访问文件 基于建议
  • 如何检测设备是否支持鼠标?

    我目前使用以下测试 取自 Modernizr 来检测触摸支持 function is touch device var bool if ontouchstart in window window DocumentTouch document
  • 我的树形图的 Arangodb 自定义过滤器/访问者

    我有一个带有两个边定义的图 如下所示 isDepartment organisation gt organisation hasAccess user gt organisation 组织嵌套在树中 无循环 有多个顶级组织 没有任何传入is