胡 歡 云紅艷 賀 英 張秀華
(1.青島大學(xué)計(jì)算機(jī)科學(xué)技術(shù)學(xué)院 青島 266071)(2.青島大學(xué)電子信息學(xué)院 青島 266071)
進(jìn)入21世紀(jì),隨著互聯(lián)網(wǎng)的蓬勃發(fā)展以及知識(shí)的爆炸式增長,搜索引擎被廣泛使用。但面對(duì)互聯(lián)網(wǎng)上不斷增加的海量信息,僅包含網(wǎng)頁和網(wǎng)頁之間鏈接的傳統(tǒng)文檔萬維網(wǎng)已經(jīng)不能滿足人們迅速獲取所需信息的需求[1]。人們期望以更加智能的方式組織互聯(lián)網(wǎng)上的資源,期望可以更加快速、準(zhǔn)確、智能地獲取到自己需要的信息。為了滿足這種需求,知識(shí)圖譜應(yīng)運(yùn)而生[2]。當(dāng)然,知識(shí)圖譜并非是一個(gè)全新的領(lǐng)域,早在2006年,萬維網(wǎng)之父Berners-Lee就提出了鏈接數(shù)據(jù)的思想,人們可以將開放鏈接數(shù)據(jù)(linked open data)項(xiàng)目中去,通過將不同資源以URL來標(biāo)識(shí),來實(shí)現(xiàn)數(shù)據(jù)的無縫互聯(lián)和知識(shí)融合。
近些年,學(xué)者在各個(gè)角度對(duì)扶貧領(lǐng)域做了研究。如從文化扶貧視角、金融扶貧視角、游扶貧視角、精準(zhǔn)扶貧視角等對(duì)扶貧領(lǐng)域的研究成果進(jìn)行了梳理。但是,上述研究的內(nèi)容都是從比較單一的角度對(duì)文獻(xiàn)回顧[3]。知識(shí)圖譜能夠有效地組織多源數(shù)據(jù)源,將其內(nèi)部隱含的單層乃至多層關(guān)系,通過目前較為流行的圖數(shù)據(jù)庫,展現(xiàn)在網(wǎng)頁端。使知識(shí)更加凝聚,內(nèi)容更加明顯,有利于整合資源、查看資源、獲取資源。本文基于重慶的貧困數(shù)據(jù)源,構(gòu)建一套半自動(dòng)化生成知識(shí)圖譜以及查詢知識(shí)圖譜的工具。
由于手工構(gòu)建知識(shí)圖譜的不便和自動(dòng)構(gòu)建圖譜的不可實(shí)現(xiàn)性。本文基于重慶貧困數(shù)據(jù)源,構(gòu)建一套半自動(dòng)化生成知識(shí)圖譜以及查詢知識(shí)圖譜的工具。完成的功能包括導(dǎo)入數(shù)據(jù)、語義映射、查看圖譜。導(dǎo)入數(shù)據(jù)功能模塊解析關(guān)系數(shù)據(jù)庫中的數(shù)據(jù)源轉(zhuǎn)化為csv文件,且自動(dòng)生成圖數(shù)據(jù)庫Neo4j中生成圖節(jié)點(diǎn)的LOAD語句。語義映射功能模塊通過語義映射算法,得到關(guān)系數(shù)據(jù)庫中表與表之間存在的關(guān)系,用于自動(dòng)生成在圖數(shù)據(jù)庫Neo4j中生成關(guān)系節(jié)點(diǎn)的MATCH語句。查看圖譜功能模塊中,首先,將存儲(chǔ)在Neo4j中的關(guān)系圖用Echarts組件顯示在前端界面;其次,用戶輸入關(guān)系或人物關(guān)鍵字,通過Echarts組件將計(jì)算封裝的數(shù)據(jù)顯示成對(duì)應(yīng)的知識(shí)圖譜。
系統(tǒng)的整體框架(如圖1所示)遵循三層架構(gòu)的設(shè)計(jì)思想,從下到上依次為數(shù)據(jù)層、業(yè)務(wù)層、表現(xiàn)層,按照“強(qiáng)內(nèi)聚,弱耦合”的思想將業(yè)務(wù)領(lǐng)域進(jìn)行劃分。數(shù)據(jù)層主要將關(guān)系數(shù)據(jù)庫中數(shù)據(jù)源,自動(dòng)生成LOAD語句導(dǎo)入圖數(shù)據(jù)庫Neo4j中;獲取關(guān)系數(shù)據(jù)庫中的表名以及字段名,解析構(gòu)建的OWL文件,自動(dòng)生成MATCH語句導(dǎo)入圖數(shù)據(jù)庫Neo4j中,為上層的業(yè)務(wù)邏輯提供數(shù)據(jù)來源。業(yè)務(wù)層是連接表現(xiàn)層與數(shù)據(jù)查詢層的橋梁,它主要是面向功能服務(wù)的,根據(jù)業(yè)務(wù)的需求進(jìn)行數(shù)據(jù)的封裝、處理和分析等。表現(xiàn)層主要是面向用戶提供可視化的界面,負(fù)責(zé)收集用戶的請(qǐng)求數(shù)據(jù)和對(duì)系統(tǒng)的返回?cái)?shù)據(jù)進(jìn)行前端渲染。
圖1 系統(tǒng)設(shè)計(jì)框架
系統(tǒng)整體采用B/S結(jié)構(gòu),后端采用Spring Boot框架構(gòu)建微服務(wù),提供RESTful接口。前端采用HTML5和Echarts相關(guān)技術(shù)構(gòu)建可視化界面,數(shù)據(jù)庫采用Neo4j圖數(shù)據(jù)庫和MySQL關(guān)系數(shù)據(jù)庫。數(shù)據(jù)層主要采用Spring Data模塊操作Neo4j圖數(shù)據(jù)庫,javaCSV API或SQL語句操作MYSQL關(guān)系數(shù)據(jù)庫,自動(dòng)生成LOAD語句導(dǎo)入Neo4j圖數(shù)據(jù)庫,jena API解析OWL文件在與關(guān)系數(shù)據(jù)庫創(chuàng)建關(guān)系,自動(dòng)生成MATCH語句導(dǎo)入Neo4j圖數(shù)據(jù)庫中。業(yè)務(wù)層主要進(jìn)行的是數(shù)據(jù)的處理,通過調(diào)用數(shù)據(jù)層對(duì)返回的數(shù)據(jù)進(jìn)一步封裝,完成數(shù)據(jù)的統(tǒng)計(jì)分析和格式規(guī)范。根據(jù)需要完成的相關(guān)功能進(jìn)行業(yè)務(wù)邏輯的編寫,并將封裝后的數(shù)據(jù)傳遞給表現(xiàn)層,數(shù)據(jù)交換格式采用JSON。表現(xiàn)層將接收到數(shù)據(jù)傳遞給前端進(jìn)行渲染,利用Echarts組件和HTML5實(shí)現(xiàn)查看圖譜、圖譜檢索功能。
本文設(shè)計(jì)了半自動(dòng)化生成知識(shí)圖譜工具,其功能設(shè)計(jì)框架(如圖2所示)該圖譜系統(tǒng)主要包含三個(gè)功能模塊:導(dǎo)入數(shù)據(jù)、語義映射、查看圖譜。
第一個(gè)模塊是導(dǎo)入數(shù)據(jù)。首先,將關(guān)系數(shù)據(jù)庫的數(shù)據(jù)庫表轉(zhuǎn)為csv文件,在用文件上傳函數(shù)接口上傳到Neo4j中的import文件夾中。其次,自動(dòng)生成導(dǎo)入圖數(shù)據(jù)庫Neo4j生成圖節(jié)點(diǎn)的LOAD語句。最后,在將生成的LOAD語句導(dǎo)入Neo4j圖數(shù)據(jù)庫,生成圖節(jié)點(diǎn)。
第二個(gè)模塊是語義映射。首先,對(duì)MySQL關(guān)系數(shù)據(jù)庫進(jìn)行解析,獲取數(shù)據(jù)庫表名和字段名。其后,解析構(gòu)建扶貧領(lǐng)域的OWL文件,利用Jena API解析構(gòu)建的本體文件,獲取其類名以及類與類之間的關(guān)系屬性。再者,人工確定多張數(shù)據(jù)庫表名,在勾選與其對(duì)應(yīng)的本體中的類名,再通過語義映射算法,映射出結(jié)果,其為選中的數(shù)據(jù)庫表之間存在的關(guān)系。然后,自動(dòng)生成導(dǎo)入圖數(shù)據(jù)庫Neo4j生成關(guān)系節(jié)點(diǎn)的MATCH語句。最后,在將生成的MATCH語句導(dǎo)入Neo4j圖數(shù)據(jù)庫,生成關(guān)系節(jié)點(diǎn)。
圖2 功能設(shè)計(jì)框架
第三個(gè)模塊是查看圖譜。針對(duì)本工具知識(shí)圖譜的可視化方面,采用ECharts組件可以實(shí)現(xiàn)力導(dǎo)向布局圖,描述知識(shí)圖譜中幫扶人與貧困戶之間的關(guān)聯(lián)情況。在圖譜檢索中,實(shí)現(xiàn)按人物查詢、按關(guān)系查詢。如幫扶人與貧困戶之間關(guān)系查詢。首先,發(fā)送查詢請(qǐng)求;解析請(qǐng)求參數(shù)。其次,調(diào)用數(shù)據(jù)查詢層,發(fā)送最短路徑請(qǐng)求給圖數(shù)據(jù)庫。然后,Neo4j圖數(shù)據(jù)庫返回?cái)?shù)據(jù),計(jì)算并封裝數(shù)據(jù)。最后,Echarts組件進(jìn)行渲染。
Neo4j是由Neo Technology開發(fā)的開源圖數(shù)據(jù)庫,它是當(dāng)前主流的圖數(shù)據(jù)庫之一,具有高性能、高可抗性、可擴(kuò)展、支持事務(wù)等特點(diǎn)。知識(shí)圖譜本質(zhì)是一個(gè)圖結(jié)構(gòu),其表現(xiàn)形式主要分為兩種:RDF圖和屬性圖[4~8]。RDF圖是W 3C官方推薦的語義表示的模型,是用來描述資源以及其關(guān)系的三元組的集合,是語義網(wǎng)技術(shù)棧中的基石。屬性圖是由節(jié)點(diǎn)、關(guān)系和屬性三要素構(gòu)成的圖譜,通過這三個(gè)元素可以完成任何描述。針對(duì)數(shù)據(jù)間關(guān)系的復(fù)雜性和動(dòng)態(tài)變化等問題,考慮到后期知識(shí)圖譜的擴(kuò)展和維護(hù),本文采用Neo4j圖數(shù)據(jù)庫對(duì)知識(shí)圖譜進(jìn)行持久化存儲(chǔ)。Neo4j圖數(shù)據(jù)庫具有強(qiáng)性能、易擴(kuò)展、支持事務(wù)、后臺(tái)可視化等特點(diǎn),能夠有效地組織、存儲(chǔ)和更新動(dòng)態(tài)數(shù)據(jù)及其關(guān)聯(lián),并提供給高效的遍歷算法支持多層復(fù)雜查詢,在知識(shí)存儲(chǔ)和知識(shí)表現(xiàn)方面具有重要作用。
實(shí)現(xiàn)導(dǎo)入數(shù)據(jù)功能。首些,需要將重慶扶貧數(shù)據(jù)源生成csv文件。本文中,提供兩套方法。第一種方法通過javaCSV API(如表1所示)。
表1 生成csv文件主要方法
第二種方法通過SQL語句生成CSV文件,如使用如下SQL語句將家庭表(jiating)生成csv文件。
SELECT*FROM(SELECT‘表頭名’union all select*from jiating)jiatingINTOOUTFILE‘D:\cypher\import\jiating.csv’FIELDSTERMINATED BY‘,’OPTIONALLY ENCLOSED BY‘"’ LINES TERMINATED BY‘ ’.)
其次,將生成的csv文件上傳到Neo4j的import文件夾中。采用Apache開源的common-fileupload.jar和common-io.jar實(shí)現(xiàn)多文件上傳,上傳文件用到的主要方法(如表2所示)。
表2 上傳csv文件主要方法
自動(dòng)生成LOAD語句的核心代碼如(LOADCSVWITHEADERSROM “file:///pkh_helpperson.csv”AS row CREATE(n:HelpPerson)SET n=row)。最后,將生成的LOAD語句導(dǎo)入圖數(shù)據(jù)庫Neo4j中。
實(shí)現(xiàn)語義映射功能。首先,需要解析MySQL關(guān)系數(shù)據(jù)庫中的數(shù)據(jù)庫表名以及字段名。Java操作Mysql的驅(qū)動(dòng)主要為ODBC和JDBC,本文所采用的是JDBC驅(qū)動(dòng)。由工具的環(huán)境是基于SpringBoot微服務(wù),可在程序包中的pom.xm l文件中配置mysql-connector-java,配置版本為5.1.6。配置好驅(qū)動(dòng),利用 SQL 查詢語句:(stmt.executeQuery(“se-lect*from”+“”+tableName);stm t.executeQuery(“select*from”+“ ”+tableName))解析據(jù)庫的表名以及字段名。其次,解析構(gòu)建的本體。本體作為領(lǐng)域概念模型的建模工具,形式化的描述領(lǐng)域內(nèi)的概念及概念之間的關(guān)系,是領(lǐng)域知識(shí)共同理解的基礎(chǔ),是知識(shí)圖譜中重要的組成部分。使用本體對(duì)數(shù)據(jù)集進(jìn)行描述,可以解決知識(shí)圖譜構(gòu)建過程中數(shù)據(jù)集成遇到的語義異構(gòu)問題。在本文中,我們將以本體扶貧數(shù)據(jù)源為基礎(chǔ),描述本體構(gòu)建的相關(guān)過程。本體描述語言可以清晰地對(duì)領(lǐng)域內(nèi)概念與概念間的關(guān)系進(jìn)行規(guī)范的描述,具備以下特點(diǎn):明確的語法、豐富的表達(dá)能力、對(duì)推理的支持、便捷表述。目前主流的本體語言包括XML、RDF(S)、OWL等。
對(duì)本文要研究的領(lǐng)域概念進(jìn)行抽取,主要抽取出類、對(duì)象屬性、數(shù)據(jù)屬性。結(jié)合領(lǐng)域中概念與概念之間的關(guān)系,本文抽取的部分三元組如{幫扶人幫扶項(xiàng)目 貧困戶}、{貧困戶家庭信息家庭成員}。確定了概念與概念之間的關(guān)系之后,利用Python第三方庫pygraph繪制出扶貧本體的RDF圖(如圖3所示)。其中類與類之間的對(duì)象屬性用實(shí)心箭頭的實(shí)線標(biāo)識(shí),類的數(shù)據(jù)屬性使用實(shí)心箭頭的虛線標(biāo)識(shí)。
圖3 扶貧領(lǐng)域本體
本文構(gòu)建的OWL文件類有Helper、PoorHouseholds、GovHelp、Family;對(duì) 象 屬 性 有 has_helper、has_govhelp、has_family。由于本體文件中的類與對(duì)象屬性為語義映射的輸入,則需要對(duì)本體文件作進(jìn)一步的解析。本文采用Jena API,主要方法(如表3所示)。
表3 jena解析本體主要用到的方法
解析出了數(shù)據(jù)庫中的表名、字段名以及本體中的類名以及類與類之間的關(guān)系屬性。如算法1所示,人工確定多張數(shù)據(jù)庫表名,在勾選與其對(duì)應(yīng)的本體中的類名。再將對(duì)應(yīng)的數(shù)據(jù)通過AJAX傳入后臺(tái)。由于類與類之間存在著確定的關(guān)系。依次判斷,若存在相關(guān)類,則將解析出來的對(duì)象屬性傳遞給結(jié)果集,作為數(shù)據(jù)庫表與表之間的關(guān)系。若不存相關(guān)類,需要人工自定義選中表的關(guān)系。
算法1語義映射
得出語義映射[15~16]結(jié)果,組織生成導(dǎo)入圖數(shù)據(jù)庫Neo4j生成關(guān)系節(jié)點(diǎn)的MATCH語句(如MATCH(b:BasicInfo),(g:GovHelp),(b1:BangFuXiangMu)WHERE b.id= g.huzhu_id AND g.xiangmumingcheng=b1.xiangmumingchengCREATE (b1) [:BangFuXiangMu{fuchinianfen:g.fuchinianfen,jiansheneirong:g.jiansheneirong}]->(b))。 最 后 ,將MATCH語句導(dǎo)入圖數(shù)據(jù)庫Neo4j生成關(guān)系節(jié)點(diǎn)。
實(shí)現(xiàn)查看圖譜功能。主要是采用Echarts控件來實(shí)現(xiàn)圖譜的查看與檢索。ECharts是百度開源的純JavaScript圖表庫。目前,百度的ECharts項(xiàng)目已經(jīng)進(jìn)入國際頂級(jí)開源社區(qū)Apache孵化器,ECharts具有豐富的可視化圖表類型和深度交互能力的開源可視化庫,配置便捷并且支持靈活的定制功能,具備高達(dá)千萬級(jí)數(shù)據(jù)的可視化能力[9~14]。Echarts控件生成圖譜流程大致如表4所示。
表4 Echarts控件生成圖譜流程
圖譜檢索中,按關(guān)系查詢,用戶通過輸入框指定需要查詢的兩個(gè)人名稱,如果存在關(guān)系,則展示兩個(gè)人之間存在的最短路徑關(guān)系圖譜,通過不同顏色的節(jié)點(diǎn)標(biāo)識(shí)不同的實(shí)體類型,通過邊的文字顯示與方向標(biāo)識(shí)不同的關(guān)系類型。如果不存在關(guān)系,則顯示兩個(gè)孤立的節(jié)點(diǎn)。幫扶人與貧困戶之間關(guān)系圖譜的查詢過程如圖4所示。
圖4 關(guān)系圖譜的查詢過程
用戶指定需要查詢的兩個(gè)人名并向服務(wù)端發(fā)起請(qǐng)求,服務(wù)端的業(yè)務(wù)邏輯層接收參數(shù)后進(jìn)行校驗(yàn)和解析,校驗(yàn)通過后調(diào)用數(shù)據(jù)查詢層的方法傳入實(shí)參。利用Neo4j圖數(shù)據(jù)庫最短路徑函數(shù)shortestPath()對(duì)兩法人之間的路徑進(jìn)行查詢并返回結(jié)果集。針對(duì)結(jié)果集解析和加工。封裝成特定格式的JSON數(shù)據(jù)傳遞給ECharts組件進(jìn)行渲染,最終以圖譜方式展現(xiàn)。
本文基于重慶的貧困數(shù)據(jù)源,構(gòu)建一套半自動(dòng)化生成知識(shí)圖譜以及查詢知識(shí)圖譜的工具。首先,將存儲(chǔ)在關(guān)系數(shù)據(jù)庫中的結(jié)構(gòu)化數(shù)據(jù)構(gòu)建出扶貧領(lǐng)域本體,以及將結(jié)構(gòu)化數(shù)據(jù)通過半自動(dòng)化工具導(dǎo)入圖數(shù)據(jù)庫Neo4j中生成圖節(jié)點(diǎn)。再者,本文提出語義映射算法,將解析的OWL文件中類與對(duì)象屬性與查詢的結(jié)構(gòu)化數(shù)據(jù)表名之間映射出關(guān)系,再通過半自動(dòng)化工具導(dǎo)入圖數(shù)據(jù)庫Neo4j生成關(guān)系節(jié)點(diǎn)。最后,用戶可輸入人物或關(guān)系關(guān)鍵字,通過Echart組件,將存儲(chǔ)在Neo4j圖數(shù)據(jù)庫中的數(shù)據(jù)展現(xiàn)在用戶界面,實(shí)現(xiàn)查看圖譜和圖譜檢索功能。