一文聊“图”,从图数据库到知识图谱
作者 | 穆瓊
責(zé)編 | 晉兆雨
頭圖 |?付費下載于視覺中國
隨著知識圖譜的發(fā)展,圖數(shù)據(jù)庫一詞被越來越多的提到。那么到底什么是圖數(shù)據(jù)庫,為什么要用圖數(shù)據(jù)庫,如何去建設(shè)一個圖數(shù)據(jù)庫應(yīng)用系統(tǒng),圖數(shù)據(jù)庫與知識圖譜到底是什么關(guān)系。今天為大家揭開神秘面紗,以Neo4j為例,淺析圖數(shù)據(jù)庫相關(guān)技術(shù)。
作者介紹:穆瓊 中國農(nóng)業(yè)銀行研發(fā)中心,致力于AIOps的落地。
圖數(shù)據(jù)庫簡介
談到圖數(shù)據(jù)庫,首先要聊聊“圖”,這里的圖不是計算機視覺、圖像處理領(lǐng)域的圖,而是圖論中的圖,它由節(jié)點和節(jié)點間的線組成,通常用來描述某些實體與它們之間的特定關(guān)系。下圖就是一個典型的圖示例,某企業(yè)網(wǎng)絡(luò)設(shè)備拓?fù)浜蛨缶芾響?yīng)用方案的示意圖。
現(xiàn)實世界中的圖無處不在,社交領(lǐng)域人與人的關(guān)系挖掘、零售領(lǐng)域商品購買的關(guān)聯(lián)推薦、金融領(lǐng)域的反欺詐反洗錢,都是圖技術(shù)的典型應(yīng)用。但是圖的存儲在過去一直沒有特別好的方案。歷史的方案可以概括為兩類,第一類基于傳統(tǒng)關(guān)系型數(shù)據(jù)庫,將圖中的關(guān)系用外鍵或關(guān)聯(lián)表來表示,這種方式對于某些查詢場景需要好幾個昂貴的表連接,增加了復(fù)雜性。在這種存儲中,業(yè)務(wù)數(shù)據(jù)與外鍵元數(shù)據(jù)混雜起來,增加了開發(fā)和維護的成本。第二類采用鍵值或文檔型的NoSQL數(shù)據(jù)庫,鍵值型如Redis、DynanoDB 等、文檔數(shù)據(jù)庫如MongoDB,這些NoSQL都難以表示關(guān)聯(lián)關(guān)系,為技術(shù)人員帶來了開發(fā)成本和理解上的壁壘。
因此,專門用于圖的存儲和查詢技術(shù)是非常必要的。圖技術(shù)根據(jù)應(yīng)用方式的不同可以分為兩個方向,第一個方向是圖數(shù)據(jù)庫,它用于圖數(shù)據(jù)的存儲和聯(lián)機事務(wù)查詢,具備實時性,面向OLTP,支持CRUD和事務(wù)。第二個方向是圖計算引擎,它用于圖數(shù)據(jù)的離線查詢分析,更適合海量數(shù)據(jù)的挖掘,面向OLAP。
圖領(lǐng)域已經(jīng)有很多的技術(shù)和產(chǎn)品,下圖截取自VLDB2019 keynote《Graph Processing: APanaromic View and Some Open Problems》,除了其中所列之外還有很多其他的技術(shù)。
圖數(shù)據(jù)庫有很多成熟的產(chǎn)品,根據(jù)底層存儲和處理引擎是否原生,圖數(shù)據(jù)庫可以分為四類。為了便于后面理解圖數(shù)據(jù)庫處理圖的優(yōu)勢,我們解釋一下這兩個分類維度的含義。
存儲方式
原生圖存儲:數(shù)據(jù)存儲模式為存儲和管理圖而設(shè)計,為圖進行過優(yōu)化。
非原生圖存儲:將圖數(shù)據(jù)序列化,采用關(guān)系型數(shù)據(jù)庫、面向?qū)ο髷?shù)據(jù)庫、或是其他通用數(shù)據(jù)存儲。
處理方式
原生圖處理:使用免索引鄰接,關(guān)聯(lián)節(jié)點在物理層面指向彼此,這種方式不同于傳統(tǒng)關(guān)系型數(shù)據(jù)庫的樹形全局索引,為查詢圖的關(guān)聯(lián)節(jié)點帶來了巨大的性能優(yōu)勢。
非原生圖處理:不采用免索引鄰接保存關(guān)系。
根據(jù)這兩個維度,圖數(shù)據(jù)庫產(chǎn)品可以分為四類:
Neo4j實踐
我們以Neo4j為例,直觀地感受一下圖數(shù)據(jù)庫的強大和便捷之處。Neo4j采用Cypher查詢語言(CQL)進行數(shù)據(jù)的增刪改查,下面的Cypher語句創(chuàng)建了三個Person節(jié)點和他們之間的關(guān)注關(guān)系:
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)查詢關(guān)注了Billy的人:
MATCH?(Billy:Person{name:'Billy'})<-[:FOLLOWS]-(followers:Person)RETURN?followers為Billy做個簡單的好友推薦,推薦策略是把Billy好友(互關(guān)者)關(guān)注的人推薦給他:
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的關(guān)聯(lián)查詢,Cypher查詢的語法具有更強的語義性。
Neo4j也提供了shortestPath方法來獲取節(jié)點間的最短路徑關(guān)系,下面這個查詢基于Neo4j官方提供的電影和演員數(shù)據(jù):
我們的歷史數(shù)據(jù)大多都存儲在關(guān)系型數(shù)據(jù)庫中,neo4j也很好的支持了關(guān)系型數(shù)據(jù)表CSV文件的導(dǎo)入,CSV文件的導(dǎo)入有兩種方式:
1.直接用Cypher LOACCSV:
2.用neo4j-import工具,更適用于數(shù)據(jù)量較大的場景,支持并行、可擴展的CSV數(shù)據(jù)導(dǎo)入。?
在查詢性能優(yōu)化方面,Neo4j也做了較好的支持:
Cypher支持對節(jié)點的某個屬性上創(chuàng)建索引,使得檢索數(shù)據(jù)效率更高,但是跟關(guān)系型數(shù)據(jù)庫類似,索引同樣會增加存儲成本、影響寫入效率。
在用Cypher查詢時,我們也可以通過EXPLAIN或PROFILE對查詢語句進行分析,輔助查詢調(diào)優(yōu)。
Neo4j監(jiān)控工具可以記錄和顯示服務(wù)器的各項指標(biāo),Neo4j提供了HTTP web界面實時查看監(jiān)控數(shù)據(jù),包括存儲容量、ID分配、頁面緩存和事務(wù)數(shù)據(jù)。
?
Neo4j系統(tǒng)建設(shè)
Neo4j開發(fā)
Neo4j分別提供Java接口和REST API,對應(yīng)的,使用Neo4j也有兩種開發(fā)模式:Java API嵌入式開發(fā)和HTTP API調(diào)用開發(fā)。
Neo4j天然支持Java,Spring也提供了Spring Data Neo4j,便于我們在Spring應(yīng)用系統(tǒng)中使用Neo4j。Spring Data Neo4j除了提供Spring Data模塊的實體映射、分頁、事務(wù)等功能以外,還針對Neo4j提供了以下附加功能:
支持Neo4j屬性圖模塊;
支持Neo4j Lucence索引;
支持Neo4j Cypher查詢(CQL);
Neo4jTemplate
?Spring Data Neo4j體系結(jié)構(gòu)如下圖:
Spring Data Neo4j提供了不同的API來支持不同的場景,下表給出了對應(yīng)的Java類和其用法:
Spring Data Neo4j類 | 用法 |
GraphRepository | 用于執(zhí)行basic Neo4j DB操作 |
GraphTemplate | 類似其他Spring Data模塊的Template,是執(zhí)行Neo4j DB操作的Spring模板 |
CrudRepository | 用于使用Cypher查詢語言(CQL)執(zhí)行Neo4j CRUD操作 |
PaginationAndSortingRepository | 用于執(zhí)行Neo4j CQL查詢結(jié)果的分頁和排序 |
?
Neo4j集群搭建
?
考慮到系統(tǒng)實施時大規(guī)模生產(chǎn)環(huán)境和容錯問題,Neo4j企業(yè)版提供高可用集群和因果集群兩種集群功能,實現(xiàn)高可用性和水平讀擴展,有效提高系統(tǒng)整體性能、可靠性、靈活性和可擴展性。
在使用圖數(shù)據(jù)庫集群時,我們需要考慮集群的負(fù)載均衡,提升吞吐量并減少延遲時間。Neo4j自身沒有負(fù)載均衡功能,需要依賴網(wǎng)絡(luò)基礎(chǔ)設(shè)施的負(fù)載均衡能力。以下是三種我們常用的負(fù)載均衡方式:
1.分離讀寫流量,將絕大部分寫入操作直接在集群主節(jié)點上進行,將讀請求和寫請求完全分離開,通過負(fù)載均衡器將寫流量定向到主節(jié)點,讀流量平衡地分散到整個集群,避免寫操作影響查詢效率。
2.高速緩存分片,這種方式利用了主存儲器中的數(shù)據(jù)查詢執(zhí)行最快,如下圖所示,高可用集群中的節(jié)點實例將圖的部分?jǐn)?shù)據(jù)放在自己的主存儲器,負(fù)載均衡器將請求路由到對應(yīng)的節(jié)點實例上,提升查詢效率。
3.集群實例節(jié)點讀取自己的寫入,減少查詢開銷。
?
知識圖譜與圖數(shù)據(jù)庫
圖數(shù)據(jù)庫雖然強大且易用,但是它并不是完美的適用于所有場景。圖數(shù)據(jù)庫可以存儲海量數(shù)據(jù),但并不適合直接用來進行海量數(shù)據(jù)的分析計算,而更適合用來進行某個實體及其關(guān)聯(lián)關(guān)系的查詢。因此,僅靠圖數(shù)據(jù)庫顯然無法解決圖計算領(lǐng)域的所有問題,在知識圖譜的構(gòu)建和應(yīng)用方面還有很多需要利用其他圖計算技術(shù)來解決的問題。
下圖是一個典型的圖計算技術(shù)架構(gòu),包括圖數(shù)據(jù)建模、存儲系統(tǒng)和圖數(shù)據(jù)計算三個部分。
圖數(shù)據(jù)建模:對于關(guān)系型數(shù)據(jù)庫的數(shù)據(jù),關(guān)系和實體已知,建模成圖數(shù)據(jù)相對簡單。但是對于文本這樣的非結(jié)構(gòu)化數(shù)據(jù),將其建模成為圖數(shù)據(jù)需要應(yīng)用自然語言處理、機器學(xué)習(xí)技術(shù),來解決知識抽取、知識融合和知識推理等問題。斯坦福大學(xué)Infolab實驗室開源的DeepDive提供了知識抽取的框架,是構(gòu)建知識圖譜的利器。?
存儲系統(tǒng):圖數(shù)據(jù)有多種存儲方式,圖數(shù)據(jù)庫當(dāng)然是最適應(yīng)圖的關(guān)系存儲的,但在不同的應(yīng)用場景下,也可以考慮將圖數(shù)據(jù)以RDF三元組、關(guān)系型數(shù)據(jù)庫、ES或其他NoSQL方式進行存儲。
圖數(shù)據(jù)應(yīng)用:在構(gòu)建好的圖數(shù)據(jù)基礎(chǔ)之上,通過圖計算引擎對海量圖數(shù)據(jù)進行離線的計算分析,針對不同的應(yīng)用場景,也可以在內(nèi)存處理或工作存儲中對圖數(shù)據(jù)進行查詢分析。
圖數(shù)據(jù)庫非常適用于圖數(shù)據(jù)的存儲和實時查詢,是知識圖譜的基石,但它并非知識圖譜的全部。在應(yīng)用時,我們需要針對具體的場景去進行選型,結(jié)合不同的圖計算技術(shù)進行分析計算。?
目前圖數(shù)據(jù)庫產(chǎn)品很多,國內(nèi)各大互聯(lián)網(wǎng)公司如阿里、騰訊等也自研了自己的圖數(shù)據(jù)庫,圖數(shù)據(jù)庫未來能否像關(guān)系型數(shù)據(jù)庫一樣有統(tǒng)一的查詢語法,目前還是一個未知數(shù)。但可預(yù)見的是,隨著數(shù)據(jù)的爆炸式增長,在追求數(shù)據(jù)驅(qū)動運營和決策的潮流下,圖數(shù)據(jù)庫在社交關(guān)系、實時推薦、主數(shù)據(jù)管理、在線反欺詐、IT網(wǎng)絡(luò)管理、地理信息系統(tǒng)等領(lǐng)域都將占據(jù)重要的一席之地。
?
更多閱讀推薦
云原生應(yīng)用Go語言:你還在考慮的時候,別人已經(jīng)應(yīng)用實踐
一文告訴你霧計算與云計算的區(qū)別及對物聯(lián)網(wǎng)的價值!
你可能也會掉進這個簡單的 String 的坑
教你如何用 Python 三行代碼做動圖!
Ethereum2.0:深入了解Lego Money、Sharding、PoS和TPS的真相
總結(jié)
以上是生活随笔為你收集整理的一文聊“图”,从图数据库到知识图谱的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 大数据给教育带来怎样的可能?
- 下一篇: SQL分页查询方案的性能对比