來(lái)源丨VentureBeat
編譯丨科技行者
新一代圖數(shù)據(jù)庫(kù)已經(jīng)在市場(chǎng)上站穩(wěn)腳跟,與之相伴的一代查詢(xún)語(yǔ)言也應(yīng)運(yùn)而生。包括Gremlin、Cypher以及GQL等在內(nèi)的各類(lèi)圖數(shù)據(jù)庫(kù)查詢(xún)語(yǔ)言,專(zhuān)門(mén)幫助用戶(hù)解包圖內(nèi)信息。
從本質(zhì)上講,一切數(shù)據(jù)庫(kù)都需要一種與客戶(hù)交流的方式,而查詢(xún)語(yǔ)言的職責(zé)正是定義數(shù)據(jù)庫(kù)能夠做些什么。良好的圖數(shù)據(jù)庫(kù)查詢(xún)語(yǔ)言應(yīng)該以盡可能簡(jiǎn)單的方式幫助開(kāi)發(fā)人員根據(jù)數(shù)據(jù)庫(kù)內(nèi)定義的網(wǎng)絡(luò)提出復(fù)雜問(wèn)題,進(jìn)而釋放出圖數(shù)據(jù)庫(kù)的強(qiáng)大力量。最初,這些語(yǔ)言各自面向不同的新數(shù)據(jù)庫(kù)以專(zhuān)有方案的形式存在,但最近一段時(shí)間各查詢(xún)語(yǔ)言間的開(kāi)放標(biāo)準(zhǔn)正在加速建立。
在關(guān)系數(shù)據(jù)庫(kù)領(lǐng)域,SQL(結(jié)構(gòu)化查詢(xún)語(yǔ)言)多年以來(lái)一直是行業(yè)的主導(dǎo)標(biāo)準(zhǔn)。它定義了一種在表內(nèi)搜索符合特定條件的數(shù)據(jù)行的核心方法。如果數(shù)據(jù)跨越多個(gè)表,SQL還提供一種表對(duì)齊方法,以便將所有信息連接至統(tǒng)一的集合之內(nèi)。SQL特別擅長(zhǎng)查找包含與某些規(guī)定相匹配的特定字段的特定條目集合,但也就僅此而已了。
經(jīng)典關(guān)系數(shù)據(jù)庫(kù)也能存儲(chǔ)圖,因此在圖數(shù)據(jù)庫(kù)出現(xiàn)之前,這也是開(kāi)發(fā)人員所能仰仗的唯一選擇。SQL能夠回答一部分基礎(chǔ)問(wèn)題,但傳統(tǒng)查詢(xún)語(yǔ)言卻往往處理不了那些最有用、最具吸引力的問(wèn)題。事實(shí)上,關(guān)系數(shù)據(jù)庫(kù)在表達(dá)極端復(fù)雜關(guān)系方面遠(yuǎn)遠(yuǎn)不及圖數(shù)據(jù)庫(kù),而關(guān)系數(shù)據(jù)庫(kù)查詢(xún)的唯一解決方案就是返回大塊數(shù)據(jù)以供客戶(hù)端軟件運(yùn)行進(jìn)一步分析。
所以大家應(yīng)該理解了,圖查詢(xún)語(yǔ)言的誕生是為了回答更為復(fù)雜的問(wèn)題,例如:
在一棵家譜樹(shù)中,某人有多少個(gè)遠(yuǎn)房表親?
在記錄朋友或關(guān)注者信息的社交媒體圖片中,兩個(gè)用戶(hù)之間的分離程度是多少?
在企業(yè)的供應(yīng)鏈中,工廠(chǎng)與客戶(hù)之間的最長(zhǎng)跳數(shù)是多少?
在一系列銀行交易中,哪些人與欺詐交易間的關(guān)系高于平均水平?
在計(jì)算機(jī)網(wǎng)絡(luò)中,哪些具有更高帶寬的新連接可用于解決性能瓶頸?
圖數(shù)據(jù)庫(kù)需要多種不同模型,其中某些查詢(xún)需要跟蹤多條鏈接或跳點(diǎn)。最初,每種圖數(shù)據(jù)庫(kù)都使用自己的專(zhuān)有查詢(xún)語(yǔ)言。好在最近幾年,圖數(shù)據(jù)庫(kù)廠(chǎng)商開(kāi)始添加新的實(shí)現(xiàn)并致力于推動(dòng)開(kāi)源標(biāo)準(zhǔn)以實(shí)現(xiàn)交叉支持。目前最常見(jiàn)的圖查詢(xún)語(yǔ)言包括:
Gremlin——最初為Apache Tinkerpop項(xiàng)目開(kāi)發(fā)的圖搜索語(yǔ)言,可實(shí)現(xiàn)過(guò)程性或聲明性查詢(xún)。
Cypher——最初由Neo4J創(chuàng)建,之后以O(shè)penCypher的形式得到普及,這種聲明性語(yǔ)言可用于搜索匹配特定屬性的頂點(diǎn)和邊。
GQL——一項(xiàng)標(biāo)準(zhǔn)倡議,致力于將Cyher、GSQL以及PSQL統(tǒng)一起來(lái)。
SPARQL——一種為了查詢(xún)RDF格式知識(shí)圖譜而建立的標(biāo)準(zhǔn)。
PGQL——甲骨文的原創(chuàng)語(yǔ)言,用于從符合規(guī)范的頂點(diǎn)當(dāng)中搜索并收集信息。
GSQL——TigerGraph的原創(chuàng)過(guò)程語(yǔ)言。
AQL——ArangoDB的原創(chuàng)過(guò)程語(yǔ)言。
GraphQL——顧名思義,它肯定支持圖查詢(xún);但GraphQL實(shí)際是一種更為通用的查詢(xún)語(yǔ)言,能夠高效搜索大部分文檔與關(guān)系數(shù)據(jù)庫(kù)。它雖然也能發(fā)掘出一部分圖數(shù)據(jù)庫(kù)用途,但總體來(lái)講只是在支持與關(guān)系數(shù)據(jù)庫(kù)相同的常規(guī)查詢(xún)。
不同查詢(xún)語(yǔ)言之間存在著一系列本質(zhì)差異。有些查詢(xún)語(yǔ)言屬于“聲明性”,另一些則屬于“過(guò)程性”。也就是說(shuō),有些是讓開(kāi)發(fā)者通過(guò)編寫(xiě)定義子集的簡(jiǎn)單規(guī)則來(lái)聲明自己“想干什么”,再由數(shù)據(jù)庫(kù)應(yīng)用這些規(guī)則、使用可用的索引構(gòu)建搜索計(jì)劃、再找到一切可能的匹配項(xiàng)。
例如,用戶(hù)可能需要查找相距10英里之內(nèi)的所有超過(guò)10000美元的銀行交易行為,或者是搜索互有聯(lián)系而且在過(guò)去兩周之內(nèi)沒(méi)發(fā)過(guò)新帖的社交媒體用戶(hù)。這些規(guī)則可以包括對(duì)標(biāo)準(zhǔn)查詢(xún)語(yǔ)言(“WHERE AGE<20”)中找到的值的所有過(guò)濾,再加上關(guān)于網(wǎng)絡(luò)連接的其他復(fù)雜規(guī)則(“IS RELATED TO”)。一般來(lái)說(shuō),圖查詢(xún)語(yǔ)言在搜索關(guān)系圖方面表現(xiàn)得最為突出。
而過(guò)程性查詢(xún)語(yǔ)言則更接近于傳統(tǒng)計(jì)算機(jī)語(yǔ)言,允許開(kāi)發(fā)人員控制數(shù)據(jù)庫(kù)搜索條目的具體方式,一般是編寫(xiě)循環(huán)或者其他控制結(jié)構(gòu)??偟膩?lái)講,聲明式語(yǔ)言更易于理解和使用,因?yàn)樗[藏掉了大部分搜索工作;但過(guò)程性語(yǔ)言則更為強(qiáng)大。一部分?jǐn)?shù)據(jù)庫(kù)能夠同時(shí)支持這兩種查詢(xún)方式。
另一個(gè)主要區(qū)別,則來(lái)自數(shù)據(jù)庫(kù)結(jié)構(gòu)本身。有些數(shù)據(jù)庫(kù)支持RDF,有些則支持所謂屬性圖。RDF模型屬于W3C標(biāo)準(zhǔn),最初用于對(duì)語(yǔ)義信息進(jìn)行編碼。屬性圖模型則往往更通用也更靈活。同樣的,一部分?jǐn)?shù)據(jù)庫(kù)能夠同時(shí)支持這兩種模型。
傳統(tǒng)用戶(hù)如何快速適應(yīng)圖查詢(xún)語(yǔ)言?
Oracle向常規(guī)SQL查詢(xún)語(yǔ)言中添加了圖搜索功能,由此為主數(shù)據(jù)庫(kù)實(shí)現(xiàn)了圖功能。這種名為PGQL(屬性圖查詢(xún)語(yǔ)言)的擴(kuò)展提供了一種簡(jiǎn)潔的方法,可供開(kāi)發(fā)者快速搜索圖片并創(chuàng)建關(guān)于匹配條件的頂點(diǎn)報(bào)告。其圖分析框架以數(shù)十種常見(jiàn)算法為起點(diǎn),通過(guò)擴(kuò)展逐步為基礎(chǔ)數(shù)據(jù)構(gòu)建起復(fù)雜的摘要。另外,它還同時(shí)支持屬性圖與RDF圖。
微軟在2017年向其SQL Server添加了圖功能,并使用匹配屬性模式的MATCH子句擴(kuò)展了其SQL版本。搜索操作可以通過(guò)命令式查詢(xún)的存儲(chǔ)過(guò)程進(jìn)行擴(kuò)展。Azure云中的Microsoft Cosmos數(shù)據(jù)庫(kù)支持Apache TinkerPop API,因此能夠支持所有Gremlin式查詢(xún)。
亞馬遜的主要圖數(shù)據(jù)庫(kù)為Amazon Neptune,同樣支持屬性圖與RDF圖。屬性圖可以使用Gremlin類(lèi)查詢(xún)進(jìn)行搜索,而RDF圖則適合由SPARQL進(jìn)行搜索。
IBM公司一直與多家圖數(shù)據(jù)庫(kù)廠(chǎng)商合作,例如Neo4J,并在自家云中提供相關(guān)的產(chǎn)品即服務(wù)。此服務(wù)名為IBM Graph,除了使用支持Gremlin的TinkerPop API以外,這項(xiàng)服務(wù)還提供其他用于基礎(chǔ)檢索的簡(jiǎn)單API。
后起之秀們的故事
近年來(lái),Neo4J已經(jīng)成為最具影響力的圖數(shù)據(jù)庫(kù)之一,而且目前仍是這一領(lǐng)域的領(lǐng)導(dǎo)者。但其仍是一家獨(dú)立企業(yè),因此在本文中同樣被納入“后起之秀”的范疇。順帶一提,其實(shí)很多參與圖數(shù)據(jù)庫(kù)市場(chǎng)的廠(chǎng)商都有著悠久的發(fā)展歷史。
Neo4J鼓勵(lì)其他公司通過(guò)OpenCypher項(xiàng)目使用其查詢(xún)語(yǔ)言Cypher。此外,Neo4J也是GQL標(biāo)準(zhǔn)化進(jìn)程的主要推動(dòng)者,同時(shí)支持使用GraphQL執(zhí)行一部分查詢(xún)。
TigerGraph選擇的是存儲(chǔ)屬性圖并使用GSQL進(jìn)行查詢(xún)的路線(xiàn),這是一種簡(jiǎn)化并發(fā)處理工實(shí)現(xiàn)大規(guī)模數(shù)據(jù)集擴(kuò)展能力的過(guò)程性方法。該數(shù)據(jù)庫(kù)背后的廠(chǎng)商提供一款復(fù)雜的可視化工具GraphStudio,能夠以產(chǎn)品及云服務(wù)的形式供用戶(hù)探索并查詢(xún)數(shù)據(jù)集內(nèi)容。
OrientDB則是一套開(kāi)源數(shù)據(jù)庫(kù),可使用Gremlin和SQL進(jìn)行查詢(xún)。它的締造廠(chǎng)商已經(jīng)被SQP所收購(gòu),因此相關(guān)產(chǎn)品目前正在與SAP自家產(chǎn)品線(xiàn)進(jìn)行集成。
ArangoDB在設(shè)計(jì)上支持圖與NoSQL文檔數(shù)據(jù)集。這款開(kāi)源數(shù)據(jù)庫(kù)既提供社區(qū)版,也提供服務(wù)形式的付費(fèi)商業(yè)版。其關(guān)聯(lián)的查詢(xún)語(yǔ)言被稱(chēng)為SQL,提供的是過(guò)程性數(shù)據(jù)搜索方法。
AllegoGraph存儲(chǔ)RDF圖,并使用SPARQL、RDFS++以及多種編程語(yǔ)言擴(kuò)展(例如邏輯編程語(yǔ)言Prolog,以及Allegro Common LISP)實(shí)現(xiàn)查詢(xún)。其知識(shí)圖譜瀏覽器Gruff能夠在常規(guī)網(wǎng)絡(luò)瀏覽器中運(yùn)行,借此實(shí)現(xiàn)可視化查詢(xún)。該產(chǎn)品同時(shí)適用于本地安裝和亞馬遜云科技等公有云平臺(tái)。
Ontotext專(zhuān)注于創(chuàng)建大型知識(shí)圖譜,其GraphDB可支持對(duì)RDF圖執(zhí)行SPARQL查詢(xún)。Ontotext提供三個(gè)版本(免費(fèi)版、標(biāo)準(zhǔn)版與企業(yè)版),三者的功能基本相同,但免費(fèi)版僅支持兩項(xiàng)并發(fā)查詢(xún)。
圖數(shù)據(jù)庫(kù)查詢(xún)語(yǔ)言有哪些局限?
圖查詢(xún)語(yǔ)言的核心,在于提供一種簡(jiǎn)潔的方式以搜索匹配特定模式的特定條目組合。但有些問(wèn)題,無(wú)論其內(nèi)容多么明確,都很難通過(guò)圖查詢(xún)語(yǔ)言得到有效回答。
以查找“團(tuán)”(即相互間高度連接的頂點(diǎn)子集)為例,雖然這個(gè)問(wèn)題本身屬于NP完全問(wèn)題,但可能難以通過(guò)圖查詢(xún)語(yǔ)言得到有效解決。隨著問(wèn)題規(guī)模的擴(kuò)大,尋找答案的時(shí)間往往呈指數(shù)級(jí)增長(zhǎng)——換句話(huà)說(shuō),這些問(wèn)題不具備可擴(kuò)展性。如果錯(cuò)誤使用圖查詢(xún)語(yǔ)言,我們很可能在不經(jīng)意間寫(xiě)出一條需要極長(zhǎng)時(shí)間才能解決的高成本查詢(xún)。