在ArangoDB中遍历树时,首先出现值

时间:2015-11-06 22:18:44

标签: arangodb

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

在我的程序中,我有一个任务树和子任务(无限级别)。从一些任务中,有边指向人。在边缘有一个名为" role"的属性。鉴于我开始在树中远处的任务并向上遍历,我只想保留每个唯一角色(以及具有该角色的人)的第一个(最近的)出现。

这样的事情可以在纯AQL中完成,还是访问者的功能?

1 个答案:

答案 0 :(得分: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