摘 要:圖形數據庫支持C/S結構與內嵌式部署2種方式,而內嵌式部署因使用簡單方便而廣受關注。以教育領域中論文作者合作關系圖譜為例對圖形數據庫的嵌入式應用進行研究,提供一種快速、動態的學術合作關系存儲方法。研究表明圖形數據在數據庫創建、查詢、更新等方面表現出很高的易用性,特別特別適合處理大量復雜、動態、互連接、低結構化的數據,是一種解決社交網絡、信息可視化等領域海量關聯數據存儲的有效方法。
關鍵詞:圖形數據庫; 人物關系圖譜; 關聯數據; Neo4j
中圖分類號:TN91934 文獻標識碼:A 文章編號:1004
圖狀模型是對層次模型的進一步發展,其本質是將數據組織為圖的形式,對數據庫系統的各種增、刪、改、查操作變成對圖的遍歷與搜索。作為NoSQL數據庫的一種,圖數據庫很長時間多局限于學術與實驗室,隨著Web 2.0的發展,數據間的關聯與數據變得同等重要。在社交網絡Facebook、電子商務、資源檢索等領域[1]存在大量的關聯數據,急切需要一種能夠處理復雜關聯的存儲技術,圖形數據庫才逐漸從實驗室走出,因為采用圖形數據來存儲和計算這些海量的數據更加有效。這極大地推動了圖形數據庫的快速發展。 現在比較成熟的圖像數據庫包括 Twitter 的FlockDB,以及開源項目中的Neo4j 和Infogrid等。
Neo4j是基于Java的圖形數據庫[2],它遵循著屬性圖形數據模型。相對于關系數據模型來說,Neo4j重點解決了擁有大量連接的傳統RDBMS在查詢時出現的性能衰退問題。通過圍繞圖形進行數據建模,Neo4j會以相同的速度遍歷結點與邊,其遍歷速度與構成圖形的數據量沒有任何關系。此外,Neo4j還提供了非??斓膱D形算法、推薦系統和OLAP風格的分析,而這一切在目前的RDBMS系統中都是無法實現的。Neo4j是一個高性能、高可抗靠性、可擴展的、完全兼容ACID的圖數據庫。它完全由Java語言實現,能夠部署到多種系統上。在Neo4j中,數據以一種針對圖網絡進行過優化的格式保存在磁盤上。Neo4j的內核是一種極快的圖引擎,具有數據庫產品期望的所有特性,如恢復、兩階段提交、符合XA等。下面我們將針對圖形數據庫Neo4j的實際應用進行闡述,并與關系數據庫進行比較。
1 Neo4j的應用模式
Neo4j支持2種應用模式[3],分別是內嵌模式和服務器模式。內嵌模式將數據庫文件內嵌到應用程序中,作為程序的一個單獨數據庫,供應用程序內部自行調用。服務器模式將Neo4j作為單獨的服務器進行部署,利用REST風格的方式進行調用,服務器模式時,系統由2部分組成:
(1) 客戶端通過RMI方式發送命令到服務器;
(2) 服務器接收并處理這些命令,返回執行后的結果。在這種應用模式下,Neo4j通過Cypher查詢語言來進行圖的搜索與查詢操作。Cypher是一個描述性的圖查詢語言,允許不必編寫圖形結構的遍歷代碼就可實現對圖的存儲和效率查詢。Cypher不同于Java或腳本語言,而更類似于關系數據庫中的SQL語言。
在內嵌應用程序的應用模式下,應用程序直接使用Neo4j數據庫,開發者可以通過JavaAPI直接與圖模型交互,這個API提供了非常靈活的數據結構。通俗的說就是通過直接編碼的方式與Neo4j圖數據庫交互。接下來我們將主要闡述內嵌應用模式。
2 Neo4j內嵌模式數據庫創建
下面通過一個簡單的例子來展示Neo4j的基本功能。圖1的這個小型圖是文獻作者合作關系與論文引用關系圖譜,共有四種關系類型,分別是WRITE,WRITE_BY,COAUTHOR,CITE和CITE_BY。
圖1 論文作者合作關系與論文引用創建圖形數據庫的步驟如下(Java表示):
Step 1:使用枚舉來表示結點間的關系類型:
enum Relationships implements RelationshipType { COAUTHOR,WRITE,CITE }
Step 2:調用內嵌模式創建接口,在DB_PATH路徑下建立一個新的圖數據庫,該路徑人為指定,如果數據庫已經存在則直接打開,否則新建數據庫。
graphDb = new EmbeddedGraphDatabase(DB_PATH);
Step 3:創建圖,存儲作者、論文及其內在關聯,對圖的所有修改均放在事務中,從而保證數據的完整性。
public void createGraph() {
Transaction tx = graphDb.beginTx();
try {
Node Miche = graphDb.createNode(); Miche.setProperty(\"name\", \"Miche\");
Node Robert = graphDb.createNode();Robert.setProperty(\"name\", \"Robert\");
Node Mike = graphDb.createNode();Mike.setProperty(\"name\", \"Mike\");
Node Jim = graphDb.createNode();Jim.setProperty(\"name\", \"Jim\");
Node rc = graphDb.createNode();rc.setProperty(\"name\", \"Reading Comprehension\");
Node ew = graphDb.createNode();ew.setProperty(\"name\", \"English Writing\");
Node er = graphDb.createNode();er.setProperty(\"name\", \"English Reading\");
Miche.createRelationshipTo(Robert, Relationships.COAUTHOR);
Miche.createRelationshipTo(Mike, Relationships.COAUTHOR);
Mike.createRelationshipTo(Jim, Relationships.COAUTHOR);
Robert.createRelationshipTo(Jim, Relationships.COAUTHOR);
Miche.createRelationshipTo(Robert, Relationships.COAUTHOR);
Mike.createRelationshipTo(rc, Relationships.WRITE);
Mike.createRelationshipTo(ew, Relationships.WRITE);
Jim.createRelationshipTo(ew, Relationships.WRITE);
Jim.createRelationshipTo(er, Relationships.WRITE);
rc.createRelationshipTo(ew, Relationships.CITE);
ew.createRelationshipTo(er, Relationships.CITE);
tx.success();
} catch (Exception e) {tx.failure();} finally {tx.finish(); }}
在事務提交過程中,tx.success()只是測試事務是否能夠成功提交,并沒有真正提交事務。事務的最終提交由tx.finish()完成。
3 Neo4j內嵌模式數據庫檢索
在數據庫創建后,可以進行查詢、插入、更新、刪除等基本操作,下面通過一個簡單的問題“Mike寫了哪些論文?”來描述Neo4j圖數據庫的查找功能。這里,只需查看“Mike”結點的“WRITE”關系便可以找出他寫過的論文:
for (Relationship rel : Mike.getRelationships(Relationships.WRITE)) {
Node paper = rel.getOtherNode(Mike);
System.out.println(paper.getProperty(\"name\"));}
檢索結果為“Reading Comprehension”和“English Writing”。這只是簡單的查詢,對于復雜查詢,則需借助于功能強大Neo4j TraverserAPI接口,它可以完成非常復雜的遍歷描述和過濾器。它由Traverser和ReturnableEvaluator模塊組成,前者計算StopEvaluator來獲知何時停止,后者則用于計算在結果中應該包含哪些結點。此外,還可以指定要遍歷關系的類型和方向。Traverser實現了Java的Iterator接口,負責延遲加載和遍歷整個圖,在結點被首次要求訪問時進行。它還內置了一些常用的Evaluator和缺省值,上面的查詢采用TraverserAPI時的流程如下:
Traverser papers = neo.traverse(Order.BREADTH_FIRST,StopEvaluator.DEPTH_ONE,
ReturnableEvaluator.ALL_BUT_START_NODE, Relationships.WRITE, Direction.BOTH);
for (Node paper : papers) { System.out.println(paper.getProperty(\"name\"));
TraverserAPI在繼續訪問更深一級的結點之前首先從起點訪問處于同一深度的所有結點(Order.BREADTH_FIRST),在深度為1的一次遍歷后停止(StopEvaluator.DEPTH_ONE),然后返回除了起點(\"Mike\")之外的所有結點(ReturnableEvaluator.ALL_BUT_START_NODE)。在兩個方向只遍歷類型為WRITE的關系。通過使用TraverserAPI可以完成非常復雜的遍歷操作。
4 結 語
通過以上實例可以看出,圖形數據庫的創建與維護異常簡單,結點的屬性可以動態變化,結點之間的邊可以也可以自由增減,這對于關系數據庫來講非常困難??梢妶D數據庫更善于處理大量復雜、動態、互鏈接、低結構化的數據。在關系數據庫中,這些查詢會導致大量的表鏈接,因此會產生性能上的問題。圖數據庫重點解決了擁有大量鏈接的傳統 RDBMS在查詢時出現的性能衰退問題。通過圍繞圖形進行數據建模,圖數據庫會以相同的速度遍歷結點與邊,其遍歷速度與構成圖的數據量沒有任何關系。此外,Neo4j還提供了非??斓膱D形算法、推薦系統和OLAP風格的分析,而這一切在目前的RDBMS系統中都是無法實現的\[4\]。
參 考 文 獻
[1] 于戈.云計算環境下的大規模圖數據處理技術\[J\].計算機學報,2011(10):17561765.
[2] Anon. Neo4j tutorial \[EB/OL\]. \[20120213\]. http://docs.neo4j.org/chunked/stable/tutorials.html.
[3] Anon. Neo4j API documentation \[EB/OL\]. \[20111118\]. http://api.neo4j.org.
[4] 唐箭,虢莉娟,龔濤.基于云計算的終身教育服務平臺設計\[J\].現代電子技術,2010,33(12):4346.
[5] 曾麗君,張紅梅,李中林.云計算及其在軍事上的應用探討\[J\].現代電子技術,2009,32(23):2326.
[6] 鄭貴德,陳明.以云計算為后臺的負載均衡技術\[J\].現代電子技術,2012,35(9):7780.
[7] 李文娟,那彥.基于云計算及圖像內容分析的醫學圖像融合方法\[J\].電子科技,2011(3):2226.
[8] 劉曉樂.計算機云計算及其實現技術分析\[J\].電子科技,2009(12):100102.
[9] 程飛,黃曦.基于OGRE的三維紅外云仿真\[J\].電子科技,2010(6):47.
[10] 趙廣才,張雪萍.云計算技術分析及其展望\[J\].電子設計工程,2011(22):47.
作者簡介: 王余藍 女,西安交通大學外國語學院。研究方向為信息系統、實驗室管理。