[英]Disjoint subgraphs in ArangoDB AQL
給定一個圖形數據庫,我有一個演員 vetices 集合,該集合的邊將其連接到場景頂點集合。
我在創建查詢時遇到問題,我可以在其中選擇所有不相交的子圖,即:給定數據庫中的子圖 A 和 B,沒有邊(出站或入站)將子圖 A 連接到子圖 B。
從這個 AQL:
FOR actor IN actors
FOR v, e, p IN 1..1 ANY actor._id acts_in_scenes
RETURN e
我可以在上傳的圖像中獲得以下圖形結果,我想要的結果是包含不相交子圖形(演員和場景)內的所有頂點的列表列表。 例子用紅色圈起來。
我已經使用子查詢和收集進行了幾次嘗試,我認為到目前為止最好的結果是下面的查詢,但它仍然只是返回我的場景:
FOR actor IN actors
LET sub_result = (FOR v, e, p IN 1..1 ANY actor._id acts_in_scenes RETURN DISTINCT v._id) // this just returns me scenes
FILTER LENGTH(sub_result) > 0
RETURN DISTINCT sub_result
有誰知道這是否可以通過 AQL 查詢解決?
編輯:所以我在圖遍歷子查詢中將深度增加到 5 (1..5) ,現在我可以得到 actor 頂點。 現在的問題是在檢查結果 json 時,我可以看到組上重復的場景鍵,如果這個結果代表不相交的子圖,這應該是不可能的:
FOR actor IN actors
LET sub_result = (
FOR v, e, p IN 1..5 ANY actor._id acts_in_scenes
SORT v._id
RETURN DISTINCT v._id
)
FILTER LENGTH(sub_result) > 0
SORT COUNT(sub_result) DESC
RETURN DISTINCT { 'count': COUNT(sub_result), result: sub_result }
編輯2:
我必須通過使用networkx庫和使用nx.connected_components()函數在應用程序端創建圖形來解決這個問題。 但我真的希望我可以只使用數據庫的圖形功能來解決這個問題,因為它增加了應用程序的復雜性,並要求我在應用程序端的內存中創建一個圖形。
在 ArangoDB v3.7 中,添加了一種新的 Pregel 算法wcc
用於查找弱連接組件:
https://www.arangodb.com/docs/stable/release-notes-new-features37.html#pregel
它允許您預先計算子圖。 在阿朗戈什:
var pregel = require("@arangodb/pregel");
var params = {
"maxGSS": db.actors.count(), /* the number of vertices */
"resultField": "subgraph"
};
var id = pregel.start("wcc", {
vertexCollections:["actors"],
edgeCollections:["acts_in_scenes"]
}, params);
完成后( pregel.status(id).state
等於"done"
),每個pregel.status(id).state
文檔將具有一個數字屬性"subgraph"
,該屬性對於同一子圖的所有頂點都相同。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.