在 ArangoDB 中向上遍历树时保持值的第一次出现
Keep first occurence of value when traversing up a tree in ArangoDB
我正在遍历一棵树,并且只想保留每个对象的第一次出现(基于边的属性)。这有点像继承建模手册中的继承示例 (https://docs.arangodb.com/cookbook/ModulDocumentInheritance.html)。
在我的程序中,我有一个任务和子任务树(无限级别)。从一些任务中,有一些边缘指向人。在边上有一个名为 "role" 的属性。鉴于我从树中最底层的任务开始并向上遍历,我只想保留每个独特角色(以及担任该角色的人)的第一个(最近的)出现。
是否可以在纯 AQL 中完成类似的事情,或者访问者函数是否可行?
您可以向服务器注册一个自定义的访问者函数,这可以被AQL 使用。
在你的情况下,这样的事情可以解决问题:
- Copy/Paste下面进入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
我正在遍历一棵树,并且只想保留每个对象的第一次出现(基于边的属性)。这有点像继承建模手册中的继承示例 (https://docs.arangodb.com/cookbook/ModulDocumentInheritance.html)。
在我的程序中,我有一个任务和子任务树(无限级别)。从一些任务中,有一些边缘指向人。在边上有一个名为 "role" 的属性。鉴于我从树中最底层的任务开始并向上遍历,我只想保留每个独特角色(以及担任该角色的人)的第一个(最近的)出现。
是否可以在纯 AQL 中完成类似的事情,或者访问者函数是否可行?
您可以向服务器注册一个自定义的访问者函数,这可以被AQL 使用。 在你的情况下,这样的事情可以解决问题:
- Copy/Paste下面进入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