利用 TigerGraph 圖形資料函式庫的 GSQL 查詢語言,可以有效地實作多重關係產品推薦引擎。此方法的核心在於構建客戶、產品、特徵和上下文之間的關聯圖譜,並透過圖形遍歷演算法計算推薦分數。推薦引擎考量客戶特徵、產品屬性以及上下文資訊,例如天氣、時間等,進行個人化推薦。透過調整 GSQL 查詢中的累加器型別,例如 SumAccumAvgAccum,可以靈活調整評分機制,例如計算總親和度或平均親和度。此外,使用 HeapAccum 結構可以有效地排序和選取推薦結果,提升查詢效能,尤其在處理大量資料時更具優勢。文章提供的程式碼範例詳細展示瞭如何根據特徵和上下文、客戶和上下文進行產品推薦,以及如何取得最高的人口統計屬性。透過圖形化的資料模型和查詢語法,更清晰地展現了多重關係推薦引擎的實作過程。

多重關係推薦引擎實作

TigerGraph 提供了一個入門套件,展示瞭如何利用圖形分析推導客戶產品推薦。該入門套件可以按照第三章的步驟進行安裝。

推薦引擎2.0入門套件

佈署一個新的 TigerGraph Cloud 例項,選擇「推薦引擎2.0(超個人化行銷)」作為入門套件。啟動並按照第三章第50頁「為入門套件載入資料和安裝查詢」一節中的步驟載入資料。

圖形結構

圖7-4展示了該入門套件的圖形結構,包含六種頂點型別和七種邊型別。

圖形結構描述

圖7-4中的圖形結構包含以下頂點型別:

  • Customer(客戶)
  • Demographic(人口統計屬性)
  • History(購買歷史)
  • Product(產品)
  • Feature(特徵)
  • Context(上下文)

這些頂點型別之間的關係透過邊型別來表示,例如客戶與產品之間的購買歷史、客戶與特徵之間的關聯等。

查詢與分析

推薦引擎2.0入門套件包含三個查詢,展示瞭如何利用圖形分析改善推薦引擎。這些查詢允許我們在考慮客戶的上下文和特徵元素的同時選擇排名靠前的產品。

查詢範例

  1. 根據特徵和上下文進行推薦

    • 根據客戶的特徵和當前的上下文(如天氣和時間)傳回前k個推薦產品。
  2. 根據客戶和上下文推薦產品

    • 根據客戶的偏好和當前的上下文(如天氣和時間)推薦最高評分的產品。
  3. 取得最高的人口統計屬性

    • 顯示在其客戶和相關特徵中具有最高平均親和力的人口統計屬性。

程式碼實作

根據特徵和上下文進行推薦的查詢

CREATE QUERY recommend_by_features_and_context(VERTEX<Customer> source_customer, 
STRING weather, STRING time_of_day, INT top_k) FOR GRAPH Recommendation_Engine2_0 {
  // 初始化起始頂點
  start = {source_customer};
  
  // 計算啟用的上下文過濾器數量
  INT min_filters = 0;
  IF time_of_day != "" THEN min_filters = min_filters + 1; END;
  IF weather != "" THEN min_filters = min_filters + 1; END;
  
  // 查詢符合上下文條件的產品
  all_products = SELECT p FROM Product:p;
  filtered_context = SELECT c FROM Context:c;
  IF min_filters != 0 THEN
    filtered_context = SELECT c FROM Context:c 
                        WHERE c.id == weather OR c.id == time_of_day;
    candidate_products = SELECT p 
                         FROM filtered_context:c -(product_context:pc)- Product:p 
                         ACCUM p.@filters += 1 
                         HAVING p.@filters >= min_filters;
  ELSE
    candidate_products = all_products;
  END;
  
  // 計算客戶與產品之間的推薦分數
  recommended_products = SELECT p 
                         FROM start:s -(customer_feature:cf)- Feature:f -(product_feature:pf)- Product:p 
                         ACCUM p.@max_score += cf.affinity * pf.weight;
  
  // 傳回前k個推薦產品
  top_recommended = ORDER BY recommended_products.@max_score DESC LIMIT top_k;
  RETURN top_recommended;
}

