在完成圖資料科學實驗並選定投影和演算法後,接下來就是將其佈署到生產環境。這需要從 Python 物件和 Jupyter Notebook 的實驗環境轉換到生產資料工程的領域。為了支援知識圖譜和圖演算法,通常會將物理伺服器分開,以實作不同工作負載的物理隔離。Neo4j 的主要伺服器負責事務處理和 Cypher 查詢,而次要伺服器則專注於圖演算法的執行,避免與主要伺服器的資源爭搶。次要伺服器的組態可以根據預期工作負載進行調整,例如組態多個 CPU 和高 RAM 以支援快速平行計算。Neo4j 叢集允許根據角色標記伺服器,將工作傳送到最適合的物理伺服器。Neo4j 簡化了混合事務和分析處理(HTAP),無需 ETL 或 OLAP 等複雜的資料工程。此外,因果屏障機制確保了資料的一致性,方便在執行圖演算法前獲得次要伺服器的新鮮度保證。在生產環境中,圖演算法的結果需要以可操作化的方式捕捉,例如使用 mutatewrite 方法更新投影或豐富底層知識圖譜。

生產環境考量

當您對圖資料科學的實驗感到滿意,並選擇了合適的投影和演算法後,就會進入生產階段。在這個階段,您不再處於Python物件和Jupyter Notebook的世界,而是處於生產資料工程的領域。

為了支援知識圖和圖演算法,一個常見的設定是將物理伺服器分開,以提供不同工作負載的物理隔離。Neo4j支援主要和次要伺服器的概念,以實作這一目的。主要伺服器負責事務處理,保持知識圖叢集以實作可擴充套件性和容錯性。它們通常也服務Cypher查詢。從原則上講,主要伺服器也可以執行圖演算法,但這樣做會導致演算法的計算工作負載和正在進行的資料函式庫工作負載之間發生爭端。相反,考慮為資料科學佈署次要例項。次要例項具有較鬆散的時間保證,與主要伺服器相比,它們的更新是非事務性的,無需阻塞事務處理。

次要伺服器的組態

次要伺服器可以與主要伺服器有不同的組態,甚至可以根據預期工作負載進行個別組態。例如,您可以決定主要例項具有大量RAM和高I/O,但CPU較為樸素,因為您打算執行資料函式庫查詢和事務,這些事務很少受到CPU繫結。您的次要例項則可以組態多個快速CPU和高RAM,以啟用快速平行計算使用圖演算法,或支援圖全域性查詢,如圖6-5所示。

Neo4j叢集的基礎設施

Neo4j叢集的基礎設施允許您根據預期角色標記伺服器,以便系統使用者將工作傳送到最適合其需求的物理伺服器。所有這些都是簡單且大多數情況下透明的。

混合事務和分析處理(HTAP)

Neo4j使得為知識圖執行混合事務和分析處理(HTAP)變得非常簡單。它是一個單一叢集,整個叢集中都有一致的資料。沒有需要提取、轉換和載入(ETL)或線上分析處理(OLAP)立方體或其他複雜的資料工程。

因果屏障

但是,將來會有時候您希望在執行圖演算法之前獲得次要伺服器的新鮮度保證。在第3章中,您讀到Neo4j提供了一個可選的因果屏障,這意味著資料函式庫使用者始終可以看到至少自己的寫入,即使伺服器分佈在廣泛的區域網路中。這個因果屏障適用於主要和次要伺服器,以及資料科學和事務工作負載。使用因果屏障很容易,如範例6-6所示。

因果屏障範例

範例6-6展示瞭如何使用因果屏障來確保在次要伺服器上執行圖演算法之前,先進行必要的事務處理。

try (Session session = driver.session(AccessMode.WRITE)) {
    try (Transaction tx = session.beginTransaction()) {
        tx.run("CREATE (user:User {userId: {userId}, passwordHash: {passwordHash}})",
                parameters("userId", userId, "passwordHash", passwordHash));
        tx.success();
    }
    // Bookmark是剛剛提交的事務ID。
    String bookmark = session.lastBookmark();
}

