肖慶都 屈亮亮 侯霞
摘要:為了解決課程大綱課程編寫不規(guī)范的問題,并梳理課程之間的關(guān)系,使用JAVA技術(shù)與Neo4j圖數(shù)據(jù)圖設(shè)計(jì)并實(shí)現(xiàn)了一個(gè)知識圖譜系統(tǒng),可以發(fā)現(xiàn)課程大綱之間存在的問題,以及在知識圖譜中快速搜索課程信息。
關(guān)鍵詞:JAVA;圖數(shù)據(jù)庫;知識圖譜
中圖分類號:TP311 文獻(xiàn)標(biāo)識碼:A 文章編號:1009-3044(2017)36-0130-03
1 背景
關(guān)系型數(shù)據(jù)庫長期以來一直占市場主流。目前主流關(guān)系型數(shù)據(jù)庫管理系統(tǒng)有:SQL Server、MySQL、Oracle等。隨著網(wǎng)絡(luò)應(yīng)用程序的規(guī)模日漸變大,數(shù)據(jù)形式更加多樣化,關(guān)系型數(shù)據(jù)庫在數(shù)據(jù)建模和存儲(chǔ)中的一些缺陷和問題隨之凸顯而來。真實(shí)世界中很多數(shù)據(jù)關(guān)系是圖形的,圖數(shù)據(jù)庫可以更好地描述此類數(shù)據(jù)[1]。例如Neo4j就是一種圖形數(shù)據(jù)庫管理系統(tǒng)。
課程大綱由于人工編寫的原因,會(huì)存在一些問題。同時(shí)學(xué)生從課程單中很難清晰地梳理課程體系的關(guān)系。針對這類問題,本文提供了一種解決方案,基于Neo4j數(shù)據(jù)庫,使用JAVA編程語言,構(gòu)建課程體系的知識圖譜系統(tǒng),可以更加直觀地展示各個(gè)課程之間關(guān)系,并發(fā)現(xiàn)大綱中存在的問題。在并對特定節(jié)點(diǎn)的前驅(qū)進(jìn)行查詢并展示,替代手工查找,更加節(jié)省時(shí)間,便于對所需內(nèi)容的快速獲取。
2 相關(guān)概念
在圖計(jì)算中,基本的數(shù)據(jù)結(jié)構(gòu)表達(dá)式是:[G=V,E,V=vertex(節(jié)點(diǎn)),E=edge(邊)] 。圖數(shù)據(jù)庫中數(shù)據(jù)模型主要以節(jié)點(diǎn)和關(guān)系(邊)來體現(xiàn)[2],也可以處理鍵值對。數(shù)據(jù)具有如下特征:
l 包含節(jié)點(diǎn)和邊
l 節(jié)點(diǎn)上有屬性(鍵值對)
l 邊有名字和方向,并總是有一個(gè)開始節(jié)點(diǎn)和結(jié)束節(jié)點(diǎn)
l 邊也可以有屬性
Neo4j數(shù)據(jù)庫是一個(gè)高性能的NOSQL圖形數(shù)據(jù)庫,它將結(jié)構(gòu)化數(shù)據(jù)存儲(chǔ)在網(wǎng)絡(luò)上而不是表中。Neo4j也可以被看作是一個(gè)高性能的圖引擎,該引擎具有成熟數(shù)據(jù)庫的所有特性。具有以下優(yōu)點(diǎn):
l 自帶易于學(xué)習(xí)的查詢語言(名為Cypher)
l 不使用schema,可以滿足任何形式的需求
l 相比關(guān)系型數(shù)據(jù)庫,查詢速度要快上很多
l 實(shí)體與關(guān)系結(jié)構(gòu)非常自然地切合人類的直觀感受
l 支持JAVA進(jìn)行操作
l 提供可視化查詢控制臺(tái)
3 系統(tǒng)總體設(shè)計(jì)
系統(tǒng)設(shè)計(jì)目標(biāo):構(gòu)建一個(gè)課程體系的知識圖譜,數(shù)據(jù)存儲(chǔ)在圖數(shù)據(jù)庫中,界面展示知識圖譜,并可以根據(jù)特定的節(jié)點(diǎn)查詢所需內(nèi)容。
系統(tǒng)設(shè)計(jì)分為數(shù)據(jù)提取,數(shù)據(jù)存儲(chǔ),知識圖譜可視化及查詢。主要處理流程如圖1所示,包括如下步驟:
l 數(shù)據(jù)準(zhǔn)備和提?。簻?zhǔn)備Word形式的課程大綱和存儲(chǔ)課程性質(zhì)(如必修、選修等)的Excel文件;使用JAVA語言自動(dòng)化抽取Word,Excel中相應(yīng)信息,并將Word中文檔信息與Excel文檔中的信息進(jìn)行匹配;
l 數(shù)據(jù)存儲(chǔ):根據(jù)抽取信息構(gòu)建課程體系的知識圖譜,存儲(chǔ)到圖數(shù)據(jù)庫中;
l 圖譜的可視化及查詢:界面展示知識圖譜,并可基于圖譜進(jìn)行課程關(guān)系的查詢。
4 系統(tǒng)主要模塊設(shè)計(jì)
本節(jié)將給出系統(tǒng)的主要模塊的相關(guān)設(shè)計(jì)。
4.1 數(shù)據(jù)抽取
數(shù)據(jù)抽取是系統(tǒng)中最關(guān)鍵的基礎(chǔ)部分,對Word,Excel文檔進(jìn)行數(shù)據(jù)自動(dòng)化提取以及規(guī)范化。Word文檔數(shù)據(jù)抽取主要對表格處理,抽取課程名稱,先修課程。抽取得到的內(nèi)容需要進(jìn)行相應(yīng)處理,對于字符的大小寫以及特殊字符處理,如將所有的英文字符全部規(guī)定為大寫字符,以及所有含有特殊字符的數(shù)據(jù)處理為英文的特殊字符,例如:中文的括號、逗號等。Word課程大綱文檔結(jié)構(gòu)如圖2。
4.2 數(shù)據(jù)存儲(chǔ)
數(shù)據(jù)存儲(chǔ)首先需要將數(shù)據(jù)處理完畢,構(gòu)成知識圖譜。知識圖譜在數(shù)據(jù)庫中存儲(chǔ)結(jié)構(gòu)的示意圖如圖4所示。
數(shù)據(jù)類型分為必修,選修,以及未匹配三種類型,數(shù)據(jù)節(jié)點(diǎn)顏色不同,數(shù)據(jù)類型不同,更加直觀展示節(jié)點(diǎn)之間的關(guān)系以及節(jié)點(diǎn)的信息,便于進(jìn)行查找節(jié)點(diǎn)之間的關(guān)系。
單個(gè)數(shù)據(jù)節(jié)點(diǎn)的存儲(chǔ)結(jié)構(gòu):節(jié)點(diǎn)可擁有不同屬性值,節(jié)點(diǎn)的顏色會(huì)隨type類型的變化而變化。由于數(shù)據(jù)庫的特殊性,可以創(chuàng)建兩個(gè)除ID之外完全相同的節(jié)點(diǎn),在創(chuàng)建節(jié)點(diǎn)時(shí)尤其要注意字符的處理。
數(shù)據(jù)庫中信息節(jié)點(diǎn)可以文本類型查看,通過文本類型,可更加直觀展示單個(gè)節(jié)點(diǎn)的所包含的信息。
由于抽取的數(shù)據(jù)以及存儲(chǔ)的數(shù)據(jù)為中文信息,在圖數(shù)據(jù)庫中進(jìn)行存儲(chǔ)時(shí),要特別注意的是中文的字符的長度,特殊字符的中英文區(qū)別,否則將會(huì)創(chuàng)建多個(gè)相同的節(jié)點(diǎn)。造成知識圖譜的混亂。
存儲(chǔ)數(shù)據(jù)時(shí)首先要先檢查所要?jiǎng)?chuàng)建的節(jié)點(diǎn)以及關(guān)系在數(shù)據(jù)庫中是否存在,圖數(shù)據(jù)庫的特殊性在于如果不做事先處理,節(jié)點(diǎn)之間的關(guān)系可以存在多個(gè)關(guān)系,以及同樣的節(jié)點(diǎn)可以存在多個(gè),最終造成圖譜的混亂,達(dá)不到系統(tǒng)的設(shè)計(jì)要求。
4.3 知識圖譜展示以及查詢
知識圖譜展示需要首先將圖數(shù)據(jù)庫中節(jié)點(diǎn)信息抽取,使用插件將信息進(jìn)行解析,展示在界面中[3]。在界面中輸入特定節(jié)點(diǎn)信息,查詢與之相關(guān)的所有前驅(qū)節(jié)點(diǎn),并展示。
查詢算法設(shè)計(jì):
1) 輸入節(jié)點(diǎn)名稱n
2) 節(jié)點(diǎn)n在數(shù)據(jù)庫中存在,否則跳轉(zhuǎn)步驟12
3) Rset為空(Rset為與n相關(guān)節(jié)點(diǎn)的結(jié)果集),否則跳轉(zhuǎn)步驟5
4) 輸出節(jié)點(diǎn)n的信息
5) list集合存儲(chǔ)與n相關(guān)節(jié)點(diǎn)名稱
6) list不為空,否則跳轉(zhuǎn)步驟12
7) 遍歷list集合,對list中每個(gè)元素,查詢得到結(jié)果集Rset2
8) 移除當(dāng)前l(fā)ist中當(dāng)前查詢的節(jié)點(diǎn)名稱
9) 結(jié)果集Rest2不為空,否則跳轉(zhuǎn)步驟6
10) 繼續(xù)將與節(jié)點(diǎn)相關(guān)的元素添加到list集合中
11) 輸出節(jié)點(diǎn)信息,跳轉(zhuǎn)到步驟6
12) 結(jié)束
該算法采用遞歸方式,對輸入特點(diǎn)節(jié)點(diǎn)進(jìn)行查詢與之相關(guān)的節(jié)點(diǎn),從而達(dá)到對特定節(jié)點(diǎn)進(jìn)行查詢與之相連的所有節(jié)點(diǎn)的目的。算法中關(guān)鍵部分在于查詢到一個(gè)節(jié)點(diǎn)相連的所有節(jié)點(diǎn),如何對這些節(jié)點(diǎn)接著進(jìn)行查詢的問題。該算法采用list集合,存儲(chǔ)與節(jié)點(diǎn)相連的所有節(jié)點(diǎn),加入集合中。對集合進(jìn)行遍歷,查詢集合中每個(gè)節(jié)點(diǎn)的信息,并從集合中刪除該節(jié)點(diǎn)。算法關(guān)鍵流程如圖5所示。
5 系統(tǒng)的實(shí)現(xiàn)
5.1 抽取數(shù)據(jù)的技術(shù)
Jacob是Java與COM組件橋接的縮寫,即JAVA-COM Bridge。通過使用Jacob類庫,我們可以很方便地在Java程序中調(diào)用COM自動(dòng)化組件[4]。
Word中以表格形式存儲(chǔ)課程名稱,先修課程信息。表格有一定的規(guī)范性,只需要對表格特定位置進(jìn)行操作,即可獲取信息,將信息存放在HashMap中,以課程名稱作為鍵值,先修課程進(jìn)行規(guī)范化處理后,以List集合整體作為HashMap的值。由于HashMap的存儲(chǔ)特性,進(jìn)行存儲(chǔ)過程中首先檢查HashMap中是否存在相同的鍵,如果存在,即比較其值,選擇存儲(chǔ)。不存在相同的鍵,直接存儲(chǔ)。
在抽取Excel表中信息時(shí),首先針對Excel表進(jìn)行處理,保證課程名稱無重復(fù)信息,Excel表的規(guī)范性,只需要對特定表格進(jìn)行處理,即可得到相應(yīng)的課程信息,同樣使用HashMap進(jìn)行存儲(chǔ)課程名稱-課程類型。
使用Jacob相關(guān)方法對Word以及Excel文檔進(jìn)行操作,達(dá)到對數(shù)據(jù)進(jìn)行抽取以及處理的目的[5]。
5.2 數(shù)據(jù)展示的技術(shù)
數(shù)據(jù)展示采用D3.js插件來顯示圖數(shù)據(jù)中數(shù)據(jù)節(jié)點(diǎn)以及節(jié)點(diǎn)之間的關(guān)系[6],D3.js是一個(gè)JavaScript庫,它可以通過數(shù)據(jù)來操作文檔。D3.js可以通過使用HTML、SVG和CSS把數(shù)據(jù)鮮活形象地展現(xiàn)出來。
為了便于Neo4j和D3.js的數(shù)據(jù)交互,采用JSON格式形式進(jìn)行前后臺(tái)的數(shù)據(jù)交互[7],如
{source:"1",target:”2”, type:”選修”,type2:”必修”,rela:”先修”}
使用插件對JSON數(shù)據(jù)進(jìn)行解析,得到源節(jié)點(diǎn),目標(biāo)節(jié)點(diǎn),源節(jié)點(diǎn)的類型,目標(biāo)節(jié)點(diǎn)的類型,源節(jié)點(diǎn)與目標(biāo)節(jié)點(diǎn)直接的關(guān)系這些信息。D3.js通過解析這些信息進(jìn)行圖譜的可視化[8]。
6 實(shí)驗(yàn)結(jié)果
通過對Word和Excel文檔進(jìn)行信息抽取,從Word中獲取到課程信息,前驅(qū)課程即課程之間的關(guān)系,從Excel中獲取課程名稱和課程類型,將課程信息進(jìn)行比對,得到課程名稱,課程類型以及課程之間的關(guān)系即前驅(qū)。在數(shù)據(jù)庫中構(gòu)建課程知識體系圖譜,知識體系圖譜如圖6所示。
針對課程知識體系圖譜可以查詢到指定課程的前驅(qū)課程,輸入指定課程名稱例如:計(jì)算機(jī)網(wǎng)絡(luò)。查詢結(jié)果如圖7所示。
7 結(jié)束語
本篇文章主要介紹了從最初的設(shè)計(jì)到最終實(shí)現(xiàn)知識圖譜系統(tǒng)的相關(guān)內(nèi)容,圖譜不僅僅可以用在構(gòu)建知識體系圖譜,可以運(yùn)用到家庭圖譜、交通網(wǎng)絡(luò)、社交網(wǎng)絡(luò)等等,圖譜的應(yīng)用較為廣泛,生活中的方方面面都可以使用圖譜。構(gòu)建知識圖譜來發(fā)現(xiàn)知識體系中存在的問題,并進(jìn)行加以解決,通過知識圖譜更加快捷地查找到所需要的內(nèi)容,以及發(fā)現(xiàn)節(jié)點(diǎn)與節(jié)點(diǎn)之間的關(guān)系。
通過頁面展示與數(shù)據(jù)庫展示可以快速發(fā)現(xiàn)數(shù)據(jù)之間的關(guān)系以及存在的問題,頁面展示可以快速查詢所需節(jié)點(diǎn)與之相關(guān)的信息。
參考文獻(xiàn):
[1] 姜洋, 彭智勇, 彭煜瑋. 基于圖數(shù)據(jù)庫的在線族譜編錄系統(tǒng)[J]. 計(jì)算機(jī)應(yīng)用, 2015, 35(1):125-130.
[2] 程耀東, 趙建昌, 徐軍. 圖形數(shù)據(jù)庫應(yīng)用技術(shù)研究[J]. 工程圖學(xué), 2006, 27(1):143-148.
[3] 宋海軍. 基于Web的數(shù)據(jù)庫檢索系統(tǒng)的實(shí)現(xiàn)[J]. 中國科技信息工程論壇, 2005(5):96.
[4] 李瑞, 李永剛. JAVA中基于JACOB的COM 組件調(diào)用研究[J]. 微計(jì)算機(jī)信息, 2007 , 23(15):168-170.
[5] 王春明, 朱曉輝, 陸天捷. 基于 JACOB 的 Word 文檔自動(dòng)生成技術(shù)研究[J]. 南通職業(yè)大學(xué)學(xué)報(bào), 2012 , 26(1):77-80.
[6] 張運(yùn)良, 張兆鋒, 張曉丹, 等. 使用D3.js的知識組織系統(tǒng)Web動(dòng)態(tài)交互可視化功能實(shí)現(xiàn)[J]. 現(xiàn)代圖書情報(bào)技術(shù), 2013, 29(7):127-131.
[7] 陳衛(wèi)衛(wèi), 王艷. 基于NoSQL數(shù)據(jù)庫的通用數(shù)據(jù)存儲(chǔ)結(jié)構(gòu)的設(shè)計(jì)方案[J]. 價(jià)值工程, 2012, 31(26):191-192.
[8] 權(quán)鑫. 基于D3.js的數(shù)據(jù)可視化系統(tǒng)框架設(shè)計(jì)與實(shí)現(xiàn)[D]. 北京: 北京交通大學(xué) , 2016.