#### 內容解密:

此查詢首先初始化起始頂點為輸入的客戶。然後,它計算啟用的上下文過濾器數量。接著,根據上下文條件(如天氣和時間)過濾產品。最後,計算客戶與產品之間的推薦分數,並傳回前k個推薦產品。

圖表翻譯:

  graph LR
    A[Customer] -->|customer_feature|> B[Feature]
    B -->|product_feature|> C[Product]
    C -->|product_context|> D[Context]
    A -->|demographic|> E[Demographic]

圖表翻譯: 此圖表展示了客戶、特徵、產品和上下文之間的關係。客戶透過特徵與產品建立聯絡,產品與上下文條件相關聯。圖中呈現了客戶如何透過特徵偏好與產品建立聯絡,並受到上下文條件的影響。

圖形化推薦引擎的多重關係實作

在前一節中,我們探討瞭如何根據客戶偏好和特定情境條件來推薦產品。在本文中,我們將進一步深入瞭解如何實作一個更為複雜的多重關係推薦引擎。

修改評分機制

在前面的範例中,我們使用 MaxAccum 來累積最高的分數,以找出最重要的特徵並據此進行評分。你可以輕易地透過改變累積器的型別來修改評分機制,例如改用 SumAccum 來計算總親和度,或是使用 AvgAccum 來計算平均親和度。

// 原始的 MaxAccum 定義
MaxAccum @max_score;

// 可以修改為 SumAccum  AvgAccum
SumAccum @total_affinity;
AvgAccum @average_affinity;

根據特徵和情境推薦產品

在原始的查詢中,我們使用了 ORDER BYLIMIT 子句來選取前 top_k 個具有最高推薦分數的產品。

recomm_products = SELECT p
FROM start:s -(customer_feature:cf)- Feature:f -(product_feature:pf)- candidate_products:p
ACCUM p.@max_score += pf.weight * cf.affinity // 計算分數
ORDER BY p.@max_score DESC
LIMIT top_k;

假設我們設定 weather = "GW"time_of_day = "T2",那麼 candidate_products 將會是 {P004, P002}。如果 source_customer = C002,則只有一條路徑連線到 candidate_products,權重為 23。

根據客戶和情境推薦產品

這個查詢傳回滿足情境條件且與客戶偏好特徵最匹配的產品。與前一個查詢相比,這個查詢有幾個有趣的不同之處:

  1. 接受多個情境值:輸入 input_context_set 而非單一的氣象條件或時間條件。
  2. 處理多個客戶:輸入 input_customer_set 而非單一客戶。
  3. 傳回單一產品:由於查詢會視覺化顯示所有連線到客戶和情境頂點的連線,因此傳回多個產品會使視覺化表示變得難以解讀。

定義 Tuple 型別和累積器

TYPEDEF TUPLE<VERTEX<product> v, DOUBLE avg_score> Product_Score_Tuple;
AvgAccum @product_avg_score;
HeapAccum<Product_Score_Tuple>(1, avg_score DESC) @@top_product_heap;
SetAccum<VERTEX<product>> @@top_product_vertex_set;

使用 HeapAccum 來自動排序給定的 Tuple,這是一種更具擴充套件性的方式來取得大量列表中的前 k 個元素。

蒐集頂點和邊以進行視覺化顯示

SetAccum<VERTEX<customer>> @@final_customer_vertex_set;
SetAccum<VERTEX<feature>> @@final_feature_vertex_set;
SetAccum<VERTEX<product>> @@final_product_vertex_set;
SetAccum<VERTEX<context>> @@final_context_vertex_set;
SetAccum<EDGE> @@final_context_feature_edge_set;
SetAccum<EDGE> @@final_product_feature_edge_set;
SetAccum<EDGE> @@final_product_context_edge_set;

圖形路徑搜尋

在 GSQL 中,我們透過搜尋路徑來選取產品頂點,這些產品頂點與客戶頂點分享特徵,並且與輸入的情境頂點相連。

// 搜尋路徑語法選項1:三個單跳路徑
SELECT p
FROM customer_vertex_set:s -(customer_feature:cf)- Feature:f -(product_feature:pf)- p,
     context_vertex_set:c -(context_feature:cf2)- f