###Bookmark的使用 Bookmark可以用來確保在執行圖演算法之前,先進行必要的事務處理,如範例6-7所示。

try (Transaction tx = session.beginTransaction(bookmark)) {
    tx.run("MATCH (user:User {userId: {userId}}) RETURN *",
            parameters("userId", userId));
    tx.success();
}

知識圖的豐富化

生產資料科學的另一個不同之處在於您如何使用結果。在實驗中,捕捉結果到筆記本(物理或數字)通常是首選。在生產使用中,您需要利用結果來改善系統。

結果的捕捉

回憶一下範例6-5,中心度計算的結果是使用result = gds.betweenness.stream(graph)串流回Python客戶端,並列印到控制檯。如果這些結果很有用,您就希望以可操作化的方式捕捉它們。幸運的是,這是簡單的;您只需將stream方法換成mutate,以更新投影中的結果,或使用write方法,以豐富底層知識圖(無論計算在哪裡執行)。

範例6-8展示瞭如何使用Python API для Graph Data Science計算所有英國鐵路站點的中心度評分。

from graphdatascience import GraphDataScience

host = "bolt://127.0.0.1:7687"
user = "neo4j"
password = "yolo"
gds = GraphDataScience(host, auth=(user, password), database="neo4j")

graph = gds.graph.get("trains")
result = gds.betweenness.write(gds.graph.get("trains"), writeProperty="betweenness")
total_stations = gds.run_cypher("MATCH (s:Station) RETURN count(s) AS total_stations")
print(f'Total number of stations: {total_stations.iloc[0][0]}')

processed_stations = gds.run_cypher("""
    MATCH (s:Station)
    WHERE s.betweenness IS NOT NULL
    RETURN count(s) AS stations_processed
""")

圖表翻譯:

  graph LR
    A[知識圖] --> B[圖演算法]
    B --> C[結果捕捉]
    C --> D[知識圖豐富化]
    D --> E[生產環境]

圖形機器學習

在本章中,您將學習圖形和機器學習的交集。您將看到如何使用機器學習技術自動豐富現有的知識圖,以及如何從知識圖中提取特徵以建立準確的預測模型。

機器學習概覽

機器學習是一個龐大且複雜的研究領域,但在其最抽象的層面上,它關注於從資料中推匯出程式,而知識圖是優秀的資料來源。傳統上,大多數軟體都是為了接受輸入並應用函式以產生輸出資料而設計的。該函式通常是由具有深厚領域知識的開發人員編寫的,並可能需要一支專業團隊來維護。

機器學習顛覆了這些責任。在訓練機器學習模型時,輸入是資料和先前的輸出,而輸出基本上是一個程式。機器學習系統透過從資料中學習來瞭解程式應該做什麼。定期地,模型可能會被重新訓練以確保其輸出保持高品質。

圖形機器學習管道

您可以透過使用圖形機器學習管道來改善連結預測(以及標籤和屬性的預測)。為此,您需要一個合理大小的相關訓練資料集,以便從中提取特徵。

圖形特徵工程

特徵工程是指識別有用資料以訓練機器學習模型的活動。傳統上,這些特徵來自關聯式資料函式庫的欄位,可能被標記為年齡、性別或郵政編碼。

圖形特徵工程涉及從知識圖中識別和提取資料,以便將其整合到機器學習模型中。由於知識圖具有拓撲結構和資料,因此這使您能夠提取比其他方法更高品質的特徵。

實踐

以下是使用Neo4j Graph Data Science函式庫和Python進行圖形機器學習的示例:

from neo4j import GraphDatabase

# 連線到Neo4j資料函式庫
driver = GraphDatabase.driver("bolt://localhost:7687", auth=("neo4j", "password"))

# 執行圖形機器學習演算法
with driver.session() as session:
    result = session.run("CALL gds.alpha.linkprediction.preferentialAttachment('Person', 'Movie', {relationshipQuery: 'ACTED_IN'})")
    print(result)

# 關閉連線
driver.close()

內容解密:

在這個範例中,我們使用Neo4j Graph Data Science函式庫和Python來執行圖形機器學習演算法。首先,我們連線到Neo4j資料函式庫,然後執行圖形機器學習演算法以預測人與電影之間的連結。最後,我們關閉連線。

圖表翻譯:

以下是使用Mermaid語法繪製圖形機器學習管道的示例:

  graph LR
    A[資料] --> B[圖形機器學習]
    B --> C[連結預測]
    C --> D[特徵工程]
    D --> E[機器學習模型]

圖表翻譯:

在這個圖表中,我們展示了圖形機器學習管道的流程。首先,我們有資料作為輸入,然後使用圖形機器學習演算法進行連結預測。接下來,我們進行特徵工程以提取有用的特徵,最後,我們使用這些特徵訓練機器學習模型。

圖解式演算法:根據圖的機器學習

7.1 圖投影與管道宣告

為了建立一個根據圖的機器學習模型,我們首先需要從底層知識圖中建立一個圖投影。這個圖投影將作為後續機器學習任務的基礎。接下來,我們需要宣告管道的存在,以便組態和執行機器學習任務。

7.2 節點屬性與連結特徵

在圖投影中,我們需要為節點新增屬性,這些屬性將根據圖中關係的計算結果而定。然後,我們需要新增連結特徵,以建立節點對的特徵向量。這些特徵向量將用於訓練機器學習模型。

7.3 分割圖資料

為了訓練和測試模型,我們需要將圖資料分割為測試集、訓練集和特徵集。這個過程可以透過指定測試集的比例、訓練集的比例和驗證折數來實作。

7.4 訓練模型與評估

在組態好管道和資料分割後,我們可以開始訓練模型。訓練過程中,我們需要評估模型的品質,以確定是否達到預期的效果。如果模型的效果良好,我們可以將其推播到生產環境中。

範例:推薦互補演員

假設我們有一個電影知識圖,包含演員、電影和演員之間的合作關係。為了推薦互補演員,我們可以建立一個根據圖的機器學習模型。首先,我們需要在知識圖中新增演員之間的合作關係(ACTED_WITH)。然後,我們可以建立一個圖投影,包含演員節點和合作關係。

接下來,我們需要組態管道,新增節點屬性和連結特徵。節點屬性可以透過節點嵌入演算法(如Node2Vec或FastRP)計算得到,連結特徵可以透過餘弦相似度或哈達瑪乘積等演算法計算得到。

最後,我們可以分割圖資料,訓練模型,並評估其效果。如果模型的效果良好,我們可以將其推播到生產環境中,為使用者提供推薦互補演員的服務。

內容解密:

  • 圖投影:從底層知識圖中建立一個圖投影,作為機器學習任務的基礎。
  • 管道宣告:宣告管道的存在,以便組態和執行機器學習任務。
  • 節點屬性:為節點新增屬性,這些屬性將根據圖中關係的計算結果而定。
  • 連結特徵:新增連結特徵,以建立節點對的特徵向量。
  • 分割圖資料:將圖資料分割為測試集、訓練集和特徵集。
  • 訓練模型:訓練模型,並評估其效果。
  graph TD
    A[知識圖] -->|圖投影|> B[圖投影]
    B -->|管道宣告|> C[管道]
    C -->|節點屬性|> D[節點屬性]
    D -->|連結特徵|> E[連結特徵]
    E -->|分割圖資料|> F[分割圖資料]
    F -->|訓練模型|> G[訓練模型]

圖表翻譯:

上述流程圖描述了根據圖的機器學習模型的建立過程。從知識圖中建立圖投影,宣告管道,新增節點屬性和連結特徵,分割圖資料,最後訓練模型並評估其效果。這個過程可以幫助我們建立一個有效的機器學習模型,為使用者提供高品質的服務。

圖形嵌入式機器學習管道組態

為了組態圖形嵌入式機器學習管道,我們需要進行幾個步驟。首先,我們需要選擇一個或多個模型候選項。目前可用的選項包括邏輯迴歸、隨機森林和多層感知器等。

