知識圖譜作為資料整合的關鍵元件,能有效串聯不同來源的資料,提供更全面的資訊視角。本文將探討如何利用 Neo4j 圖資料函式庫及其生態系統中的工具,如 APOC、GraphQL、Kafka 和 Spark,將知識圖譜整合至現有資訊系統,並透過實際案例與程式碼說明資料虛擬化、API 整合、串流處理等關鍵技術。隨著資料量的增長和資料複雜度的提升,知識圖譜的整合能力將成為企業資料架構的核心支柱,有效提升資料的價值和應用範圍。

資料架構

資料架構是一種通用、組織範圍的資料存取層,提供了對底層系統中資料的連線檢視。資料架構抽象了資料存取的細節,允許使用者透明地存取資料。當支援知識圖時,資料架構提供了一個企業範圍的索引,讓相關資料可以被消費為一個可靠的主資料層,具有重要實體的金色記錄,例如客戶、產品和事件。

知識圖的角色

知識圖在資料架構中的角色是提供一個複雜的索引,來整合跨多個資料函式庫的資料。它可以作為一個入口點,當客戶端應用程式或使用者請求資料時,知識圖可以跟隨關係到葉節點,然後重定向到其他系統中的記錄。

整合選擇

有多種方法可以將知識圖整合到您的資料架構中,包括:

  • 客戶端資料函式庫驅動程式
  • 自訂函式和程式
  • API
  • 串流中介軟體
  • ETL工具

資料整合優勢

使用知識圖進行資料整合有多個優勢,包括:

  • 提高資料品質和正確性
  • 增強跨企業的互操作性
  • 提供一個企業範圍的索引
  • 支援多樣化的資料模型
  • 提供一個彈性的資料整合解決方案

資料函式庫驅動程式

資料函式庫驅動程式是整合知識圖譜與應用程式的常見方法。驅動程式是一種客戶端中介軟體,位於應用程式程式碼下方,負責向知識圖譜傳送網路請求,實作兩者之間的整合。

事實上,您已經在本章中看到過驅動程式的運作。回顧第 3 章和第 4 章,您看到多個使用 Cypher 查詢語言與 Neo4j Browser 工具互動的範例。Neo4j Browser 提供了一個 REPL(讀取-評估-列印迴圈)主控臺,允許您輸入 Cypher 查詢陳述式並由 Neo4j 評估。

雖然看起來像是 Browser 直接連線到資料函式庫,但實際上有一個連線字串,Browser 使用此字串建立一個 Neo4j 驅動程式例項,透過網路(即使是本地網路介面)與 Neo4j 伺服器進行通訊,後者負責裝載知識圖譜。Neo4j 驅動程式實作了知識圖譜與其消費系統(包括人類使用者)之間的客戶端-伺服器架構,如圖 5-2 所示。

Neo4j 驅動程式

Neo4j 提供了多種語言驅動程式,適用於常見的程式語言和框架:

  • Java
  • Spring Framework 和 Object-Graph Mapper (Java) *.NET
  • JavaScript
  • Python
  • Go

此外,還有許多由開發者維護的驅動程式:

  • Ruby
  • PHP
  • Erlang/Elixir
  • Perl
  • C/C++
  • Clojure
  • Haskell
  • R
  • Py2Neo Object-Graph Mapper (Python)

您可以根據自己的語言和平臺偏好選擇合適的驅動程式。每個驅動程式都提供相同的功能:連線您的應用程式程式碼到 Neo4j(包括 Neo4j 伺服器叢集和 AuraDB 雲端服務),透過 Bolt 協定或 HTTP。

使用 Neo4j 驅動程式

最好的方式是透過範例來瞭解如何使用 Neo4j 驅動程式與知識圖譜進行互動。範例 5-1 顯示了一個使用 Neo4j Java 驅動程式的典型範例(其他語言遵循類別似的模式)。

import org.neo4j.driver.AuthTokens;
import org.neo4j.driver.Driver;
import org.neo4j.driver.GraphDatabase;
import org.neo4j.driver.Result;
import org.neo4j.driver.Session;
import static org.neo4j.driver.Values.parameters;

public class JavaDriverExample implements AutoCloseable {
    // Driver 例項很昂貴,您通常只需要一個例項。
    private final Driver driver;

