这确实是一个具有挑战性的问题,非常感谢;)
您可以通过向 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)
简短说明:
- 查找该用户可以直接访问的组织。
- 爬上树
upwards
并将所有内容标记为“noAccess”。
- 下树去
downwards
并将所有内容标记为“访问”。
- Merge
upwards
and downwards
.
如果您想修改结果格式,您必须更改注册的访问者函数。