新增模型候選項

我們可以使用如下程式碼新增模型候選項:

CALL gds.beta.pipeline.linkPrediction.addLogisticRegression('actors-pipeline')

這裡,actors-pipeline是管道的名稱。

自動調整模型引數

新增模型候選項後,我們需要對模型進行自動調整。這可以透過如下程式碼實作:

CALL gds.beta.pipeline.linkPrediction.autoTune('actors-pipeline', {maxTrials: 100})

這裡,maxTrials指定了每個模型的最大調整次數。

訓練模型

在進行自動調整後,我們可以開始訓練模型。但在此之前,我們需要檢查訓練所需的記憶體要求。這可以透過如下程式碼實作:

CALL gds.beta.pipeline.linkPrediction.train.estimate('actors-graph', {
  pipeline: 'actors-pipeline',
  modelName: 'actors-model',
  targetRelationshipType: 'ACTED_WITH'
})
YIELD requiredMemory

這裡,requiredMemory傳回了訓練所需的記憶體大小。

執行訓練任務

檢查了記憶體要求後,我們可以開始訓練模型。如下程式碼實作了訓練任務:

CALL gds.beta.pipeline.linkPrediction.train('actors-graph', {
  pipeline: 'actors-pipeline',
  modelName: 'actors-model',
  metrics: ['AUCPR'],
  targetRelationshipType: 'ACTED_WITH',
  randomSeed: 73
})
YIELD modelInfo, modelSelectionStats

這裡,modelInfomodelSelectionStats傳回了訓練過程中的相關資訊。

內容解密:

上述程式碼使用了圖形嵌入式機器學習管道來訓練一個模型。首先,我們增加了邏輯迴歸模型候選項,然後對模型進行了自動調整。接著,我們檢查了訓練所需的記憶體要求,最後執行了訓練任務。

使用訓練好的模型進行預測

訓練好了模型後,我們可以使用它來進行預測。首先,我們需要建立一個輸入圖投影。如下程式碼實作了建立輸入圖投影:

CALL gds.graph.project(
  'actors-input-graph-for-prediction',
  {
    Person: {}
  },
  {
    ACTED_WITH: {
      orientation: 'UNDIRECTED'
    }
  }
)

這裡,actors-input-graph-for-prediction是輸入圖投影的名稱。

圖表翻譯:

下圖示範了建立輸入圖投影的過程:

  flowchart TD
    A[開始] --> B[建立輸入圖投影]
    B --> C[指定圖投影名稱]
    C --> D[指定節點和關係]
    D --> E[完成建立]

這裡,圖表展示了建立輸入圖投影的步驟。

執行預測任務

建立好了輸入圖投影後,我們可以執行預測任務。如下程式碼實作了預測任務:

CALL gds.beta.pipeline.linkPrediction.predict.mutate(
  'actors-input-graph-for-prediction', {
    modelName: 'actors-model',
    relationshipTypes: ['ACTED_WITH'],
    mutateRelationshipType: 'SHOULD_ACT_WITH',
    topN: 20,
    threshold: 0.4
  }
)
YIELD relationshipsWritten, samplingStats

這裡,relationshipsWrittensamplingStats傳回了預測過程中的相關資訊。

內容解密:

上述程式碼使用了訓練好的模型來進行預測。首先,我們建立了一個輸入圖投影,然後執行了預測任務。預測任務會將預測結果寫回輸入圖投影中。

持久化預測結果

最後,我們需要將預測結果持久化到知識圖中。如下程式碼實作了持久化預測結果:

CALL gds.beta.graph.relationships.stream(
  'actors-input-graph-for-prediction', {
    relationshipType: 'SHOULD_ACT_WITH'
  }
)
YIELD relationship
WITH relationship.startNode AS startNode, relationship.endNode AS endNode
MERGE (startNode)-[:SHOULD_ACT_WITH]->(endNode)

這裡,SHOULD_ACT_WITH關係會被持久化到知識圖中。

圖表翻譯:

下圖示範了持久化預測結果的過程:

  flowchart TD
    A[開始] --> B[讀取預測結果]
    B --> C[指定關係型別]
    C --> D[持久化關係]
    D --> E[完成持久化]

這裡,圖表展示了持久化預測結果的步驟。

知識圖譜建構與演算法最佳化

前言

在前面的章節中,我們探討瞭如何建立一個知識圖譜,並使用 Cypher 語言進行查詢。然而,為了使知識圖譜更加完善和高效,往往需要進行一些額外的處理和最佳化。在本章中,我們將介紹如何對知識圖譜進行 normalization 和查詢最佳化。

知識圖譜Normalization

在建立知識圖譜的過程中,可能會出現一些冗餘的關係,例如兩個節點之間存在雙向關係。為了簡化知識圖譜的結構和提高查詢效率,我們可以進行 normalization 處理。以下是 normalization 的 Cypher 程式碼:

MATCH (a:Person)-[:SHOULD_ACT_WITH]->(b:Person)-[d:SHOULD_ACT_WITH]->(a)
WHERE id(a) > id(b)
DELETE d

這段程式碼查詢所有具有雙向 SHOULD_ACT_WITH 關係的節點,並刪除其中一條關係,以避免冗餘。

查詢最佳化

在查詢知識圖譜時,我們可以使用簡單的 Cypher 查詢陳述式來取得推薦結果。以下是查詢程式碼:

MATCH (a:Person)-[:SHOULD_ACT_WITH]->(b:Person)
RETURN a.name, b.name

這段程式碼查詢所有具有 SHOULD_ACT_WITH 關係的節點,並傳回節點的名稱。

結果分析

執行上述查詢程式碼後,我們可以獲得如下的結果:

a.nameb.name
Naomie HarrisEmile Hirsch
Naomie HarrisJohn Goodman
Naomie HarrisSusan Sarandon
Naomie HarrisMatthew Fox
Naomie HarrisChristina Ricci
Danny DeVitoDemi Moore
Danny DeVitoNoah Wyle
Danny DeVitoKevin Pollak

內容解密:

上述結果顯示了各個演員之間的合作關係,例如 Naomie Harris 與 Emile Hirsch、John Goodman 等演員合作過。這些結果可以用於推薦演員之間的合作關係。

圖表翻譯:

下面是使用 Mermaid 語法繪製的演員合作關係圖表:

  graph TD
    A[Naomie Harris] --> B[Emile Hirsch]
    A --> C[John Goodman]
    A --> D[Susan Sarandon]
    A --> E[Matthew Fox]
    A --> F[Christina Ricci]
    G[Danny DeVito] --> H[Demi Moore]
    G --> I[Noah Wyle]
    G --> J[Kevin Pollak]

這個圖表顯示了演員之間的合作關係,例如 Naomie Harris 與 Emile Hirsch、John Goodman 等演員合作過。

圖解機器學習模型最佳化

在圖形機器學習中,模型的最佳化是一個非常重要的步驟。透過最佳化模型,我們可以提高模型的準確度和效率。在這個過程中,我們需要使用不同的技術和工具來實作模型的最佳化。

模型最佳化的步驟

  1. 資料預處理:在開始最佳化模型之前,我們需要對資料進行預處理。這包括了資料清理、轉換和特徵工程等步驟。
  2. 模型選擇:選擇合適的模型是非常重要的。不同的模型有不同的優缺點,需要根據具體問題選擇合適的模型。
  3. 引數調整:模型的引數需要進行調整,以達到最佳的效果。這包括了學習率、批次大小、迭代次數等引數。
  4. 模型評估:評估模型的效能是非常重要的。這包括了準確度、精確度、召回率、F1分數等指標。

外部工具和平臺

在圖形機器學習中,除了使用圖形機器學習框架外,我們還可以使用外部工具和平臺來實作模型的最佳化。這包括了TensorFlow、PyTorch、scikit-learn等框架,以及Google的Vertex AI、Amazon SageMaker、Microsoft的Azure Machine Learning等雲端平臺。

知識圖和特徵向量

知識圖是圖形機器學習中的重要概念。透過知識圖,我們可以將資料轉換為圖形結構,並使用圖形演算法進行分析和最佳化。特徵向量是知識圖中的重要組成部分,透過特徵向量,我們可以將資料轉換為數值向量,並使用機器學習演算法進行分析和最佳化。

內容解密

上述內容介紹了圖解機器學習模型最佳化的基本概念和步驟。透過瞭解這些概念和步驟,我們可以更好地實作模型的最佳化和應用。

  flowchart TD
    A[資料預處理] --> B[模型選擇]
    B --> C[引數調整]
    C --> D[模型評估]
    D --> E[外部工具和平臺]
    E --> F[知識圖和特徵向量]

圖表翻譯

上述流程圖示範了圖解機器學習模型最佳化的基本步驟。從資料預處理到知識圖和特徵向量,每一步驟都非常重要。透過這個流程圖,我們可以更好地瞭解圖解機器學習模型最佳化的過程和方法。

資料對映與中繼資料

在現代企業中,資料散佈在各個角落,格式多樣,品質參差不齊。瞭解資料的存放位置、處理方式和使用者是企業營運的重要組成部分,也是資料治理和自助式資料消費的關鍵。中繼資料知識圖是一種企業級別的資料地圖,記錄了資料的形狀、位置、處理系統和使用者。重要的是,中繼資料知識圖將資料、處理系統和使用者聯絡起來,使得資料的來源和流向清晰可見。

資料管理的挑戰

隨著組織的演變,不同部門實施了各自的應用程式和流程來滿足自己的需求。個別部門可能儲存了一些相同的資訊,因此在不同系統中出現重複或近似重複的資料並不罕見。這些系統通常是在沒有考慮整體知識組織需求的情況下實施的,因為這不是個別部門所擁有的(可能根本沒有明確的所有者)。由於資料處於零碎狀態,難以理解客戶的旅程或太空任務的成功因素。

中繼資料(描述資料的資料)是現代資訊系統管理中的關鍵元素。中繼資料地圖提供了對組織整個資料生態系統的全面視角,允許您跨企業管理資料。因此,中繼資料知識圖是一種非常有用的基礎層,位於您的資訊架構中。高品質的中繼資料確保使用者可以瀏覽龐大、多樣化的資料資產,其品質和新鮮度可變。它幫助資料分析師、資料科學家和機器學習工程師快速存取正確的資料,並可以為稽核和監管目的解釋資料資產的狀態。

但是,管理中繼資料一直是一個重大挑戰。為瞭解決這個挑戰,一些最大的組織正在將其資料匯聚到由玄貓支援的中繼資料中心。

深入剖析知識圖譜在生產環境的應用及圖形機器學習的整合後,我們可以發現,從資料工程到模型最佳化,知識圖譜都扮演著關鍵角色。次要伺服器的組態策略有效地平衡了事務處理與圖形演算法計算之間的資源競爭,而 HTAP 架構則簡化了資料處理流程,避免了繁瑣的 ETL 操作。然而,因果屏障的應用時機及對系統效能的影響仍需謹慎評估。

技術整合方面,Neo4j 與 Python 的協同運作展現了其在圖形機器學習領域的優勢。圖形特徵工程的應用提升了模型訓練的效率和準確性,而模型選擇、引數調整和評估等環節則需根據實際業務需求進行客製化組態。值得注意的是,外部工具和平臺的整合可以進一步擴充套件圖形機器學習的應用範圍,但同時也增加了系統的複雜度和維護成本。

展望未來,圖形機器學習技術將持續推動知識圖譜的發展和應用。隨著模型最佳化技術的進步和更多應用場景的出現,我們預見知識圖譜將在更多領域發揮其獨特的價值,例如更精準的推薦系統、更智慧的風險控制和更有效的知識管理。對於企業而言,構建和應用知識圖譜已不再是技術選項,而是提升核心競爭力的必要策略。玄貓認為,結合圖形機器學習的知識圖譜技術將引領下一波資料智慧的浪潮,值得企業及技術團隊密切關注並積極探索。