    public JavaDriverExample(String uri, String user, String password) {
        // 1. Driver 物件很昂貴。
        driver = GraphDatabase.driver(uri, AuthTokens.basic(user, password));
    }

    @Override
    public void close() {
        driver.close();
    }

    public Result findFriends(final String name) {
        // 2. Session 物件很便宜,您可以根據需要使用它們。
        try (Session session = driver.session()) {
            // 3. 告訴驅動程式查詢是否更新圖形(或不更新),這有助於在叢集中做出良好的路由決策。
            // Session#writeTransaction 也可用。
            return session.readTransaction(tx -> {
                Result result = tx.run("MATCH (a:Person)-[:FRIEND]->(b:Person) " +
                        "WHERE a.name = $name " + // 4. 引數很好。
                        "RETURN b.name",
                        parameters("name", name));
                return result;
            });
        }
    }

    public static void main(String... args) throws Exception {
        //...
    }
}

這個範例展示瞭如何使用 Neo4j Java 驅動程式連線到 Neo4j 伺服器,執行查詢並傳回結果。其他語言的驅動程式也會遵循類別似的模式。

瞭解Neo4j驅動程式和圖聯邦的重要性

在使用Neo4j驅動程式時,有幾點需要注意。首先,驅動程式物件的建立是昂貴的,因此應該盡量減少建立新的驅動程式物件。其次,會話物件是輕量級的,可以使用非同步API來平滑處理。第三,需要告知接收伺服器查詢是否為唯讀或讀寫,以便伺服器可以做出更好的路由決策。最後,所有查詢都應該被引數化,以提高效率和安全性。

使用Neo4j驅動程式的最佳實踐

以下是使用Neo4j驅動程式的最佳實踐:

  1. 減少驅動程式物件的建立:驅動程式物件的建立是昂貴的,因此應該盡量減少建立新的驅動程式物件。
  2. 使用會話物件:會話物件是輕量級的,可以使用非同步API來平滑處理。
  3. 告知接收伺服器查詢型別:需要告知接收伺服器查詢是否為唯讀或讀寫,以便伺服器可以做出更好的路由決策。
  4. 引數化查詢:所有查詢都應該被引數化,以提高效率和安全性。

圖聯邦和複合資料函式庫

Neo4j提供了圖聯邦和複合資料函式庫的功能,允許您將多個圖資料函式庫整合成一個單一的虛擬資料函式庫。這個功能可以讓您從多個資料源中檢索資料,而不需要物理地合併資料函式庫。

建立複合資料函式庫

以下是建立複合資料函式庫的步驟:

  1. 建立別名:建立別名以參照不同的資料函式庫。
  2. 建立複合資料函式庫:建立一個複合資料函式庫,以整合多個圖資料函式庫。
  3. 執行查詢:執行查詢以從複合資料函式庫中檢索資料。

圖聯邦查詢

以下是圖聯邦查詢的範例:

UNWIND ['globalsales.apac', 'globalsales.emea'] AS g
CALL {
  USE graph.byName(g)
  MATCH (c:Customer)-[:PURCHASED]->()-[o:ORDERS]->(:Product)
  WITH c, sum(o.quantity * o.unitPrice) AS totalOrdered
  WHERE totalOrdered > 100000
}
RETURN name, country, totalOrdered

這個查詢可以從多個圖資料函式庫中檢索資料,並傳回符合條件的客戶列表。

整合知識圖與資訊系統

知識圖(Knowledge Graph)是一種強大的工具,能夠將不同來源的資料整合在一起,提供更豐富的資訊。然而,知識圖通常需要與其他系統進行整合,以便能夠存取更多的資料。這篇文章將介紹如何使用Neo4j和APOC(Awesome Procedures On Cypher)來整合知識圖與其他資訊系統。

使用APOC存取SQL資料函式庫

APOC是一個Neo4j的函式庫,提供了許多有用的函式和程式,可以用來存取和操作資料。其中一個重要的功能是可以存取SQL資料函式庫。以下是使用APOC存取SQL資料函式庫的範例:

CALL apoc.load.driver("com.mysql.jdbc.Driver");
WITH "select firstname, lastname from employees where firstname like? and lastname like?" AS sql
CALL apoc.load.jdbcParams("northwind", sql, ['F%', '%w'])
YIELD row
MATCH (row)-[:WORKS_FOR*1..3]->(boss:Person)
RETURN (boss)

