Neo4J可能是當(dāng)下人氣最高的圖形數(shù)據(jù)庫。從名稱我們就能看出Neo4J在設(shè)計(jì)上主要考慮到Java應(yīng)用程序的實(shí)際需求,但它同時(shí)也支持Python。Neo4J屬于開源項(xiàng)目,共有GPLv3社區(qū)版、高級(jí)版、企業(yè)版三種版本;后兩者都以AGPLv3商業(yè)許可為基礎(chǔ)。
Neo4J中的圖形模型如圖一所示。簡單來說:
·節(jié)點(diǎn)與邊線可以被賦予屬性(鍵-值對(duì));
·只有邊線能夠與類別相關(guān)聯(lián),例如“KNOWS”;
·邊線可以指定為有指向或無指向。
▲圖一
由于節(jié)點(diǎn)名稱的存在,如果大家想在圖中找到對(duì)應(yīng)節(jié)點(diǎn),那么必須依靠索引。Neo4J使用以下索引機(jī)制:一個(gè)超級(jí)參考節(jié)點(diǎn)通過一條特殊類別的邊線“REFERENCE”與所有節(jié)點(diǎn)相連。這實(shí)際上允許我們創(chuàng)建多個(gè)索引,借以通過不同的邊線類別對(duì)其加以區(qū)分。索引結(jié)構(gòu)如圖二所示。
▲圖二
Neo4J還提供了一些特殊功能,例如列出特定節(jié)點(diǎn)的相鄰諸節(jié)點(diǎn)或是兩節(jié)點(diǎn)間長度最短的諸類路徑等。請(qǐng)注意,要使用上述各類“遍歷”功能,Neo4J要求大家指定路徑中經(jīng)過的邊線類別,其實(shí)這一點(diǎn)并不麻煩。
其實(shí)大家不必將Neo4J作為軟件加以安裝。我們完全可以簡單地導(dǎo)入JAR文件來建立一套嵌入式圖形數(shù)據(jù)庫,該操作將在硬盤上建立對(duì)應(yīng)的目錄。具體信息在Neo4J的說明文檔中已經(jīng)相當(dāng)完備,而且其免費(fèi)版本也沒有設(shè)置節(jié)點(diǎn)支持?jǐn)?shù)量的上限。
缺點(diǎn):
·盡管我們可以手動(dòng)為節(jié)點(diǎn)類別通過“type”鍵添加注釋,但相比之下為節(jié)點(diǎn)類別在API中提供本地支持無疑更好,因?yàn)檫@將使圖形模型更具普遍意義。另外一旦某個(gè)節(jié)點(diǎn)具備多種不同類別,麻煩也將隨之而來。
·由用戶手動(dòng)為新邊線設(shè)置索引機(jī)制似乎有點(diǎn)奇怪并且很不方便。最好是采用如今關(guān)系類數(shù)據(jù)庫的普遍做法:用戶只需表明要“為一組節(jié)點(diǎn)創(chuàng)建索引”,工作即可完成。
2. Infinite Graph (Objectivity Inc.出品)
InfiniteGraph 是一款由Objectivity公司推出的圖形類數(shù)據(jù)庫,該公司還推出過一款同名的對(duì)象類數(shù)據(jù)庫。免費(fèi)許可版本只能支持最高100萬節(jié)點(diǎn)及邊線總數(shù)。InfiniteGraph需要作為服務(wù)項(xiàng)目加以安裝,這與以MySQL為代表的傳統(tǒng)數(shù)據(jù)庫頗為相似。InfiniteGraph借鑒了Objectivity/DB中的面向?qū)ο蟾拍睿虼似渲械拿恳粋€(gè)節(jié)點(diǎn)及邊線都算作一個(gè)對(duì)象。尤其是:
·所有節(jié)點(diǎn)類都將擴(kuò)展BaseVertex基本類;
·所有邊線類都將擴(kuò)展BaseEdge基本類。
在 http://wiki.infinitegraph.com/w/index.php?title=Tutorial:_Hello_Graph!中所顯示的展示頁面中,假設(shè)人是一個(gè)節(jié)點(diǎn)類、而會(huì)議算作為邊線類。以下是將一條邊線加入到兩個(gè)節(jié)點(diǎn)之間的代碼:
Person john = new Person("John", "Hello ");
helloGraphDB.addVertex(john);
Person dana = new Person("Dana", "Database!");
helloGraphDB.addVertex(dana);
Meeting meeting1 = new Meeting("NY", "Graph");
▲圖三
InfiniteGraph還提供了一套可視化工具用以查看數(shù)據(jù)。由上述代碼所生成的邊線將如圖三所示呈現(xiàn)出可視化效果。相比Neo4J在圖一中所展現(xiàn)的圖形模型,InfiniteGraph能夠支持同時(shí)具備多種不同類別/類的節(jié)點(diǎn)。請(qǐng)注意,Neo4J中的鍵-值對(duì)能夠?qū)?yīng)InfiniteGraph類中的成員變量。
缺點(diǎn):
·作為服務(wù)項(xiàng)目進(jìn)行安裝本身沒什么問題,但配置過程完全可以更簡單些。
·由于節(jié)點(diǎn)與邊線都能成為用戶的定義對(duì)象,因此在靈活性得到保證的情況下,作者懷疑當(dāng)其處理龐大的圖形結(jié)構(gòu)時(shí),性能方面將受到嚴(yán)重影響。請(qǐng)大家記住,NoSQL數(shù)據(jù)庫一直以來所贏得的廣泛關(guān)注都建立在其始終傲人的性能表現(xiàn)上。
3. DEX (Sparsity Technologies出品)
DEX一直被形容為一款具備高性能及優(yōu)秀可擴(kuò)展性的圖形類數(shù)據(jù)庫,這對(duì)于NoSQL應(yīng)用程序來說無疑擁有相當(dāng)強(qiáng)的吸引力。其個(gè)人評(píng)估版本最多可支持100萬個(gè)節(jié)點(diǎn)。目前最新的版本是4.2,同時(shí)支持Java及.Net編程。請(qǐng)注意,舊的4.1版本只支持Java,且無法與新版本相兼容。直到文章截止之日(2011年11月24日),4.2版本的說明文檔仍不完備,而且很難在網(wǎng)上找到新版本的使用指導(dǎo)。
▲圖四
圖四展示的是DEX的架構(gòu),這也解釋了為什么DEX能夠達(dá)成如此優(yōu)異的性能表現(xiàn)。本地C++ DEX核心正是關(guān)鍵所在。在此活動(dòng)頁面中,DEX項(xiàng)目團(tuán)隊(duì)演示了以其為基礎(chǔ)的數(shù)款令人興奮的應(yīng)用程序:
·書目探索: DEX使用實(shí)例,存儲(chǔ)著DBLP(即數(shù)字書目索引與圖書館項(xiàng)目)中的所有數(shù)據(jù)
·在DEX中載入Twitter:其中包括45億個(gè)圖形;
·在DEX及Query中載入維基百科:效果明顯好于Neo4J。
DEX在安裝方面同樣簡便,大家只需要一個(gè)JAR文件并加以運(yùn)行即可。與Neo4J不同,DEX的當(dāng)前數(shù)據(jù)庫只是一個(gè)單獨(dú)的文件。DEX Java API同樣易于使用,而圖形類則幾乎能夠提供任何一項(xiàng)大家需要的操作。不過DEX也并非完善無缺,相信摒除下列缺點(diǎn)的DEX會(huì)在發(fā)展的道路上走得更遠(yuǎn):
·最好將個(gè)人版的節(jié)點(diǎn)上限數(shù)量提升到10億;
·盡快提供完備的說明文檔與更好的應(yīng)用實(shí)例;
·在短期之內(nèi)將舊版本中的圖形算法移植到新版本中。
4. InfoGrid (Netmesh Inc.出品)
InfoGrid一直標(biāo)榜自己是一款“網(wǎng)頁圖形數(shù)據(jù)庫”,也就是說它的某些功能主要面向網(wǎng)頁應(yīng)用程序。圖五展示了InfoGrid的整體框架,而圖形數(shù)據(jù)庫在其中所扮演的似乎并不是主要組成部分。InfoGrid在OpenID項(xiàng)目中也擁有幾款應(yīng)用程序,該項(xiàng)目同樣由Netmesh公司所支持。作者懷疑InfoGrid這套東西其實(shí)只在Netmesh公司內(nèi)部使用,因?yàn)樗嬖谥韵掠矀?/p>
·此處公布的最新Java API并不完善,且在某些地方有混淆情況;
·此處公布的使用教程語意含糊且不夠正式。
▲圖五
點(diǎn)擊如下鏈接 http://infogrid.org/wiki/Examples/FirstStep可以查看首個(gè)應(yīng)用實(shí)例。雖然總體來說在閱讀方面沒什么難度,但像TAGLIBRARY, TAG, TAG_LABEL以及TAGLIBRARY_COLLECTS_TAG這類內(nèi)容的大量出現(xiàn)卻讓人相當(dāng)困惑。這些內(nèi)容似乎嵌入在模塊當(dāng)中,為什么會(huì)這樣?看起來該應(yīng)用實(shí)例其實(shí)是用在Netmesh公司的某個(gè)內(nèi)部項(xiàng)目中的,旨在為某些特定應(yīng)用程序提供服務(wù)。
5. HyperGraphDB (Kobrix Inc.出品)
HyperGraphDB是一套開源數(shù)據(jù)存儲(chǔ)機(jī)制,并依托于BerkeleyDB數(shù)據(jù)庫存在。HyperGraphDB的圖形模型被稱為直接式超圖形。從數(shù)學(xué)角度來講,超圖形允許其一條邊線指向兩個(gè)以上的節(jié)點(diǎn)。HyperGraphDB在此基礎(chǔ)上更進(jìn)一步,允許一條邊線指向其它邊線,如此一來HyperGraphDB在概括性方面就大大超過了其它圖形類數(shù)據(jù)庫。圖六顯示的就是四條邊線在超圖形實(shí)例中的情況,各邊線以不同顏色加以區(qū)分。
▲圖六
HyperGraphDB教程似乎比較完備。HyperGraphDB中的每個(gè)節(jié)點(diǎn)被稱為一個(gè)原子,而索引及遍歷等操作也得到了良好的支持。
備注:盡管這份教程寫得不錯(cuò),但同樣的錯(cuò)誤提示“….dll: Can’t find dependent libraries”仍然在Win 7操作系統(tǒng)中出現(xiàn)。在作者改用Ubuntu 64位系統(tǒng)后,示例程序彈出如下異常信息:“ELFCLASS32 (錯(cuò)誤原因分析:架構(gòu)字元寬度不匹配)”。這可能是因?yàn)镠yperGraphDB只支持32位Linux系統(tǒng)。
6. Trinity (微軟出品)
微軟不久之前才剛剛攜Trinity首個(gè)發(fā)布版本V0.1(只允許企業(yè)內(nèi)網(wǎng)接入)加入角逐。根據(jù)介紹,Trinity是一款基于內(nèi)存的圖形存儲(chǔ)機(jī)制,且具備豐富的數(shù)據(jù)庫功能,其中包括高并行性聯(lián)機(jī)查詢處理、ACI事務(wù)支持等等。在圖形處理方面,Trinity只為用戶提供了C# API。
由于Trinity軟件包還不對(duì)微軟公司之外公開,因此目前尚無法獲悉更多細(xì)節(jié)信息。不過至少Trinity擁有以下關(guān)鍵性功能:
·使用超圖形作為數(shù)據(jù)模型;
·適合部署于公布式模型中。
Trinity的系統(tǒng)架構(gòu)可點(diǎn)此查看。總體而言,在將Trinity與其它開源圖形類數(shù)據(jù)庫進(jìn)行比較時(shí),我們很難發(fā)現(xiàn)它所獨(dú)有的明顯優(yōu)勢。然而,由于Trinity仍處于開發(fā)原型階段,因此適當(dāng)加以關(guān)注也是必要的。此外,Probase作為一個(gè)進(jìn)行中的項(xiàng)目,似乎在本體論/分類法知識(shí)方面將Trinity當(dāng)成了理論基礎(chǔ)。點(diǎn)擊此處可以查看另一篇討論P(yáng)robase與Trinity的好文。
7. AllegroGraph (Franz Inc.出品)
AllegroGraph是一款老牌圖形類數(shù)據(jù)庫了,據(jù)稱其負(fù)載“數(shù)十億RDF(即資源描述框架)三元組仍可保持高性能”。盡管RDF三元組可以作為邊線來處理,但AllegroGraph的原本設(shè)計(jì)意圖是創(chuàng)建以RDF為中心的語義網(wǎng)絡(luò)應(yīng)用程序,并支持SPARQL、RDFS++以及Prolog等由包括Java程序在內(nèi)的各類客戶應(yīng)用推衍得出的程序。AllegroGraph RDFStore免費(fèi)版本支持最多5000萬個(gè)三元組。
▲圖七
圖七展示的正是RDF圖形實(shí)例。AllegroGraph為每個(gè)三元組配備了一個(gè)名為“命名圖”的額外接口,這就使得三元組成為四邊形結(jié)構(gòu)(但為了方便起見仍稱其為三元組)。以下是作者根據(jù)圖七內(nèi)容所做出的判斷:
主語 謂語 對(duì)象 圖形
Robbie …的寵物 jans jans的主頁
…的寵物 反義 擁有寵物 英語語法
狗 子分類 哺乳動(dòng)物 科學(xué)
要在RDF圖形中添加大量三元組,AllegroGraph提供了一套批量加載N個(gè)三元組與RDF/XML文件的工具。總而言之,AllegroGraph是RDF存儲(chǔ)的上佳選擇,但一般圖形則不太適合用這套方案。說明文檔似乎相當(dāng)冗長。點(diǎn)擊此處可以查看介紹與Java API教程,Sesame版本點(diǎn)此而Jena版本點(diǎn)此。
總體比較
總體比較結(jié)果如下表所示。每款產(chǎn)品似乎都支持高性能及分布式部署。“1M”是指對(duì)應(yīng)圖形數(shù)據(jù)庫可以支持100萬個(gè)免費(fèi)節(jié)點(diǎn)。RDF圖形可以被看作一種特殊屬性的圖形。由于超圖形是目前圖形格式中最常見的類型,因此支持超圖形的數(shù)據(jù)庫在理論上也應(yīng)該會(huì)支持屬性圖形。
Neo4j | InfiniteGraph | DEX | InfoGrid | HyperGraphDB | Trinity | AllegroGraph | |||
說明文檔質(zhì)量 | 好 | 好 | 一般 | 差 | 好 | 差 | 好 | ||
便攜性如何 | 好 | 差 | 好 | 好 | 好 | 差 | 差 | ||
是否支持Java | 是 | 是 | 是 | 是 | 是 | 否 | 是 | ||
是否免費(fèi) | 是 | < 1M | < 1M | 是 | 是 | 否 | < 50 M | ||
是否支持屬性圖 | 是 | 是 | 是 | 是 | 是 | 是 | RDF | ||
是否支持超圖形 | 否 | 否 | 否 | 否 | 是 | 是 | 否 | ||
基于對(duì)上述圖形數(shù)據(jù)庫的分析,我們可以選擇我們自己需要的數(shù)據(jù)庫做我們自己的應(yīng)用,拿出自己的拳頭產(chǎn)品。
參考資料:
http://neo4j.org/
http://objectivity.com/
http://sparsity-technologies.com/
http://infogrid.org/
http://www.hypergraphdb.org/
http://database.51cto.com/art/201103/251198.htm
http://www.franz.com/agraph/allegrograph/
http://tech.it168.com/a2012/0112/1302/000001302117_all.shtml
http://www.infoq.com/cn/articles/graph-nosql-neo4j
http://blog.csdn.net/jianyi7659/article/details/8025742
聲明:本網(wǎng)頁內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問題請(qǐng)及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com