2015-11-06 79 views
1

我遍歷一棵樹,並且只想保留每個對象的第一次出現(基於邊的屬性)。它有點像繼承模擬繼承的例子(https://docs.arangodb.com/cookbook/ModulDocumentInheritance.html)。在ArangoDB中遍歷一棵樹時保持第一個值的出現

在我的程序中,我有一個任務和子任務(無限級別)的樹。從一些任務有邊緣指向人。在邊緣有一個叫做「角色」的屬性。鑑於我從樹中的任務開始向上遍歷,我只想保留每個獨特角色(以及具有該角色的人)的第一個(最近的)發生。

像這樣的事情可以在純AQL中完成,或者是一個訪問者功能的方式嗎?

+0

沒有答案fullfill您的需求?如果沒有,缺少什麼?如果,你能否接受它? – dothebart

+1

這只是我沒有得到正確的測試。這就是爲什麼我沒有把它標記爲完整的原因。 – specimen

回答

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