WHERE cf.feature_id == cf2.feature_id

// 搜尋路徑語法選項2:一個多跳路徑
SELECT p
FROM customer_vertex_set:s -(customer_feature:cf)- Feature:f -(product_feature:pf)- candidate_products:p,
     context_vertex_set:c -(context_feature:cf2)- Feature:f
ACCUM p.@product_avg_score += pf.weight * cf.affinity

圖表翻譯:

此圖表呈現了從客戶頂點到產品頂點的搜尋路徑,顯示了客戶偏好的特徵如何與產品特徵相匹配,以及情境條件如何影響產品選擇。

實作細節

  1. 平均親和度排序:使用 AvgAccumHeapAccum 來排序產品的平均親和度。
  2. 視覺化顯示:蒐集相關的頂點和邊,以視覺化顯示推薦結果的依據。
  3. 多客戶和多情境支援:查詢支援多個輸入客戶和情境條件,使其更具通用性。

效能考量

  1. 使用 HeapAccum:在處理大量資料時,HeapAccumORDER BYLIMIT 更具擴充套件性。
  2. 路徑搜尋最佳化:GSQL 的圖查詢語言允許靈活的路徑搜尋語法,可以根據需求選擇最優的搜尋路徑。

實作多重關係推薦引擎

圖形資料函式庫查詢語言的強大功能

在現代的推薦系統中,利用圖形資料函式庫(Graph Database)進行複雜關係的建模和分析已經成為了一種趨勢。透過圖形資料函式庫查詢語言(GSQL),我們能夠高效地實作根據多重關係的推薦引擎。本章節將探討如何利用GSQL查詢語言來實作一個多重關係推薦引擎,並對其背後的技術原理進行詳細解析。

多重關係推薦引擎的實作

在我們的案例中,我們構建了一個推薦系統,該系統能夠根據客戶(Customer)和上下文(Context)資訊推薦產品(Product)。這個過程涉及多個實體之間的複雜關係,包括客戶特徵(Customer Feature)、產品特徵(Product Feature)以及產品上下文(Product Context)。

查詢實作:根據客戶和上下文推薦產品

// 定義查詢:根據客戶和上下文推薦產品
CREATE QUERY recomm_by_customer_and_context (SET<VERTEX<Customer>> customers, SET<VERTEX<Context>> contexts) FOR GRAPH referral_network {
  // 初始化累加器
  AvgAccum<DOUBLE> @product_avg_score;
  HeapAccum<Order_Product_Tuple>(1, score DESC) @@order_product_heap;

  // 遍歷客戶、特徵、產品和上下文的路徑
  customer_vertex_set = SELECT c FROM customers:c;

  product_vertex_set = SELECT p
  FROM customer_vertex_set:c -(customer_feature:cf)- feature:f
  -(product_feature:pf)- product:p
  -(product_context:pctx)- context_vertex_set:ctx
  // 計算每個產品的平均評分
  ACCUM p.@product_avg_score += (cf.affinity * pf.weight)
  // 將產品及其評分加入堆積積排序
  POST-ACCUM @@order_product_heap += Order_Product_Tuple(p, p.@product_avg_score);

  // 取得最高評分的產品
  product_vertex_set = SELECT p
  FROM customer_vertex_set:c -(customer_feature:cf)- Feature:f
  -(product_feature:pf)- product_vertex_set:p
  -(product_context:pctx)- context_vertex_set:ctx
  // 蒐集需要顯示的頂點和邊
  ACCUM @@final_context_feature_edge_set += cf,
  @@final_product_feature_edge_set += pf,
  @@final_product_context_edge_set += pctx
  POST-ACCUM @@final_customer_vertex_set += c
  POST-ACCUM @@final_feature_vertex_set += f
  POST-ACCUM @@final_product_vertex_set += p
  POST-ACCUM @@final_context_vertex_set += ctx;
}

#### 內容解密:

