作者 | 穆瓊
責編 | 晉兆雨
隨着知識圖譜的發展,圖數據庫一詞被越來越多的提到。那麼到底什麼是圖數據庫,爲什麼要用圖數據庫,如何去建設一個圖數據庫應用系統,圖數據庫與知識圖譜到底是什麼關係。今天爲大家揭開神祕面紗,以Neo4j爲例,淺析圖數據庫相關技術。
作者介紹:穆瓊 中國農業銀行研發中心,致力於AIOps的落地。
01
圖數據庫簡介
談到圖數據庫,首先要聊聊“圖”,這裏的圖不是計算機視覺、圖像處理領域的圖,而是圖論中的圖,它由節點和節點間的線組成,通常用來描述某些實體與它們之間的特定關係。下圖就是一個典型的圖示例,某企業網絡設備拓撲和報警管理應用方案的示意圖。
現實世界中的圖無處不在,社交領域人與人的關係挖掘、零售領域商品購買的關聯推薦、金融領域的反欺詐反洗錢,都是圖技術的典型應用。但是圖的存儲在過去一直沒有特別好的方案。歷史的方案可以概括爲兩類,第一類基於傳統關係型數據庫,將圖中的關係用外鍵或關聯表來表示,這種方式對於某些查詢場景需要好幾個昂貴的表連接,增加了複雜性。在這種存儲中,業務數據與外鍵元數據混雜起來,增加了開發和維護的成本。第二類採用鍵值或文檔型的NoSQL數據庫,鍵值型如Redis、DynanoDB 等、文檔數據庫如MongoDB,這些NoSQL都難以表示關聯關係,爲技術人員帶來了開發成本和理解上的壁壘。
因此,專門用於圖的存儲和查詢技術是非常必要的。圖技術根據應用方式的不同可以分爲兩個方向,第一個方向是圖數據庫,它用於圖數據的存儲和聯機事務查詢,具備實時性,面向OLTP,支持CRUD和事務。第二個方向是圖計算引擎,它用於圖數據的離線查詢分析,更適合海量數據的挖掘,面向OLAP。
圖領域已經有很多的技術和產品,下圖截取自VLDB2019 keynote《Graph Processing: APanaromic View and Some Open Problems》,除了其中所列之外還有很多其他的技術。
圖數據庫有很多成熟的產品,根據底層存儲和處理引擎是否原生,圖數據庫可以分爲四類。爲了便於後面理解圖數據庫處理圖的優勢,我們解釋一下這兩個分類維度的含義。
存儲方式
原生圖存儲:數據存儲模式爲存儲和管理圖而設計,爲圖進行過優化。
非原生圖存儲:將圖數據序列化,採用關係型數據庫、面向對象數據庫、或是其他通用數據存儲。
處理方式
原生圖處理:使用免索引鄰接,關聯節點在物理層面指向彼此,這種方式不同於傳統關係型數據庫的樹形全局索引,爲查詢圖的關聯節點帶來了巨大的性能優勢。
非原生圖處理:不採用免索引鄰接保存關係。
根據這兩個維度,圖數據庫產品可以分爲四類:
02
Neo4j實踐
我們以Neo4j爲例,直觀地感受一下圖數據庫的強大和便捷之處。Neo4j採用Cypher查詢語言(CQL)進行數據的增刪改查,下面的Cypher語句創建了三個Person節點和他們之間的關注關係:
CREATE (Billy:Person {name:'Billy',born:1990, sex:'male'})
CREATE (Ruth:Person {name:'Ruth',born:1989, sex:'female'})
CREATE (Harry:Person {name:'Harry',born:1992, sex:'male'})
CREATE (Billy)-[:FOLLOWS]->(Harry)
CREATE (Harry)-[:FOLLOWS]->(Billy)
CREATE (Ruth)-[:FOLLOWS]->(Billy)
CREATE (Ruth)-[:FOLLOWS]->(Harry)
CREATE (Harry)-[:FOLLOWS]->(Ruth)
查詢關注了Billy的人:
MATCH (Billy:Person{name:'Billy'})<-[:FOLLOWS]-(followers:Person)RETURN followers
爲Billy做個簡單的好友推薦,推薦策略是把Billy好友(互關者)關注的人推薦給他:
MATCH(Billy:Person{name:'Billy'})-[:FOLLOWS]->(friend:Person)-[:FOLLOWS]->(Billy:Person{name:'Billy'}),(friend)-[:FOLLOWS]->(newFriend)
WHERE NOT(Billy)-[:FOLLOWS]->(newFriend)
RETURN newFriend
上面的推薦查詢得到Ruth。
可以看到,相較SQL的關聯查詢,Cypher查詢的語法具有更強的語義性。
Neo4j也提供了shortestPath方法來獲取節點間的最短路徑關係,下面這個查詢基於Neo4j官方提供的電影和演員數據:
我們的歷史數據大多都存儲在關係型數據庫中,neo4j也很好的支持了關係型數據表CSV文件的導入,CSV文件的導入有兩種方式:
1.直接用Cypher LOACCSV:
LOAD CSV WITH HEADERS FROM"file:///categories.csv" AS row
CREATE (n:Category)
SET n = row
2.用neo4j-import工具,更適用於數據量較大的場景,支持並行、可擴展的CSV數據導入。
在查詢性能優化方面,Neo4j也做了較好的支持:
Cypher支持對節點的某個屬性上創建索引,使得檢索數據效率更高,但是跟關係型數據庫類似,索引同樣會增加存儲成本、影響寫入效率。
在用Cypher查詢時,我們也可以通過EXPLAIN或PROFILE對查詢語句進行分析,輔助查詢調優。
Neo4j監控工具可以記錄和顯示服務器的各項指標,Neo4j提供了HTTP web界面實時查看監控數據,包括存儲容量、ID分配、頁面緩存和事務數據。
03
Neo4j系統建設
Neo4j開發
Neo4j分別提供Java接口和REST API,對應的,使用Neo4j也有兩種開發模式:Java API嵌入式開發和HTTP API調用開發。
Neo4j天然支持Java,Spring也提供了Spring Data Neo4j,便於我們在Spring應用系統中使用Neo4j。Spring Data Neo4j除了提供Spring Data模塊的實體映射、分頁、事務等功能以外,還針對Neo4j提供了以下附加功能:
支持Neo4j屬性圖模塊;
支持Neo4j Lucence索引;
支持Neo4j Cypher查詢(CQL);
Neo4jTemplate
Spring Data Neo4j體系結構如下圖:
Spring Data Neo4j提供了不同的API來支持不同的場景,下表給出了對應的Java類和其用法:
Spring Data Neo4j類 |
用法 |
GraphRepository |
用於執行basic Neo4j DB操作 |
GraphTemplate |
類似其他Spring Data模塊的Template,是執行Neo4j DB操作的Spring模板 |
CrudRepository |
用於使用Cypher查詢語言(CQL)執行Neo4j CRUD操作 |
PaginationAndSortingRepository |
用於執行Neo4j CQL查詢結果的分頁和排序 |
04
Neo4j集羣搭建
考慮到系統實施時大規模生產環境和容錯問題,Neo4j企業版提供高可用集羣和因果集羣兩種集羣功能,實現高可用性和水平讀擴展,有效提高系統整體性能、可靠性、靈活性和可擴展性。
在使用圖數據庫集羣時,我們需要考慮集羣的負載均衡,提升吞吐量並減少延遲時間。Neo4j自身沒有負載均衡功能,需要依賴網絡基礎設施的負載均衡能力。以下是三種我們常用的負載均衡方式:
1.分離讀寫流量,將絕大部分寫入操作直接在集羣主節點上進行,將讀請求和寫請求完全分離開,通過負載均衡器將寫流量定向到主節點,讀流量平衡地分散到整個集羣,避免寫操作影響查詢效率。
2.高速緩存分片,這種方式利用了主存儲器中的數據查詢執行最快,如下圖所示,高可用集羣中的節點實例將圖的部分數據放在自己的主存儲器,負載均衡器將請求路由到對應的節點實例上,提升查詢效率。
3.集羣實例節點讀取自己的寫入,減少查詢開銷。
05
知識圖譜與圖數據庫
圖數據庫雖然強大且易用,但是它並不是完美的適用於所有場景。圖數據庫可以存儲海量數據,但並不適合直接用來進行海量數據的分析計算,而更適合用來進行某個實體及其關聯關係的查詢。因此,僅靠圖數據庫顯然無法解決圖計算領域的所有問題,在知識圖譜的構建和應用方面還有很多需要利用其他圖計算技術來解決的問題。
下圖是一個典型的圖計算技術架構,包括圖數據建模、存儲系統和圖數據計算三個部分。
圖數據建模:對於關係型數據庫的數據,關係和實體已知,建模成圖數據相對簡單。但是對於文本這樣的非結構化數據,將其建模成爲圖數據需要應用自然語言處理、機器學習技術,來解決知識抽取、知識融合和知識推理等問題。斯坦福大學Infolab實驗室開源的DeepDive提供了知識抽取的框架,是構建知識圖譜的利器。
存儲系統:圖數據有多種存儲方式,圖數據庫當然是最適應圖的關係存儲的,但在不同的應用場景下,也可以考慮將圖數據以RDF三元組、關係型數據庫、ES或其他NoSQL方式進行存儲。
圖數據應用:在構建好的圖數據基礎之上,通過圖計算引擎對海量圖數據進行離線的計算分析,針對不同的應用場景,也可以在內存處理或工作存儲中對圖數據進行查詢分析。
圖數據庫非常適用於圖數據的存儲和實時查詢,是知識圖譜的基石,但它並非知識圖譜的全部。在應用時,我們需要針對具體的場景去進行選型,結合不同的圖計算技術進行分析計算。
目前圖數據庫產品很多,國內各大互聯網公司如阿里、騰訊等也自研了自己的圖數據庫,圖數據庫未來能否像關係型數據庫一樣有統一的查詢語法,目前還是一個未知數。但可預見的是,隨着數據的爆炸式增長,在追求數據驅動運營和決策的潮流下,圖數據庫在社交關係、實時推薦、主數據管理、在線反欺詐、IT網絡管理、地理信息系統等領域都將佔據重要的一席之地。