【问题标题】:Keep first occurence of value when traversing up a tree in ArangoDB在 ArangoDB 中向上遍历树时保持第一次出现的值
【发布时间】:2015-11-09 17:28:49
【问题描述】:

我正在遍历一棵树,并且只想保留每个对象的第一次出现(基于边缘的属性)。这有点像从用于建模继承的食谱中继承的示例 (https://docs.arangodb.com/cookbook/ModulDocumentInheritance.html)。

在我的程序中,我有一个任务树和子任务(无限级别)。从一些任务来看,边缘指向人。在边缘有一个称为“角色”的属性。鉴于我从树的最下方开始执行任务并向上遍历,我想只保留每个独特角色(以及担任该角色的人)的第一次(最近)出现。

这样的事情可以在纯 AQL 中完成,还是访问者函数是可行的方法?

【问题讨论】:

  • 答案是否满足您的需求?如果没有,缺少什么?如果,你能把它标记为接受吗?
  • 只是我没有正确测试它。这就是我没有将其标记为完整的原因。

标签: arangodb


【解决方案1】:

您可以向服务器注册一个自定义的访问者功能,这可以供AQL使用。 在你的情况下,这样的事情可以解决问题:

  • 将以下内容复制/粘贴到 arangosh 中以注册函数:

var functions = require("org/arangodb/aql/functions"); functions.register("myvisitor::role", function (config, result, vertex, path) { if (result.length === 0) { result.push({found: {}, result: {}}); } var role = path.edges[path.edges.length -1].role; if (role !== undefined && !result[0].found.hasOwnProperty(role)) { result[0].found[role] = true; /* Store in result[0].result whatever you like */ } });

  • 请注意,在 AQL 中,遍历的结果始终是一个数组。所以我们只使用这个数组中的第一个条目来存储一个包含真实信息的文档。

现在您可以从 AQL 使用此访问者:

FOR r IN TRAVERSAL(@@vertices, @@edges, @startId, "inbound", {visitor: "myvisitor::role"}) RETURN r[0].result

或在 GRAPH_TRAVERSAL 中:

FOR r IN GRAPH_TRAVERSAL(@graph, @startId, "inbound", {visitor: "myvisitor::role"}) RETURN r[0].result

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-09-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-11
    • 1970-01-01
    相关资源
    最近更新 更多