這個範例使用APOC的apoc.load.driver函式來載入MySQL的驅動程式,然後使用apoc.load.jdbcParams函式來存取northwind資料函式庫。這個函式會執行一個SQL查詢,然後傳回結果給Cypher。

使用APOC存取MongoDB

APOC也可以用來存取MongoDB。以下是使用APOC存取MongoDB的範例:

CALL apoc.mongodb.find('mongodb://mongo:neo4j@mongo:27017', 'results', '2022-02-22-wetlab', {`status`: "failed"}, null, null)
YIELD failed_experiments
MATCH (:Experiment { id, failed_experiments.id})-[*1..2]->(environmental_factors)

這個範例使用APOC的apoc.mongodb.find函式來存取MongoDB,然後傳回結果給Cypher。

使用APOC存取JSON Web API

APOC也可以用來存取JSON Web API。以下是使用APOC存取JSON Web API的範例:

CALL apoc.load.json("https://example.com/api/data")
YIELD value
MATCH (n:Node { id: value.id })
RETURN n

這個範例使用APOC的apoc.load.json函式來存取JSON Web API,然後傳回結果給Cypher。

資料虛擬化與 Neo4j APOC

資料虛擬化是一種技術,允許您將不同來源的資料整合成一個統一的檢視,無需物理地將資料移至一個單一的儲存位置。Neo4j APOC 是一個強大的工具,提供了資料虛擬化的功能,讓您可以輕鬆地整合不同來源的資料。

資料虛擬化的優點

資料虛擬化有以下優點:

  • 減少資料冗餘:不需要複製資料到多個位置,減少資料冗餘和不一致性。
  • 提高資料可用性:提供一個統一的檢視,讓使用者可以輕鬆地存取和查詢不同的資料來源。
  • 提高資料安全性:不需要將敏感資料複製到多個位置,減少資料洩露的風險。

Neo4j APOC 的功能

Neo4j APOC 提供了以下功能:

  • 資料虛擬化:允許您將不同來源的資料整合成一個統一的檢視。
  • SQL 查詢:支援 SQL 查詢語言,讓您可以輕鬆地查詢和分析資料。
  • 資料轉換:提供了資料轉換的功能,讓您可以輕鬆地將資料從一個格式轉換到另一個格式。

資料虛擬化的應用場景

資料虛擬化有以下應用場景:

  • 資料倉儲:整合不同來源的資料,建立一個統一的資料倉儲。
  • 商業智慧:提供一個統一的檢視,讓使用者可以輕鬆地查詢和分析不同的商業資料。
  • 物聯網:整合不同來源的物聯網資料,建立一個統一的檢視。
內容解密:

在本文中,我們討論了資料虛擬化和 Neo4j APOC 的功能和應用場景。透過使用 Neo4j APOC,您可以輕鬆地整合不同來源的資料,建立一個統一的檢視,並提高資料可用性和安全性。

圖表翻譯:

  graph LR
    A[資料虛擬化] --> B[Neo4j APOC]
    B --> C[SQL 查詢]
    C --> D[資料轉換]
    D --> E[統一檢視]
    E --> F[提高資料可用性]
    F --> G[提高資料安全性]

在這個圖表中,我們展示了資料虛擬化和 Neo4j APOC 的關係。透過使用 Neo4j APOC,您可以輕鬆地整合不同來源的資料,建立一個統一的檢視,並提高資料可用性和安全性。

整合知識圖與資訊系統

在前面的章節中,我們探討了知識圖的基礎概念和應用。現在,我們將深入探討如何將知識圖整合到現有的資訊系統中。這個過程涉及到資料整合、虛擬化和自定義函式的應用。

整合知識圖和資料函式庫

為了展示知識圖和其他資料函式庫之間的整合,我們將使用APOC(Awesome Procedures On Cypher)函式庫來建立一個虛擬化的資源。這個資源可以用來查詢另一個資料函式庫中的資料,並將其整合到知識圖中。

首先,我們需要建立一個虛擬化的資源,使用以下Cypher查詢:

CALL apoc.dv.catalog.add("metrics-by-device-id", {
  type: "JDBC",
  url: "jdbc:postgresql://localhost/metrics_collector?user=bob&password=bobby",
  labels: ["Town","PopulatedPlace"],
  query: "SELECT latency, packetloss, packetdupl, jitter, throughput
           FROM device_perf
           WHERE device_id = $device_id
           AND timestamp > now() - interval '1 day' ;",
  desc: "french towns by 玄貓"
})

這個查詢建立了一個名為"metrics-by-device-id"的虛擬化資源,該資源連線到一個PostgreSQL資料函式庫,並使用指定的查詢陳述式來查詢資料。

接下來,我們可以使用這個虛擬化資源來查詢資料,並將其整合到知識圖中。以下Cypher查詢示範瞭如何使用這個資源:

MATCH (aend:NetworkDevice)-[l:LINK]->(zend:NetworkDevice)
WHERE l.linkId = "s1_385/ol"
WITH aend, zend
CALL apoc.dv.query("metrics-by-device-id",{device_id: aend.nd_id}) YIELD node

這個查詢使用虛擬化資源"metrics-by-device-id"來查詢指定裝置的效能指標,並將結果整合到知識圖中。

自定義函式和程式

APOC函式庫提供了許多有用的函式和程式,但有時候我們需要根據自己的需求建立自定義函式和程式。Neo4j允許使用者定義函式和程式,可以使用Java或其他JVM語言編寫。

以下示範了一個簡單的自定義程式,該程式計算知識圖中所有節點的度(即節點所附加的關係數量):

public class GetNodeDegrees {
  @Context
  public GraphDatabaseService graphDatabaseService;
  
  @Procedure(value = "getNodeDegrees")
  @Description("Get degrees of all nodes in the knowledge graph")
  public Stream<NodeDegree> getNodeDegrees() {
    Map<Long, Long> nodeDegrees = new TreeMap<>(Long::compare);
    
    graphDatabaseService.getAllNodes().forEach(n -> {
      final long nodeDegree = n.getDegree();
      
      long numberOfNodeWithCurrentDegree =
        nodeDegrees.getOrDefault(nodeDegree, 0L);
      nodeDegrees.put(nodeDegree, numberOfNodeWithCurrentDegree + 1);
    });
    
    final Stream.Builder<NodeDegree> streamBuilder = Stream.builder();
    for (Map.Entry<Long, Long> entry : nodeDegrees.entrySet()) {
      streamBuilder.add(new NodeDegree(entry.getKey(), entry.getValue()));
    }
    return streamBuilder.build();
  }
}

這個程式使用Neo4j的Java API來存取知識圖,並計算每個節點的度。結果以流的形式傳回,可以用於進一步的處理或分析。

整合知識圖與資訊系統

知識圖是一種強大的工具,能夠幫助我們理解複雜的資料關係。然而,要將知識圖整合到現有的資訊系統中,需要一些額外的工作。在這個章節中,我們將探討如何使用 Neo4j 的程式和函式來整合知識圖與資訊系統。

程式和函式

Neo4j 提供了一種稱為程式(Procedure)的機制,允許開發人員建立自訂的函式來操作知識圖。程式可以用來執行各種任務,例如計算節點的度(Degree)、查詢相關節點等。

以下是一個簡單的程式範例,計算節點的度:

public class NodeDegree {
    public Long degree;
    public Long numberOfNodes;

    public NodeDegree(Long key, Long value) {
        degree = key;
        numberOfNodes = value;
    }
}

這個程式定義了一個 NodeDegree 類別,包含兩個屬性:degreenumberOfNodes。程式的入口點是 getNodeDegrees 函式,該函式傳回一個 NodeDegree 物件的串流。

整合知識圖與資訊系統

要將知識圖整合到現有的資訊系統中,需要使用一些額外的工具和技術。其中一個選擇是使用 Data Fabric,以提供一個統一的資料存取介面。

Data Fabric 是一個專門的平臺,提供了資料虛擬化、資料整合和資料管理的功能。它可以幫助我們將知識圖整合到現有的資訊系統中,提供一個統一的資料存取介面。

另一個選擇是使用 GraphQL,一種 API 工具套件,提供了一種簡單的方式來存取和操作知識圖。GraphQL 可以用來建立 API,提供知識圖的存取介面。

GraphQL

GraphQL 是一個 API 工具套件,提供了一種簡單的方式來存取和操作知識圖。它可以用來建立 API,提供知識圖的存取介面。