此查詢首先初始化了兩個累加器:@product_avg_score用於計算每個產品的平均評分,@@order_product_heap用於儲存和排序產品評分。接著,查詢遍歷客戶、特徵、產品和上下文之間的路徑,計算每個產品的平均評分並將其加入堆積積排序。最後,查詢蒐集需要顯示的頂點和邊,以便於圖形化展示推薦結果。

取得最高平均親和力的客戶群體

另一個重要的查詢是display_top_demographic,它能夠找出具有最高平均親和力(Affinity)的客戶群體(Demographic),並顯示與其相關的客戶和特徵。

查詢實作:取得最高平均親和力的客戶群體

// 定義查詢:取得最高平均親和力的客戶群體
CREATE QUERY display_top_demographic() FOR GRAPH referral_network {
  // 定義資料型別和累加器
  TYPEDEF TUPLE<VERTEX<demographic> v, DOUBLE score> Top_Demographic_Tuple;
  AvgAccum<DOUBLE> @demographic_avg_score;
  HeapAccum<Demographic_Score_Tuple>(1, score DESC) @@top_product_heap;
  SetAccum<VERTEX<Demographic>> @@top_demographic_vertex_set;

  // 遍歷客戶群體、特徵和客戶的路徑
  demographic_vertex_set = SELECT d
  FROM Demographic:d -(demo_feature:df)- Feature:f
  -(customer_feature:cf)- Customer:c
  // 計算每個客戶群體的平均親和力
  ACCUM d.@demographic_avg_score += (cf.affinity * df.affinity)
  // 將客戶群體及其平均親和力加入堆積積排序
  POST-ACCUM @@top_product_heap += Demographic_Score_Tuple(d, d.@demographic_avg_score);

  // 將堆積積中的客戶群體轉換為頂點集合
  WHILE (@@top_product_heap.size() > 0) DO
    @@top_demographic_vertex_set += @@top_product_heap.pop().v;
  END;
  demographic_vertex_set = { @@top_demographic_vertex_set };

  // 蒐集需要顯示的頂點和邊
  demographic_vertex_set = SELECT d
  FROM demographic_vertex_set:d -(demo_customer:dc)- customer:c,
  demographic_vertex_set:d -(demo_feature:df)- feature:f,
  customer:c -(customer_feature:cf)- feature:f
  ACCUM @@final_demo_customer_edge_set += dc,
  @@final_demo_feature_edge_set += df,
  @@final_context_feature_edge_set += cf
  POST-ACCUM @@final_demographic_vertex_set += d
  POST-ACCUM @@final_customer_vertex_set += c
  POST-ACCUM @@final_feature_vertex_set += f;
}

#### 內容解密:

此查詢首先定義了必要的資料型別和累加器,接著遍歷客戶群體、特徵和客戶之間的路徑,計算每個客戶群體的平均親和力並將其加入堆積積排序。然後,查詢將堆積積中的客戶群體轉換為頂點集合,並蒐集需要顯示的頂點和邊,以便於圖形化展示結果。

未來,我們可以進一步最佳化推薦引擎的效能和準確性,例如引入更多的資料來源、採用更先進的演算法模型等。同時,我們也可以探索將圖形資料函式庫技術應用於其他領域,如社交網路分析、金融風險控制等。

圖表翻譯:

此圖表展示了客戶、特徵、產品和上下文之間的關係路徑。透過遍歷這些路徑,我們能夠計算出每個產品的平均評分,並根據客戶和上下文資訊推薦最合適的產品。

  graph LR
    A[客戶] -->|客戶特徵|> B[特徵]
    B -->|產品特徵|> C[產品]
    C -->|產品上下文|> D[上下文]
    style A fill:#f9f,stroke:#333,stroke-width:4px
    style B fill:#f9f,stroke:#333,stroke-width:4px
    style C fill:#f9f,stroke:#333,stroke-width:4px
    style D fill:#f9f,stroke:#333,stroke-width:4px

圖表翻譯:

此圖表展示了客戶、特徵、產品和上下文之間的關係路徑。透過遍歷這些路徑,我們能夠計算出每個產品的平均評分,並根據客戶和上下文資訊推薦最合適的產品。圖中每個節點代表一個實體,邊代表實體之間的關係。透過這種圖形化的表示,我們能夠更直觀地理解推薦系統的工作原理。