在 ArangoDB 中遍历树时保留第一次出现的值

问题描述 投票:0回答:1

我正在遍历一棵树,并且只想保留每个对象的第一次出现(基于边缘的属性)。这有点像来自食谱中用于建模继承的继承示例(https://github.com/arangodb/docs/blob/2c842774b457114c571abdaa8391a038715d1458/3.3/cookbook/document-inheritance.md)。

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

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

arangodb
1个回答
2
投票

您可以向服务器注册一个自定义的访问者函数,该函数可以被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

© www.soinside.com 2019 - 2024. All rights reserved.