楊夏柏+楊明+楊德強(qiáng)+黃瑜
摘要:語義Web的發(fā)展日新月異,惠普公司(HP)在研究語義Web方面處于領(lǐng)先地位,其發(fā)布的Apache Jena系統(tǒng)為研究語義Web提供三元組存儲(chǔ)(Triple Store)平臺(tái)、RDF(Resource Description Framework)平臺(tái)和OWL(Web Ontology Language)平臺(tái),Apache Jena是HP實(shí)驗(yàn)室開發(fā)的一個(gè)用于處理語義Web和鏈接數(shù)據(jù)應(yīng)用的免費(fèi)開源Java工具包,本文研究基于Jena系統(tǒng)的知識(shí)融合三元組存儲(chǔ)結(jié)構(gòu)。
Abstract: The development of Semantic Web is changing rapidly. Hewlett-Packard Company (HP) is the leader in the research of Semantic Web. Its published Apache Jena system provides Triple Store, RDF (Resource Description Framework) and OWL (Web Ontology Language) platform for research Semantic Web.Apache Jena is a free and open-source Java toolkit developed by HP Labs for processing semantic web and linked data applications. This paper studies Jena-based knowledge fusion triple storage architecture.
關(guān)鍵詞:Jena;語義Web;RDF;知識(shí)融合;RDFS;OWL
Key words: Jena;Semantic Web;RDF;knowledge fusion;RDFS;OWL
中圖分類號(hào):TP202 文獻(xiàn)標(biāo)識(shí)碼:A 文章編號(hào):1006-4311(2018)08-0126-04
關(guān)系數(shù)據(jù)模型和半結(jié)構(gòu)化數(shù)據(jù)模型是兩種重要的數(shù)據(jù)模型,半結(jié)構(gòu)化數(shù)據(jù)模型通常用XML和相關(guān)的標(biāo)準(zhǔn)表示,它是大多數(shù)關(guān)系數(shù)據(jù)庫管理系統(tǒng)DBMS的一個(gè)附加特征[1]。RDF模型和RDFS(Resource Description Framework Schema Specification)規(guī)范是W3C的推薦標(biāo)準(zhǔn),基于這個(gè)標(biāo)準(zhǔn)和XML語法建立的資源、信息、知識(shí)越來越多,它們大多以RDF文件的格式描述并存放在網(wǎng)絡(luò)上,廣泛存在于數(shù)字圖書館、知識(shí)庫、本體等中。面對(duì)海量的數(shù)據(jù)和知識(shí),如何保證一個(gè)RDF文件內(nèi)容、版本等的一致性和正確性[2],如何把不同RDF文件中相同的知識(shí)通過集合操作提取出來、不同的知識(shí)合并在一起,這是一個(gè)值得研究的知識(shí)融合語義Web問題,二十世紀(jì)九十年代末至今,國內(nèi)外許多專家在從事這個(gè)領(lǐng)域研究。但RDF模型和RDFS規(guī)范是一項(xiàng)涉及知識(shí)面比較廣的系統(tǒng)工程,目前,HP實(shí)驗(yàn)室的Jena系統(tǒng)對(duì)它的研究比較領(lǐng)先。2003年至今,我們對(duì)Jena系統(tǒng)的體系結(jié)構(gòu)進(jìn)行了研究,并基于Jena系統(tǒng)實(shí)現(xiàn)了知識(shí)融合的并集、交集、差集等操作,本文研究基于Jena系統(tǒng)的知識(shí)融合三元組物理存儲(chǔ)(Triple store)結(jié)構(gòu)。
Jena是HP實(shí)驗(yàn)室開發(fā)的一個(gè)用于處理語義Web和鏈接數(shù)據(jù)應(yīng)用的免費(fèi)開源Java工具包。Jena1版本于2000年發(fā)布,Jena2版本于2003年發(fā)布,2017年版本升級(jí)到apache-jena-3.5.0,本文使用的版本是Jena2.1(以下簡稱Jena)。Jena系統(tǒng)為研究語義Web提供Triple Store、RDF、OWL平臺(tái),Jena根據(jù)RDF模型和RDFS語法規(guī)范提供建立和操作RDF圖的Java API,支持集合的并集、交集、差集操作。
通過調(diào)用Jena系統(tǒng)提供的核心API,創(chuàng)建和讀取RDF圖,實(shí)現(xiàn)集合的并集、交集、差集操作,可以使用XML格式、RDF格式或Turtle格式序列化三元組。
Jena系統(tǒng)的體系結(jié)構(gòu)由Graph、EnhGraph、Model三層組成,如圖1所示。Graph層主要實(shí)現(xiàn)三元組的存儲(chǔ),EnhGraph層為圖和節(jié)點(diǎn)實(shí)現(xiàn)多種操作視圖,Model層為應(yīng)用編程人員提供不同視圖,用來創(chuàng)建RDF圖和操作RDF圖,本文主要研究Graph層三元組的存儲(chǔ)。
在Java類集中常使用的接口是:Collection、List、Set、Map、Iterator、ListIterator、Enumeration、SortedSet、SortedMap、Queue、Map.Entry[3]。
Jena系統(tǒng)用Java開發(fā),三元組的存儲(chǔ)結(jié)構(gòu)中用到Java中的集合框架、HashSet、HashMap、List和Iterator(迭代器,也叫反復(fù)器)等知識(shí)[4]。
集合主要用來處理各種類型的對(duì)象的聚集,每一個(gè)對(duì)象都具有一定的數(shù)據(jù)類型。集合保留了對(duì)Object類的引用,因此,任何數(shù)據(jù)類型的對(duì)象都可以存放在集合中。集合包含3個(gè)重要接口:Collection、Set、List(如圖2所示),它們都可以用來組織多個(gè)對(duì)象,但是又各不相同[5]:Collection中的對(duì)象存放沒有一定的順序,并且允許重復(fù);Set也是對(duì)象的無序聚集,但是不允許重復(fù)(即相同的對(duì)象只能在集合中出現(xiàn)一次),HashSet的特點(diǎn)是無序不重復(fù),允許null存在;List是一個(gè)有序的對(duì)象聚集,對(duì)象按照一定的順序存放,同時(shí)允許重復(fù),元素允許null。
HashMap的特點(diǎn):它是一系列“鍵-值”對(duì)的集合,可以通過一個(gè)鍵找到相應(yīng)的值??梢允褂肞ut方法向映射中加入一個(gè)“鍵-值”對(duì),映射中不能包含重復(fù)的鍵,如果插入的鍵已經(jīng)存在,那么新插入的值將取代舊的值。其中“鍵”和“值”可以是任意類型的對(duì)象。圖3是映射的類繼承圖。
對(duì)集合中的每一個(gè)元素的訪問使用的是迭代器Iterator,對(duì)于Set來說,利用迭代器Iterator所獲得的元素順序不是一定的。對(duì)于List來說,有一個(gè)更實(shí)用的迭代器ListIterator,它直接繼承自Iterator,但是它除了可以得到下一個(gè)元素之外,還可以得到前一個(gè)元素,可以添加元素,可以設(shè)置元素。圖4是迭代器繼承圖。
RDF模型和RDFS語法規(guī)范是一項(xiàng)涉及知識(shí)面比較廣的系統(tǒng)工程,HP實(shí)驗(yàn)室的Jena系統(tǒng)對(duì)它研究比較全面,本文研究團(tuán)隊(duì)對(duì)Jena系統(tǒng)進(jìn)行了解析,用Togerther工具分析Jena系統(tǒng)的類圖(UML圖),JbuilderX配合Togerther打開Jena系統(tǒng)的源程序代碼,找到了三元組在該系統(tǒng)中的存儲(chǔ)結(jié)構(gòu)。圖5是三元組的物理存儲(chǔ)結(jié)構(gòu)圖,最右邊Model是RDF圖的抽象形式,相當(dāng)于一個(gè)模型加工廠,提供給用戶各種各樣的Model API,用戶可以通過模型提供的接口根據(jù)不同需求進(jìn)行各種各樣的訪問、操作和應(yīng)用編程。左邊部分是圖Graph及三元組的存儲(chǔ)結(jié)構(gòu),這一部分主要作為通用數(shù)據(jù)結(jié)構(gòu)的存儲(chǔ)。
圖6是存儲(chǔ)結(jié)構(gòu)中依據(jù)RDF模型表示的對(duì)象之間的關(guān)系圖,RDFNode由Literal和Resource兩類組成,Resource由Property、container、RDFList、ReifiedStatement組成,container由Bag、Seg、Alt組成。
圖7是存儲(chǔ)結(jié)構(gòu)中圖、三元組和節(jié)點(diǎn)之間的關(guān)系圖。其中Node由固定的節(jié)點(diǎn)(Node Concrete)和可變的節(jié)點(diǎn)(Node Fluid)組成,固定的節(jié)點(diǎn)由Node Blank、Node URI、Node Literal、Node NULL四類組成,可變的節(jié)點(diǎn)由Node ANY、Node Variable組成。三元組Triple依賴Node構(gòu)造產(chǎn)生。
Subjects和objects以節(jié)點(diǎn)存放,一個(gè)結(jié)點(diǎn)的具體結(jié)構(gòu)如圖8所示;predicates以邊存放,每條邊的結(jié)構(gòu)如圖9示。
同樣,Model加工廠把一個(gè)RDF文件序列化成三元組(可以理解為一個(gè)圖)的過程是一個(gè)牽涉RDF模型和RDFS規(guī)范的系統(tǒng)工程,其中與三元組存儲(chǔ)結(jié)構(gòu)密切相關(guān)的是節(jié)點(diǎn)到三元組的映射及在數(shù)據(jù)結(jié)構(gòu)中的存儲(chǔ)。三元組的存儲(chǔ)結(jié)構(gòu)是知識(shí)融合的核心之一。下面舉例說明節(jié)點(diǎn)到三元組的映射:假設(shè)被序列化的三元組為(I,am,a teacher)、(I,am,a student)、(You,are,a student)、(You,are,a teacher)。為了說明的方便,簡化為(I,am,t)、(I,am,s)、(Y,are,s)、(You,are,t),圖10是節(jié)點(diǎn)到三元組映射示例。每個(gè)Subjects、Predicates、Objects的存儲(chǔ)結(jié)構(gòu)是一個(gè)HashMap,每個(gè)鍵對(duì)應(yīng)的鍵值是一個(gè)HashSet,在前面討論過HashMap的特點(diǎn)是:它是一系列“鍵-值”對(duì)的集合,可以通過一個(gè)鍵找到相應(yīng)的值(用Get方法),可以使用Put方法向映射中加入一個(gè)“鍵-值”對(duì),但映射中不能包含重復(fù)的鍵,如果插入的鍵已經(jīng)存在,那么新插入的值將取代舊的值。其中“鍵”和“值”可以是任意類型的對(duì)象。所以,在添加的時(shí)候,首先要判斷添加的鍵是否存在,如果存在,則不需要添加該鍵,但要先用Get把該鍵在HashMap中對(duì)應(yīng)的鍵值取出來,并強(qiáng)制轉(zhuǎn)換成HashSet,然后轉(zhuǎn)為對(duì)HashSet的操作,由于HashSet的特點(diǎn)是無序不重復(fù),允許null存在,所以,如果HashSet中已經(jīng)有要添加的三元組則不進(jìn)行添加操作,如果沒有則把新的三元組添加進(jìn)去(其實(shí)就是在合并三元組)。假若在HashMap中要添加的鍵不存在,則在HashMap中New一個(gè)HashSet,并把對(duì)應(yīng)的鍵添加到HashMap中,鍵值添加到HashSet中。
此外,當(dāng)存儲(chǔ)每個(gè)三元組時(shí),不但要存儲(chǔ)Subject,Predicate,Object本身,而且還要分別存儲(chǔ)Subject,Predicate,Object是在哪個(gè)三元組中。這樣可以實(shí)現(xiàn)同時(shí)存放三元組及其它們之間的關(guān)系。
例如,三元組(I,am,t)和 (I,am,s)的具體存儲(chǔ)過程:
存儲(chǔ)三元組(I,am,t)時(shí),Subject是I,到Subjects對(duì)應(yīng)的HashMap中查找是否有主鍵為I的鍵,查找結(jié)果沒有,所以把I添加到HashMap的主鍵中,然后New一個(gè)鍵值為HashSet,把對(duì)應(yīng)的三元組(I,am,t)添加到HashSet中。同理存放Predicate為am,Object為t的情況。
存儲(chǔ)三元組(I,am,s)時(shí),Subject是I,發(fā)現(xiàn)HashMap中已經(jīng)有,所以到Subjects對(duì)應(yīng)的HashMap中把主鍵為I的鍵值提取出來,并強(qiáng)制轉(zhuǎn)換成HashSet,然后把三元組(I,am,s)添加到HashSet中。當(dāng)添加Predicate為am時(shí),am已經(jīng)存在,所以其操作與添加Subject是I的情況類似。名稱空間(name space)也存儲(chǔ)在HashMap中。
從圖10中可以看出,數(shù)據(jù)存儲(chǔ)冗余度大,這是用存儲(chǔ)空間來換取時(shí)間的一種策略[6]。
Jena系統(tǒng)可以使用XML格式、RDF格式或Turtle格式序列化三元組,RDF文件、RDF圖和三元組是Jena給用戶提供的三種不同操作視圖,本文通過對(duì)Jena系統(tǒng)的解析,找到了三元組在該系統(tǒng)中的存儲(chǔ)結(jié)構(gòu),為應(yīng)用Jena系統(tǒng)提供的API操作三元組實(shí)現(xiàn)關(guān)聯(lián)數(shù)據(jù)應(yīng)用奠定了基礎(chǔ),下一步,緊跟Apache Jena網(wǎng)站提供的開源資料,對(duì)新版本apache-jena-3.5.0開展研究,主要研究新版本在RDF、Triple Store、OWL三大應(yīng)用領(lǐng)域的升級(jí)改進(jìn)。
參考文獻(xiàn):
[1]李興華,馬云濤編.Oracle開發(fā)實(shí)戰(zhàn)經(jīng)典(基于Oracle 11g、12c)[M].北京:清華大學(xué)出版社,2014:16-17.
[2]楊夏柏,楊明.基于Jena系統(tǒng)的知識(shí)融合技術(shù)研究[J].價(jià)值工程,2016(03):213-214.
[3]李興華編著.Java開發(fā)實(shí)戰(zhàn)經(jīng)典[M]. 北京:清華大學(xué)出版社,2009:494-558.
[4]王克宏主編.Java技術(shù)教程(基礎(chǔ)篇)[M]. 北京:清華大學(xué)出版社,2002:214-258.
[5]張曜等編,Java函數(shù)實(shí)用手冊(cè)[M].北京:冶金工業(yè)出版社,2003:161-186.
[6]Jeremy J.Carroll,Jena:Implementing the Semantic Web Recommendations, December 2003.