簡體   English   中英

ArangoDB AQL 中的不相交子圖

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM