Spanner Graph 演算法目錄

Spanner Graph 與 Google 研究 Graph Mining 密切合作,提供一系列演算法,可滿足下列用途的圖形分析需求:

中心度

中心度演算法會根據節點在圖表中的結構重要性進行排名。 有助於識別金融科技中的詐欺帳戶、社交關係圖中的網紅、電信網路中的重要路由器等。

PageRank

PageRank 依重要性為節點評分。如果許多其他重要節點都連結至某個節點,該節點就會被視為更重要。演算法會模擬圖形中的隨機漫步。如果節點在這次走訪中較常被造訪,就會被視為較重要。如要瞭解演算法詳情,請參閱網頁排名

函式簽章

PageRank(input_parameters) YIELD node, score

輸入參數

所有常見輸入參數,以及:

名稱 類型 必填 預設 說明
source_nodes 圖表節點陣列 (無) 如有,則為個人化 PageRank 的來源。
damping_factor 雙精度值 0.85 在任何疊代中,演算法選擇遍歷目前節點其中一個外向邊的機率。必須介於 [0, 1) 的範圍之間。
max_iterations 整數 10 演算法的疊代次數上限。必須為正數。 疊代次數越多,結果越精確,但執行時間會較長。
approx_precision 雙精度值 1e-2 演算法的近似精確度閾值。不得為負數。值越小,結果越精確,但執行時間會越長。

輸出

函式會產生:

名稱 類型 說明
節點 GRAPH_ELEMENT (節點) 圖表中的節點。
分數 FLOAT64 節點的 PageRank 分數。

範例

EXPORT DATA OPTIONS (
  uri = "gs://my-bucket-name/my-output.csv",
  format = "csv"
) AS
GRAPH FinGraph
CALL PageRank(
    node_labels => ['Account'], edge_labels => ['Transfers'],
    source_nodes => ARRAY {
                      MATCH (n:Account {id:7})
                      RETURN n
                    }
  ) YIELD node, score
RETURN node.id, score;

BetweennessCentrality

BetweennessCentrality 測量節點位於其他節點配對之間最短路徑的頻率。中間度中心性高的節點通常是連接圖形不同部分的關鍵橋樑。如需演算法詳細資料,請參閱中介中心性

函式簽章

BetweennessCentrality(input_parameters) YIELD node, centrality

輸入參數

所有常見輸入參數和:

名稱 類型 必填 預設 說明
num_source_nodes INT64 (無) 如果設定此值,則必須為正數,並指定演算法應選取多少來源節點,以計算近似中間度中心性。如未設定,或設定為大於圖中節點數的數字,則所有節點都會做為來源節點,也就是演算法會計算確切的中介中心度。值越高,近似值越準確,但執行時間也越長。

輸出

函式會產生:

名稱 類型 說明
節點 GRAPH_ELEMENT (節點) 圖表中的節點。
中心性 FLOAT64 節點的中心度分數。

範例

EXPORT DATA OPTIONS (
  uri = "gs://my-bucket-name/my-output.csv",
  format = "csv"
) AS
GRAPH FinGraph
CALL BetweennessCentrality(
    node_labels => ['Account'], edge_labels => ['Transfers'], num_source_nodes => 5
  ) YIELD node, centrality
RETURN node.id, centrality;

ClosenessCentrality

ClosenessCentrality 衡量節點與圖中所有其他節點的距離。節點的緊密中心度越高,就能透過較短的路徑連線至其他節點。如要瞭解演算法詳情,請參閱緊密度中心性

函式簽章

ClosenessCentrality(input_parameters) YIELD node, centrality

輸入參數

所有常見輸入參數和:

名稱 類型 必填 預設 說明
模式 STRING EXACT 演算法模式。支援的值為 EXACTHYBRID
use_wasserman_faust BOOL FALSE 如果為 `false`,則計算標準接近中心度。如果是 `true`,則計算 Wasserman-Faust 緊密中心度。
epsilon FLOAT64 0.1 僅適用於 `HYBRID` 演算法。必須介於 (0.0, 1.0) 範圍之間。 值越小,通常代表精確度越高。值越大,演算法的執行速度通常就越快。
sample_size INT64 0 僅適用於 `HYBRID` 演算法。用於大約計算中心性值的樞紐節點數量。不得為負值。 如果未設定或設為零,系統會使用 min(100 * ln(N), N) 的預設值,其中 N 是輸入圖形的節點計數。

輸出

函式會產生:

名稱 類型 說明
節點 GRAPH_ELEMENT (節點) 圖表中的節點。
中心性 FLOAT64 節點的緊密中心度分數。

範例

EXPORT DATA OPTIONS (
  uri = "gs://my-bucket-name/my-output.csv",
  format = "csv"
) AS
GRAPH FinGraph
CALL ClosenessCentrality(
    node_labels => ['Account'], edge_labels => ['Transfers'],
    mode => 'EXACT'
  ) YIELD node, centrality
RETURN node.id, centrality;

分群

叢集演算法會將節點分組為叢集 (也稱為社群),讓每個叢集內的節點彼此間的連結密度,高於與其他叢集內節點的連結密度。這項技術有助於偵測金融科技領域的潛在詐欺集團、識別零售業的顧客區隔等等。

WeaklyConnectedComponents

WeaklyConnectedComponents 會找出不相交的節點集,讓集合中的每個節點都能從同一集合中的任何其他節點連線,但無法從其他集合中的節點連線。如需演算法詳細資料,請參閱連線元件

函式簽章

WeaklyConnectedComponents(input_parameters) YIELD node, cluster

輸入參數

所有常見的輸入參數

輸出

函式會產生:

名稱 類型 說明
節點 GRAPH_ELEMENT (節點) 圖表中的節點。
叢集 INT64 節點所屬的已連線元件/叢集 ID。 範圍為 [0, N),其中 N 是圖表中的節點數。

範例

EXPORT DATA OPTIONS (
  uri = "gs://my-bucket-name/wcc-output.csv",
  format = "csv"
) AS
GRAPH FinGraph
CALL WeaklyConnectedComponents(
    node_labels => ['Account'], edge_labels => ['Transfers']
  ) YIELD node, cluster
RETURN node.id, cluster;

ModularityClustering

ModularityClustering 會將圖表劃分為多個叢集,並盡量提高模組化程度。模組化程度是叢集內連結密度與隨機網路預期連結密度的比較結果,可做為品質指標。如要瞭解演算法詳情,請參閱模組化叢集

函式簽章

ModularityClustering(input_parameters) YIELD node, cluster

輸入參數

所有常見輸入參數,以及:

名稱 類型 必填 預設 說明
解決方式 雙精度值 1.0 控制叢集化的精細程度。必須為有限值且不得為負數。解析度值越小,叢集越大。 一般值介於 [0.5, 5] 之間。如果解析度為零,演算法 (經過足夠的疊代次數) 會找出圖譜的連通元件 (忽略權重為零的邊緣)。
max_iterations 整數 10 演算法外部疊代次數上限。必須為正數。 值越大,叢集品質通常越高,但執行時間會較長。
max_inner_iterations 整數 10 演算法的內部疊代次數上限。必須為正數。 值越大,叢集品質通常越高,但執行時間會較長。

輸出

函式會產生:

名稱 類型 說明
節點 GRAPH_ELEMENT (節點) 圖表中的節點。
叢集 INT64 節點所屬社群/叢集的 ID。 範圍為 [0, N),其中 N 是圖表中的節點數。

範例

EXPORT DATA OPTIONS (
  uri = "gs://my-bucket-name/modularity-output.csv",
  format = "csv"
) AS
GRAPH FinGraph
CALL ModularityClustering(
    node_labels => ['Account'], edge_labels => ['Transfers'],
    resolution => 1.0, max_iterations => 10
  ) YIELD node, cluster
RETURN node.id, cluster;

CorrelationClustering

CorrelationClustering 根據節點的成對相似度或不相似度分割節點,目標是將相似節點分在同一組,同時分隔不相似的節點。如要瞭解演算法詳情,請參閱相關性分群

函式簽章

CorrelationClustering(input_parameters) YIELD node, cluster

輸入參數

所有常見輸入參數,以及:

名稱 類型 必填 預設 說明
解決方式 雙精度值 (無) 控制叢集化的精細程度。必須由用戶端明確定義。必須為有限的非負數。值越小,叢集越大。如果解析度為零,且所有邊緣權重都是正數,演算法 (經過足夠的疊代次數) 會找出圖表的連線元件。
max_iterations 整數 10 演算法外部疊代次數上限。必須為正數。 值越大,叢集品質通常越高,但執行時間會較長。
max_inner_iterations 整數 10 演算法的內部疊代次數上限。必須為正數。 值越大,叢集品質通常越高,但執行時間會較長。

輸出

函式會產生:

名稱 類型 說明
節點 GRAPH_ELEMENT (節點) 圖表中的節點。
叢集 INT64 節點所屬社群/叢集的 ID。 範圍為 [0, N),其中 N 是圖表中的節點數。

範例

EXPORT DATA OPTIONS (
  uri = "gs://my-bucket-name/correlation-output.csv",
  format = "csv"
) AS
GRAPH FinGraph
CALL CorrelationClustering(
    node_labels => ['Account'], edge_labels => ['Transfers'],
    resolution => 0.5
  ) YIELD node, cluster
RETURN node.id, cluster;

LabelPropagation

LabelPropagation 會使用標籤傳播技術,將節點指派給叢集,從初始標記開始,這項標記可能會使用輸入內容中提供的種子標籤。節點會反覆採用多數鄰近節點共用的標籤,因此緊密連結的群組會收斂至共識標籤,形成社群。如要瞭解演算法詳情,請參閱標籤傳播

函式簽章

LabelPropagation(input_parameters) YIELD node, cluster

輸入參數

所有常見輸入參數和:

名稱 類型 必填 預設 說明
seed_label_property 字串 (無) 種子標籤的節點屬性名稱。
max_iterations 整數 10 演算法執行的標籤傳播疊代次數上限。必須是有限的正數。

輸出

函式會產生:

名稱 類型 說明
節點 GRAPH_ELEMENT (節點) 圖表中的節點。
叢集 INT64 節點的傳播叢集/標籤 ID。

範例

EXPORT DATA OPTIONS (
  uri = "gs://my-bucket-name/lp-output.csv",
  format = "csv"
) AS
GRAPH FinGraph
CALL LabelPropagation(
    node_labels => ['Account'], edge_labels => ['Transfers'],
    max_iterations => 10
  ) YIELD node, cluster
RETURN node.id, cluster;

CliqueFinding

CliqueFinding 識別出符合最低密度門檻的潛在重疊密集社群,確保每個集團 (節點群組,其中每個節點都連線至其他節點) 至少包含在一個叢集中。如要瞭解演算法詳細資料,請參閱「集團匯總器」。

函式簽章

CliqueFinding(input_parameters) YIELD node, clique

注意:與大多數演算法不同,同一個節點可能有多個資料列,因為節點可能屬於多個集團。

輸入參數

所有常見輸入參數,以及:

名稱 類型 必填 預設 說明
min_density 雙精度值 0.9 要傳回的叢集密度下限。必須介於 [0, 1] 之間。

輸出

函式會產生:

名稱 類型 說明
節點 GRAPH_ELEMENT (節點) 圖表中的節點。
團塊 INT64 節點所屬的集團 ID。

範例

EXPORT DATA OPTIONS (
  uri = "gs://my-bucket-name/clique-output.csv",
  format = "csv"
) AS
GRAPH FinGraph
CALL CliqueFinding(
    node_labels => ['Account'], edge_labels => ['Transfers'],
    min_density => 0.9
  ) YIELD node, clique
RETURN node.id, clique;

相似度

相似度演算法會根據節點鄰域的結構,量化節點配對的相似程度。這項功能有助於推斷節點之間缺少的邊緣,以進行實體解析、推薦等作業。

Spanner Graph 支援下列成對節點相似度,其中相似度分數是根據節點的鄰域計算而得。

  • JaccardSimilarity:根據共同鄰點與鄰點總數的比率
  • CosineSimilarity:根據共同鄰居的邊緣權重
  • CommonNeighborsSimilarity:根據共用鄰居人數
  • TotalNeighborsSimilarity:根據至少一個節點的鄰居數量

如需演算法詳細資料,請參閱成對節點相似度

這四個演算法共用相同的引數和輸出結構。

函式簽章

[JaccardSimilarity|CosineSimilarity|CommonNeighborsSimilarity|TotalNeighborsSimilarity](input_parameters) YIELD source_node, target_node, similarity

輸入參數

所有常見輸入參數,以及:

名稱 類型 必填 預設 說明
source_nodes 節點陣列 不適用
target_nodes 節點陣列 不適用

輸出

函式會產生:

名稱 類型 說明
source_node GRAPH_ELEMENT (節點) 用於相似度計算的來源節點。
target_node GRAPH_ELEMENT (節點) 用於相似度計算的目標節點。
相似度 FLOAT64 來源和目標節點之間計算出的相似度分數。

範例

EXPORT DATA OPTIONS (
  uri = "gs://my-bucket-name/jaccard-output.csv",
  format = "csv"
) AS
GRAPH FinGraph
CALL JaccardSimilarity(
    source_nodes => ARRAY {
                      MATCH (n:Account {id: 7})
                      RETURN n
                    },
    target_nodes => ARRAY {
                      MATCH (n:Account)
                      WHERE n.id != 7
                      RETURN n
                    }
  ) YIELD source_node, target_node, similarity
RETURN source_node.id AS source_id, target_node.id AS target_id, similarity;

路徑尋找

路徑搜尋演算法會計算節點間的最佳路徑。這項功能有助於找出供應鏈中最便宜的路徑、評估網路安全漏洞等。

ShortestPath

ShortestPath 會計算一組指定來源節點與一組指定目標節點之間的最短路徑。如需演算法詳細資料,請參閱多對多最短路徑

函式簽章

ShortestPath(input_parameters) YIELD source_node, target_node, path, cost

輸入參數

所有常見輸入參數,以及:

名稱 類型 必填 預設 說明
source_nodes 節點陣列 不適用
target_nodes 節點陣列 不適用

輸出

函式會產生:

名稱 類型 說明
source_node GRAPH_ELEMENT (節點) 路徑的來源節點。
target_node GRAPH_ELEMENT (節點) 路徑的目標節點。
路徑 GRAPH_PATH 已找到最短路徑。
費用 FLOAT64 最短路徑的費用。

範例

EXPORT DATA OPTIONS (
  uri = "gs://my-bucket-name/shortest-path-output.csv",
  format = "csv"
) AS
GRAPH FinGraph
CALL ShortestPath(
    source_nodes => ARRAY {
                      MATCH (n:Account {id: 7})
                      RETURN n
                    },
    target_nodes => ARRAY {
                      MATCH (n:Account {id: 16})
                      RETURN n
                    }
  ) YIELD source_node, target_node, path, cost
RETURN source_node.id AS source_id, target_node.id AS target_id, PATH_LENGTH(path) AS length, cost;

後續步驟