以下是一個簡單的 GraphQL 範例,定義了一個 Place 類別和一個 Person 類別:

type Place {
    city: String!
    country: String
    people: [Person!]! @relationship(type: "LIVES_IN", direction: IN)
}

type Person {
    name: String!
    home: Place! @relationship(type: "LIVES_IN", direction: OUT)
}

這個範例定義了一個 Place 類別和一個 Person 類別,包含了各自的屬性和關係。使用 @relationship 指令,可以定義節點之間的關係。

結合知識圖與 GraphQL 的強大應用

GraphQL 是一種 API 描述和構建框架,能夠很好地與知識圖合作,特別是在知識圖位於系統架構中靠近使用者的一側。透過 GraphQL,我們可以輕鬆地查詢和更新知識圖中的資料。

知識圖更新與查詢

例如,假設我們有一個知識圖,其中包含了城市、國家和人物的資訊。我們可以使用 GraphQL 來查詢和更新這些資料。以下是一個例子:

input: {
  city: "Sydney"
  country: "Australia"
  people: {
    create: [
      { node: { name: "Skippy" } }
      { node: { name: "Cate Blanchet" } }
    ]
  }
}

這個查詢會建立兩個新的人物節點,分別是 Skippy 和 Cate Blanchet,並將他們與 Sydney 和 Australia 相關聯。

結果傳回

GraphQL 會傳回以下結果:

{
  "data": {
    "createPlaces": {
      "places": [
        {
          "city": "Sydney",
          "country": "Australia",
          "people": [
            {
              "name": "Skippy"
            },
            {
              "name": "Cate Blanchet"
            }
          ]
        }
      ]
    }
  }
}

Kafka Connect Plug-In

Apache Kafka 是一個流行的企業級中介軟體平臺,作為系統之間的粘合劑。在其最簡單的形式中,它是一個可靠的發布/訂閱系統,用於在系統之間移動訊息。在其最先進的形式中,它本身就是一個資料函式庫和查詢引擎,用於處理記錄當它們流經業務。

將知識圖與 Kafka 整合是直截了當的。使用 Kafka Connect Neo4j Connector,您的知識圖可以作為資料來源,例如變化資料(或變化資料捕捉),或作為接收器,以從 Kafka 事件中攝取資料到您的知識圖中。

架構

在系統級別上,架構是直截了當的。圖 5-8 顯示瞭如何週期性地執行一個 Cypher 查詢來發布資料從您的知識圖到 Kafka 中,以供消費。

圖表翻譯:

此圖顯示了週期性執行 Cypher 查詢以發布資料到 Kafka 的過程。首先,Cypher 查詢會被執行以查詢知識圖中的資料。然後,查詢結果會被發布到 Kafka 中,以供其他系統消費。

組態 Neo4j Streams Plug-In

組態 Neo4j Streams Plug-In 以發布更新從知識圖也是直截了當的。以下是一個例子:

{
  "name": "Neo4jSourceConnectorAVRO",
  "config": {
    "topic": "new-arrivals-in-Berlin",
   ...
    "neo4j.streaming.poll.interval.msecs": 5000,
    "neo4j.streaming.property": "timestamp",
    "neo4j.streaming.from": "NOW",
    "neo4j.enforce.schema": true,
    "neo4j.source.query": "MATCH (p:Person)-[li:LIVES_IN]->(:Place {city:'Berlin', country:'DE'})"
  }
}

這個組態會設定 Neo4j Streams Plug-In 以每 5 秒(5000 毫秒)執行一次 Cypher 查詢,以查詢新抵達柏林的人員,並將結果發布到 Kafka 主題中。

內容解密:

這個組態使用了 Cypher 查詢語言來查詢知識圖中的資料。查詢會匹配所有具有 LIVES_IN 關係的人員節點,並且這些關係的目標節點是柏林。查詢結果會包含人員的名字和他們搬到柏林的時間戳。

整合知識圖與資訊系統的補充工具和技術

在前面的章節中,我們探討瞭如何將知識圖整合到各種資訊系統中。在這個章節中,我們將介紹一些補充工具和技術,包括從Kafka接收訊息、使用Cypher MERGE插入資料到知識圖,以及使用Neo4j Spark Connector進行資料處理。

