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