從Kafka接收訊息

Kafka是一個流行的訊息佇列系統,廣泛用於大資料處理和實時資料整合。要從Kafka接收訊息並將其插入到知識圖中,可以使用Cypher MERGE陳述式。以下是Example 5-18所示的組態範例:

{
  "name": "Neo4jSinkConnector",
  "config": {
    "topics": "new-arrivals-in-Berlin",
    "neo4j.topic.cypher.new-arrivals-in-Berlin": "
      MERGE (person:Person {name: event.name})
      MERGE (person)-[LIVES_IN {since:'2021-06-12T10:31:11.553+0100'}]->(place)
    "
  }
}

這個組態定義了一個Kafka聯結器,該聯結器從new-arrivals-in-Berlin主題接收訊息,並使用Cypher MERGE陳述式將訊息中的資料插入到知識圖中。

使用Neo4j Spark Connector

Apache Spark是一個流行的分散式資料處理框架,廣泛用於大資料處理和機器學習。Neo4j Spark Connector是一個Spark聯結器,允許Spark將知識圖作為資料來源和資料Sink。以下是Example 5-19所示的範例:

val spark = SparkSession.builder().getOrCreate()
val df = spark.read.format("org.neo4j.spark.DataSource")
 .option("url", "bolt://localhost:7687")
 .option("authentication.basic.username", "neo4j")
 .option("authentication.basic.password", "neo4j")
 .option("labels", ":Person")
 .load()
df.where("name = 'John Doe'").where("age = 32").show()

這個範例展示瞭如何使用Neo4j Spark Connector從知識圖中讀取資料,並將其過濾和顯示。

使用Cypher查詢

Neo4j Spark Connector也允許Spark執行Cypher查詢,以便從知識圖中讀取資料。以下是Example 5-20所示的範例:

val spark = SparkSession.builder().getOrCreate()
val df = spark.read.format("org.neo4j.spark.DataSource")
 .option("url", "bolt://localhost:7687")
 .option("authentication.basic.username", "neo4j")
 .option("authentication.basic.password", "neo4j")
 .option("query", "MATCH (n:Person) RETURN n.name, n.age")
 .load()
df.show()

這個範例展示瞭如何使用Cypher查詢從知識圖中讀取資料,並將其顯示。

圖表翻譯:

以下是使用Mermaid語法繪製的知識圖架構圖:

  graph LR
  A[Kafka] -->|接收訊息|> B[Neo4j]
  B -->|插入資料|> C[知識圖]
  C -->|查詢資料|> D[Spark]
  D -->|過濾和顯示|> E[結果]

這個圖表展示了Kafka、Neo4j、知識圖和Spark之間的關係,以及如何使用Cypher MERGE陳述式和Cypher查詢從Kafka接收訊息並將其插入到知識圖中。

Apache Spark 與 Neo4j 整合:讀寫資料

在大資料時代,能夠高效整合不同資料來源的技術至關重要。Apache Spark 是一種流行的開源資料處理引擎,而 Neo4j 是一種領先的圖形資料函式庫。這篇文章將介紹如何使用 Spark 來讀寫 Neo4j 的資料。

從資料架構的演進、知識圖譜的整合、Neo4j 驅動程式的應用、APOC 函式庫的運用、資料虛擬化技術、GraphQL 的整合,乃至 Kafka 與 Spark 的串接,本文深入探討了知識圖譜在現代資訊系統中扮演的關鍵角色以及各種整合策略。透過多維度的分析,我們發現知識圖譜不僅能提升資料品質、增強系統互操作性,更能提供一個彈性且強大的資料整合方案。然而,技術的應用並非一蹴可幾,知識圖譜的整合也面臨著諸多挑戰,例如資料一致性維護、效能瓶頸的突破以及安全性的保障。展望未來,隨著圖資料函式庫技術的持續發展和生態系統的日益完善,預期知識圖譜的應用門檻將大幅降低,其應用場景也將更加廣泛,從商業智慧到物聯網,甚至更廣闊的領域。玄貓認為,掌握知識圖譜的整合技術,將是企業在未來資料驅動時代取得競爭優勢的關鍵。對於技術團隊而言,深入理解並解決資料整合的挑戰,才能真正釋放知識圖譜的巨大潛力,並在實務應用中創造更大的商業價值。