jena+中文教程本體api_第1頁(yè)
jena+中文教程本體api_第2頁(yè)
jena+中文教程本體api_第3頁(yè)
jena+中文教程本體api_第4頁(yè)
jena+中文教程本體api_第5頁(yè)
已閱讀5頁(yè),還剩40頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、Jena 簡(jiǎn)介一般來(lái)說(shuō),我們?cè)赑rotege這樣的編輯器里構(gòu)建了本體,就會(huì)想在應(yīng)用程序里使用它,這就需要一些開(kāi)發(fā)接口。用程序操作本體是很必要的,因?yàn)樵诤芏嗲闆r下,我們要自動(dòng)生成本體,靠人手通過(guò)Protege創(chuàng)建所有本體是不現(xiàn)實(shí)的。Jena是HP公司開(kāi)發(fā)的這樣一套API,似乎HP公司在本體這方面走得很靠前,其他大公司還在觀望嗎?可以這樣說(shuō),Jena對(duì)應(yīng)用程序就像Protege對(duì)我們,我們使用Protege操作本體,應(yīng)用程序則是使用Jena來(lái)做同樣的工作,當(dāng)然這些應(yīng)用程序還是得由我們來(lái)編寫(xiě)。其實(shí)Protege本身也是在Jena的基礎(chǔ)上開(kāi)發(fā)的,你看如果Protege的console里報(bào)異常的話,多半

2、會(huì)和Jena有關(guān)。最近出了一個(gè)Protege OWL API,相當(dāng)于對(duì)Jena的包裝,據(jù)說(shuō)使用起來(lái)更方便,這個(gè)API就是Protege的OWL Plugin所使用的,相信作者經(jīng)過(guò)OWL Plugin的開(kāi)發(fā)以后,說(shuō)這些話是有一定依據(jù)的。題目是說(shuō)用Jena處理OWL,其實(shí)Jena當(dāng)然不只能處理OWL,就像Protege除了能處理OWL外還能處理RDF(S)一樣。Jena最基本的使用是處理RDF(S),但畢竟OWL已經(jīng)成為W3C的推薦標(biāo)準(zhǔn),所以對(duì)它的支持也是大勢(shì)所趨。好了,現(xiàn)在來(lái)點(diǎn)實(shí)際的,怎樣用Jena讀我們用Protege創(chuàng)建的OWL本體呢,假設(shè)你有一個(gè)OWL本體文件(.owl),里面定義了動(dòng)物類

3、(,注意這并不是一個(gè)實(shí)際存在的URL,不要試圖去訪問(wèn)它),并且它有一些實(shí)例,現(xiàn)在看如下代碼: OntModel m = ModelFactory.createOntologyModel(); File myFile = .; m.read(new FileInputStream(myFile), ""); ResIterator iter = m.listSubjectsWithProperty(RDF.type, m.getResource(""); while&

4、#160;(iter.hasNext()      Resource animal = (Resource) iter.next();     System.out.println(animal.getLocalName(); 和操作RDF(S)不同,com.hp.hpl.jena.ontology.OntModel是專門處理本體(Ontology)的,它是com.hp.hpl.jena.rdf.model.Model的子接口,具有Model的全部功能,同時(shí)還有一些

5、Model沒(méi)有的功能,例如listClasses()、listObjectProperties(),因?yàn)橹挥性诒倔w里才有“類”和“屬性”的概念。上面的代碼很簡(jiǎn)單,從ModelFactory創(chuàng)建一個(gè)OntModel,從指定文件把模型讀到內(nèi)存里。再下面的代碼是一個(gè)例子,作用是取出模型中所有Animal的實(shí)例(Individual,也叫個(gè)體),并打印它們的名稱。要從OntModel里取實(shí)例,也可以用listIndividuals()方法,只不過(guò)你得在得到的實(shí)例中判斷它們是不是Animal的實(shí)例,我覺(jué)得不如用上面這種簡(jiǎn)易查詢的方式來(lái)得方便。Jena里擴(kuò)展了很多Iterator,比如ResIterato

6、r、StmtIterator和NodeIterator等等,剛開(kāi)始用會(huì)覺(jué)得很別扭,好象還不如都用java標(biāo)準(zhǔn)的Iterator,不知道Jena的設(shè)計(jì)者是怎么考慮的。要熟練掌握還是得對(duì)整個(gè)Jena的API有全局掌握才好。在循環(huán)里,我們得到的每個(gè)元素都是一個(gè)Resource,因?yàn)楸倔w里的任何東西都是資源,不論你想得到Subject、Property還是Object,在Jena里實(shí)際得到的都是資源(Resource),在Jena里,Property是Resource的子接口,而Jena并沒(méi)有Subject或Object接口。(注:在OWL本體中,Subject->Property->Ob

7、ject組成一個(gè)三元組,例如:張小剛->父親->張大剛;或者:綿羊多利->rdf:type->動(dòng)物,rdf:type是一個(gè)特殊的屬性,表示前者是后者的實(shí)例)暫時(shí)先寫(xiě)到這,關(guān)于在本體中引入其他本體和使用推理,下次繼續(xù)。本文簡(jiǎn)單介紹Jena(Jena 2.4),使用Protégé 3.1(不是最新版本)創(chuàng)建一個(gè)簡(jiǎn)單的生物(Creature)本體,然后參照J(rèn)ena文檔中的一個(gè)例子對(duì)本體進(jìn)行簡(jiǎn)單的處理,輸出本體中的Class、Property等信息。本文內(nèi)容安排如下:Ø      

8、0;  介紹JenaØ         運(yùn)行JenaØ         Jena Ontology APIØ         例子Ø         參考資料一、介紹JenaJen

9、a由 HP Labs()開(kāi)發(fā)的Java開(kāi)發(fā)工具包, 用于Semantic Web(語(yǔ)義網(wǎng))中的應(yīng)用程序開(kāi)發(fā);Jana是開(kāi)源的,在下載的文檔中有Jena的完整代碼。Jena框架主要包括:a)       以RDF/XML、三元組形式讀寫(xiě)RDF 資源描述框架是(RDF)是描述資源的一項(xiàng)標(biāo)準(zhǔn)(在技術(shù)上是W3C的推薦標(biāo)準(zhǔn)),Jena文檔中有一部分呢詳細(xì)介紹了RDF和Jena RDF API,其內(nèi)容包括對(duì)Jena RDF包的介紹、RDF模型的創(chuàng)建、讀寫(xiě)、查詢等操作,以及RDF容器等的討論。b)   

10、60;   RDFS,OWL,DAML+OIL等本體的操作Jena框架包含一個(gè)本體子系統(tǒng)(Ontology Subsystem),它提供的API允許處理基于RDF的本體數(shù)據(jù),也就是說(shuō),它支持OWL,DAML+OIL和RDFS。本體API與推理子系統(tǒng)結(jié)合可以從特定本體中提取信息,Jena 2還提供文檔管理器(OntDocumentManager)以支持對(duì)導(dǎo)入本體的文檔管理。c)       利用數(shù)據(jù)庫(kù)保存數(shù)據(jù)    Jena 2允許將數(shù)據(jù)存儲(chǔ)到硬盤中,或者是

11、OWL文件,或者是關(guān)系數(shù)據(jù)庫(kù)中。本文處理的本體就是OWL文件讀入的。d)       查詢模型    Jena 2提供了ARQ查詢引擎,它實(shí)現(xiàn)SPARQL查詢語(yǔ)言和RDQL,從而支持對(duì)模型的查詢。另外,查詢引擎與關(guān)系數(shù)據(jù)庫(kù)相關(guān)聯(lián),這使得查詢存儲(chǔ)在關(guān)系數(shù)據(jù)庫(kù)中的本體時(shí)能夠達(dá)到更高的效率。e)       基于規(guī)則的推理Jena 2支持基于規(guī)則的簡(jiǎn)單推理,其推理機(jī)制支持將推理器(inference reasoners)導(dǎo)

12、入Jena,創(chuàng)建模型時(shí)將推理器與模型關(guān)聯(lián)以實(shí)現(xiàn)推理。Protégé是一個(gè)開(kāi)源的本體編輯器(目前的版本是Protégé 3.2),用戶可以在GUI環(huán)境下創(chuàng)建本體或者知識(shí)庫(kù)。有一種說(shuō)法是:Jena對(duì)應(yīng)用程序就像Protégé對(duì)我們我們使用Protégé操作本體,應(yīng)用程序則是使用Jena來(lái)做同樣的工作。當(dāng)然這些應(yīng)用程序還是得由我們來(lái)編寫(xiě)。二、運(yùn)行Jena可以在Jena的主頁(yè)()下載Jena的最新版本,目前是Jena2.4版本。Jena是Java API,所以需要Java運(yùn)行環(huán)境。本文使用的是jdk1.5.0_04和Ecl

13、ipse3.2。將下載的Jena-2.4.zip解壓到任意路徑,解壓之后生成Jena2.4文件夾,將Jena2.4 lib下的jar文件全部加入CLASSPATH,這樣就可以在任意的Java編輯器中調(diào)用Jena API了。在解壓目錄下有一個(gè)test.bat文件,用于配置的測(cè)試。在控制臺(tái)運(yùn)行此程序,如果你的配置正確,測(cè)試將順利完成。G:jadelibjade.jar;G:jadelibiiop.jar;G:jadelibcommons-codeccommons-codec-1.3.jar;G:jadelibjavaTools.jar;G:jadelibhttp.jar;G:jenalibantl

14、r-2.7.5.jar;G:jenalibarq.jar;G:jenalibarq-extra.jar;G:jenalibcommons-logging-1.1.jar;G:jenalibconcurrent.jar;G:jenalibicu4j_3_4.jar;G:jenalibiri.jar;G:jenalibjena.jar;G:jenalibjenatest.jar;G:jenalibjson.jar;G:jenalibjunit.jar;G:jenalibalog4j-1.2.12.jar;G:jenaliblucene-core-2.0.0.jar;G:jenalibstax-ap

15、i-1.0.jar;G:jenalibwstx-asl-3.0.0.jar;G:jenalibxercesImpl.jar;G:jenalibxml-apis.jar如果使用Eclipse,則可以通過(guò)修改工程的Java創(chuàng)建路徑的方法導(dǎo)入Jena jar文件。在Eclipse下創(chuàng)建Java工程,右健單擊工程名字,選擇“屬性/Properties”,在打開(kāi)的對(duì)話框中選擇“Java創(chuàng)建路徑/Java Build Path”,在右邊標(biāo)簽中選擇“庫(kù)/Libraries”,之后選擇“添加外部文件/Add Extenal JARs”,找到Jena2.4 lib目錄下的所有jar文件并將其添加到工程。這樣就可

16、以運(yùn)行Jean文檔中的例子了。三、Jena Ontology APIJena2.4的Ontology API包含在ontology包(com.hp.hpl.jena.ontology)中,可以在目錄 Jena-2.4 src com hp hpl jena ontology下查看所有程序的代碼,Jena本體部分的說(shuō)明網(wǎng)頁(yè)是 Jena-2.4 doc ontology index.html,本部分內(nèi)容以及程序的編寫(xiě)主要參考這兩個(gè)文檔。在語(yǔ)義網(wǎng)上有很多表示本體信息的本體語(yǔ)言,其中表達(dá)能力最強(qiáng)的是OWL,OWL按復(fù)雜程度分為 OWL Full、OWL DL和OWL Lite三個(gè)版本。其他的本體語(yǔ)言還

17、有RDFS、DAML+OIL。Jena Ontology API為語(yǔ)義網(wǎng)應(yīng)用程序開(kāi)發(fā)者提供了一組獨(dú)立于具體語(yǔ)言的一致編程接口。Jena提供的接口本質(zhì)上都是Java程序,也就是.java文件經(jīng)過(guò)javac之后生成的.class文件。顯然,class文件并不能提示本體創(chuàng)建使用的語(yǔ)言。為了區(qū)別于其他的表示方法,每種本體語(yǔ)言都有一個(gè)自己的框架(profile),它列出了這種語(yǔ)言使用的類(概念)和屬性的構(gòu)建方式和URI。因此,在DAML框架里,對(duì)象屬性()的URI是daml:ObjectProperty,而在OWL框架里卻是owl:ObjectProperty。RDFS并沒(méi)有定義對(duì)象屬性,所以在RDFS

18、框架里,對(duì)象屬性的URI是null。在Jena中,這種框架通過(guò)參數(shù)的設(shè)置在創(chuàng)建時(shí)與本體模型(Ontology Model)綁定在一起。本體模型繼承自Jena中的Model類。Model允許訪問(wèn)RDF數(shù)據(jù)集合中的陳述(Statements),OntModel對(duì)此進(jìn)行了擴(kuò)展,以便支持本體中的各種數(shù)據(jù)對(duì)象:類(classes)、屬性(properties)、實(shí)例(個(gè)體individuals)。本部分簡(jiǎn)單介紹要用到的幾個(gè)java類或者接口。1本體模型OntModel本體模型(OntModel)是對(duì)Jena RDF模型的擴(kuò)展(繼承自RDF模型),提供了處理本體數(shù)據(jù)的功能。使用Jena處理本體首先就是要建

19、立一個(gè)本體模型,之后就能夠通過(guò)本體模型中所定義的方法操作模型,比如導(dǎo)入子模型()、獲取模型中本體的信息、操作本體屬性以及將本體的表示輸出到磁盤文件等等。Jena通過(guò)model包中的ModelFactory創(chuàng)建本體模型,ModelFactory是Jena提供用來(lái)創(chuàng)建各種模型的類,在類中定義了具體實(shí)現(xiàn)模型的成員數(shù)據(jù)以及創(chuàng)建模型的二十多種方法。一個(gè)最簡(jiǎn)單的創(chuàng)建本體模型的語(yǔ)句如下:OntModel ontModel = ModelFactory.createOntologyModel();該語(yǔ)句不含參數(shù),應(yīng)用默認(rèn)設(shè)置創(chuàng)建一個(gè)本體模型ontModel,也就是說(shuō):它使用OWL語(yǔ)言、基于內(nèi)存,支持RDFS推

20、理??梢酝ㄟ^(guò)創(chuàng)建時(shí)應(yīng)用模型類別(OntModelSpec)參數(shù)創(chuàng)建不同的模型,以實(shí)現(xiàn)不同語(yǔ)言不同類型不同推理層次的本體操作。例如,下面的語(yǔ)句創(chuàng)建了一個(gè)使用DAML語(yǔ)言內(nèi)存本體模型。直觀地講,內(nèi)存模型就是只在程序運(yùn)行時(shí)存在的模型,它沒(méi)有將數(shù)據(jù)寫(xiě)回磁盤文件或者數(shù)據(jù)庫(kù)表。OntModel ontModel = ModelFactory.createOntologyModel( OntModelSpec.DAML_MEM );更多類型設(shè)置可以參照OntModelSpec類中的數(shù)據(jù)成員的說(shuō)明。我們所使用的本體是從OWL文件獲得的,也就是說(shuō),是從磁盤讀取的。讀取的方法是調(diào)用Jena OntoModel提供

21、的Read方法。例如ontModel.read("file:D:/temp/Creatrue/Creature.owl");就是讀取位于D盤相應(yīng)目錄下的Creature.owl文件以建立本體模型。Read方法也有很多重載,上面調(diào)用的方法以文件的絕對(duì)路徑作為參數(shù)。其他的方法聲明如下read( String url );read( Reader reader, String base );read( InputStream reader, String base );read( String url, String lang );read( Reader reader, Str

22、ing base, String Lang );read( InputStream reader, String base, String Lang );2文檔管理器Document manager本體文檔管理器(OntDocumentManager)是用來(lái)幫助管理本體文檔的類,它包含了導(dǎo)入本體文檔創(chuàng)建本體模型、幫助緩存下載網(wǎng)絡(luò)上的本體等功能。每個(gè)本體模型都有一個(gè)相關(guān)聯(lián)的文檔管理器。在創(chuàng)建本體模型時(shí),可以創(chuàng)建獨(dú)立的文檔管理器并作為參數(shù)傳遞給模型工廠(ModelFactory)。文檔管理器有非常多的配置選項(xiàng),基本可以滿足應(yīng)用的需求。首先,每個(gè)文檔管理器的參數(shù)都可以通過(guò)Java代碼來(lái)設(shè)置(注:On

23、tDocumentManager有五種重載的構(gòu)造函數(shù))。另外,文檔管理器也可以在創(chuàng)建的時(shí)候從一個(gè)RDF格式的策略文件讀取相應(yīng)設(shè)定值。下面的例子創(chuàng)建一個(gè)文檔管理器并將它與以創(chuàng)建的本體模型關(guān)聯(lián)。OntModel m = ModelFactory.createOntologyModel();OntDocumentManager dm = m.getDocumentManager();(續(xù))見(jiàn)“對(duì)Jena的簡(jiǎn)單理解和一個(gè)例子_2”RDF 越來(lái)越被認(rèn)為是表示和處理半結(jié)構(gòu)化數(shù)據(jù)的一種極好選擇。本文中,Web 開(kāi)發(fā)人員 Philip McCarthy 向您展示了如何使用 Jena Semantic Web

24、Toolkit,以便在 Java 應(yīng)用程序中使用 RDF 數(shù)據(jù)模型?!百Y源描述框架(Resource Description Framework,RDF)”最近成為 W3C 推薦標(biāo)準(zhǔn),與 XML 和 SOAP 等 Web 標(biāo)準(zhǔn)并排。RDF 可以應(yīng)用于處理特殊輸入數(shù)據(jù)(如 CRM)的領(lǐng)域,已經(jīng)廣泛用于社會(huì)網(wǎng)絡(luò)和自助出版軟件(如 LiveJournal 和 TypePad)。Java 程序員將越來(lái)越多地得益于具有使用 RDF 模型的技能。在本文中,我將帶您體驗(yàn)惠普實(shí)驗(yàn)室的開(kāi)放源代碼 Jena Semantic Web Framework(請(qǐng)參閱 參考資料)的一些功能。您將了解如何創(chuàng)建和填充 RDF

25、 模型,如何將它們持久存儲(chǔ)到數(shù)據(jù)庫(kù)中,以及如何使用 RDQL 查詢語(yǔ)言以程序方式查詢這些模型。最后,我將說(shuō)明如何使用 Jena 的推理能力從本體推斷模型知識(shí)。 本文假設(shè)您已經(jīng)就圖形、三元組和模式等概念方面對(duì) RDF 比較熟悉,并對(duì) Java 編程有基本的了解。創(chuàng)建簡(jiǎn)單的 RDF 模型我們從基本操作開(kāi)始:從頭創(chuàng)建模型并向其添加 RDF 語(yǔ)句。本節(jié),我將說(shuō)明如何創(chuàng)建描述一組虛構(gòu)家庭成員之間關(guān)系的模型,如圖 1 中所示:圖 1. 虛擬家庭樹(shù)將使用來(lái)自“關(guān)系”詞匯表(請(qǐng)參閱 參考資料)的屬性 siblingOf 、 spouseOf 、 parentOf 和 childOf 來(lái)描述不同的關(guān)系類型。為簡(jiǎn)

26、單起見(jiàn),家庭成員用來(lái)自虛構(gòu)名稱空間的 URI( http:/family/ )進(jìn)行標(biāo)識(shí)。詞匯表 URI 通常以 Jena 代碼形式使用,所以將它們聲明為 Java 常量會(huì)非常有用,減少了錯(cuò)誤輸入。 Schemagen當(dāng)您通過(guò) Jena 的 API 來(lái)使用模型時(shí),為模型詞匯表中的每個(gè)屬性定義常量非常有用。如果有詞匯表的 RDF、DAML 或 OWL 表示,Jena 的 Schemagen 工具可以自動(dòng)生成這些常量,使您的工作更加容易。Schemagen 在命令行中運(yùn)行,使用的參數(shù)包括模式或本體文件的位置、要輸出的類的名稱和 Java 包。然后可以導(dǎo)出生成的 Java 類,其 Property 常

27、量用于訪問(wèn)模型。 還可以使用 Ant 將 Schemagen 作為構(gòu)建處理的一部分來(lái)運(yùn)行,保持 Java 常量類與正在變化的詞匯表保持同步。Jena 的 ModelFactory 類是創(chuàng)建不同類型模型的首選方式。在這種情況下,您想要空的、內(nèi)存模型,所以要調(diào)用的方法是 ModelFactory.createDefaultModel() 。這種方法返回 Model 實(shí)例,您將使用它創(chuàng)建表示家庭中每個(gè)成員的 Resource 。創(chuàng)建了資源后,可以編寫(xiě)關(guān)于這些資源的語(yǔ)句并添加到模型中。 在 Jena 中,語(yǔ)句的主題永遠(yuǎn)是 Resource ,謂詞由 Property 表示,對(duì)象是另一個(gè) Resourc

28、e 或常量值。常量在 Jena 中通過(guò) Literal 類型表示。所有這些類型共享公共接口 RDFNode 。將需要四個(gè)不同的 Property 實(shí)例表示家庭樹(shù)中的關(guān)系。這些實(shí)例使用 Model.createProperty() 創(chuàng)建。 將語(yǔ)句添加到模型中的最簡(jiǎn)單方法是通過(guò)調(diào)用 Resource.addProperty() 。此方法以 Resource 作為主題在模型中創(chuàng)建語(yǔ)句。該方法使用兩個(gè)參數(shù),表示語(yǔ)句謂詞的 Property 和語(yǔ)句的對(duì)象。 addProperty() 方法被過(guò)載:一個(gè)過(guò)載使用 RDFNode 作為對(duì)象,所以可以使用 Resource 或 Literal 。還有有益過(guò)載,

29、它們使用由 Java 原語(yǔ)或 String 表示的常量。在示例中,語(yǔ)句的對(duì)象是表示其他家庭成員的 Resource 。 通過(guò)使用三元組的主題、謂詞和對(duì)象調(diào)用 Model.createStatement() ,還可以直接在模型上創(chuàng)建語(yǔ)句。注意以此種方式創(chuàng)建 Statement 不將其添加到模型中。如果想將其添加到模型中,請(qǐng)使用創(chuàng)建的 Statement 調(diào)用 Model.add() ,如清單 1 所示: 清單 1. 創(chuàng)建模型來(lái)表示虛構(gòu)的家庭/ URI declarations String familyUri = "http:/family/" String relation

30、shipUri = "/vocab/relationship/" / Create an empty Model Model model = ModelFactory.createDefaultModel(); / Create a Resource for each family member, identified by their URI Resource adam = model.createResource(familyUri+"adam"); Resource beth = model.createResource

31、(familyUri+"beth"); Resource chuck = model.createResource(familyUri+"chuck"); Resource dotty = model.createResource(familyUri+"dotty"); / and so on for other family members / Create properties for the different types of relationship to represent Property childOf = model

32、.createProperty(relationshipUri,"childOf"); Property parentOf = model.createProperty(relationshipUri,"parentOf"); Property siblingOf = model.createProperty(relationshipUri,"siblingOf"); Property spouseOf = model.createProperty(relationshipUri,"spouseOf"); / Ad

33、d properties to adam describing relationships to other family members adam.addProperty(siblingOf,beth); adam.addProperty(spouseOf,dotty); adam.addProperty(parentOf,edward); / Can also create statements directly . . Statement statement = model.createStatement(adam,parentOf,fran); / but remember to ad

34、d the created statement to the model model.add(statement); 整個(gè)代碼示例 FamilyModel.java 還說(shuō)明了語(yǔ)句批量如何一次添加到模型中,或者作為一個(gè)數(shù)組或者作為 java.util.List 。 構(gòu)建了家庭模型后,我們看一下如何使用 Jena 的查詢 API 從模型中提取信息?;仨?yè)首查詢 RDF 模型程序化地查詢 Jena 模型主要通過(guò) list() 方法在 Model 和 Resource 接口中執(zhí)行??梢允褂眠@些方法獲得滿足特定條件的主題、對(duì)象和 Statement 。它們還返回 java.util.Iterator 的特

35、殊化,其具有返回特定對(duì)象類型的其他方法。 我們返回 清單 1的家庭模型,看一下可以查詢它的不同方法,如清單 2 所示: 清單 2. 查詢家庭模型/ List everyone in the model who has a child: ResIterator parents = model.listSubjectsWithProperty(parentOf); / Because subjects of statements are Resources, the method returned a ResIterator while (parents.hasNext() / ResIterat

36、or has a typed nextResource() method Resource person = parents.nextResource(); / Print the URI of the resource System.out.println(person.getURI(); / Can also find all the parents by getting the objects of all "childOf" statements / Objects of statements could be Resources or literals, so t

37、he Iterator returned / contains RDFNodes NodeIterator moreParents = model.listObjectsOfProperty(childOf); / To find all the siblings of a specific person, the model itself can be queried NodeIterator siblings = model.listObjectsOfProperty(edward, siblingOf); / But it's more elegant to ask the Re

38、source directly / This method yields an iterator over Statements StmtIterator moreSiblings = edward.listProperties(siblingOf); 最通用的查詢方法是 Model.listStatements(Resource s, Property p, RDFNode o) ,下面說(shuō)明的便利方法都是以其為基礎(chǔ)。所有這些參數(shù)都可以保留為 null ,在這種情況下,它們作為通配符,與任何數(shù)據(jù)都匹配。清單 3 中顯示了 Model.listStatements() 的一些使用示例: 清單 3

39、. 使用選擇器查詢模型/ Find the exact statement "adam is a spouse of dotty" model.listStatements(adam,spouseOf,dotty); / Find all statements with adam as the subject and dotty as the object model.listStatements(adam,null,dotty); / Find any statements made about adam model.listStatements(adam,null,nu

40、ll); / Find any statement with the siblingOf property model.listStatements(null,siblingOf,null); 回頁(yè)首導(dǎo)入和持久化模型不是所有的應(yīng)用程序都從空模型開(kāi)始。更常見(jiàn)的是,在開(kāi)始時(shí)從現(xiàn)有數(shù)據(jù)填充模型。在這種情況下,使用內(nèi)存模型的缺點(diǎn)是每次啟動(dòng)應(yīng)用程序時(shí)都要從頭重新填充模型。另外,每次關(guān)閉應(yīng)用程序時(shí),對(duì)內(nèi)存模型進(jìn)行的更改都將丟失。一種解決方案是使用 Model.write() 序列化模型到文件系統(tǒng),然后在開(kāi)始時(shí)使用 Model.read() 將其取消序列化。不過(guò),Jena 還提供了持久化模型,它們會(huì)被持續(xù)而

41、透明地持久存儲(chǔ)到后備存儲(chǔ)器。Jena 可以在文件系統(tǒng)中或在關(guān)系數(shù)據(jù)庫(kù)中持久化它的模型。當(dāng)前支持的數(shù)據(jù)庫(kù)引擎是 PostgreSQL、Oracle 和 MySQL。 WordNetWordNet 是“英文語(yǔ)言的詞匯數(shù)據(jù)庫(kù)”。我使用的是 Sergey Melnik 和 Stefan Decker 的 RDF 表示。它具有四個(gè)單獨(dú)的模型,本文示例中將使用其中三個(gè)模型。WordNet-nouns 模型包含 WordNet 表示的所有“詞匯概念”和用于表示每個(gè)概念的“單詞形式”。例如,它包含由單詞形式“domestic dog”、“dog”和“Canis familiaris”表示的詞匯概念。第二個(gè)模型

42、是 WordNet-glossary。它提供模型中每個(gè)詞匯概念的簡(jiǎn)短定義?!癲og”的詞匯概念具有詞匯條目“a member of the genus Canis (probably descended from the common wolf) that has been domesticated by man since prehistoric times.”WordNet-hyponyms 是第三個(gè)模型。它定義模型中概念的層次結(jié)構(gòu)。概念“dog”是概念“canine”下位詞,而“canine” 本身是概念“carnivore”的下位詞。為了說(shuō)明如何導(dǎo)入和持久化模型,我將 WordNet

43、1.6 數(shù)據(jù)庫(kù)的 RDF 表示導(dǎo)入到 MySQL 中。因?yàn)槲沂褂玫?WordNet 表示采用多個(gè)單獨(dú) RDF 文檔的形式,將這些文檔導(dǎo)入到一個(gè) Jena 模型中會(huì)合并它們的語(yǔ)句。 圖 2 說(shuō)明了 Nouns 和 Glossary 模型合并后 WordNet 模型的片段的結(jié)構(gòu):圖 2. 合并的 WordNet nouns 和 glossary 模型的結(jié)構(gòu) 創(chuàng)建數(shù)據(jù)庫(kù)后臺(tái)模型的第一步是說(shuō)明 MySQL 驅(qū)動(dòng)類,并創(chuàng)建 DBConnection 實(shí)例。 DBConnection 構(gòu)造函數(shù)使用用戶的 ID 和密碼登錄到數(shù)據(jù)庫(kù)。它還使用包含 Jena 使用的 MySQL 數(shù)據(jù)庫(kù)名稱的數(shù)據(jù)庫(kù) URL 參數(shù)

44、,格式為 "jdbc:mysql:/localhost/dbname" 。Jena 可以在一個(gè)數(shù)據(jù)庫(kù)內(nèi)創(chuàng)建多個(gè)模型。 DBConnection 的最后一個(gè)參數(shù)是數(shù)據(jù)庫(kù)類型,對(duì)于 MySQL,該參數(shù)為 "MySQL" 。 然后 DBConnection 實(shí)例可以與 Jena 的 ModelFactory 一起使用來(lái)創(chuàng)建數(shù)據(jù)庫(kù)后臺(tái)模型。 創(chuàng)建了模型后,可以從文件系統(tǒng)中讀入 WordNet RDF 文檔。不同的 Model.read() 方法可以從 Reader 、 InputStream 或 URL 填充模型??梢酝ㄟ^(guò) Notation3 、N-Triple

45、s 或默認(rèn)情況下通過(guò) RDF/XML 語(yǔ)法解析模型。WordNet 作為 RDF/XML 進(jìn)行序列化,所以不需要指定語(yǔ)法。讀取模型時(shí),可以提供基準(zhǔn) URI。基準(zhǔn) URI 用于將模型中的任何相對(duì) URI 轉(zhuǎn)換成絕對(duì) URI。因?yàn)?WordNet 文檔不包含任何相對(duì) URI,所以此參數(shù)可以指定為 null 。 清單 4 顯示了將 WordNet RDF/XML 文件導(dǎo)入到 MySQL 持久化模型的完整過(guò)程:清單 4. 導(dǎo)入和持久化 WordNet 模型/ Instantiate the MySQL driver Class.forName("com.mysql.jdbc.Driver&q

46、uot;); / Create a database connection object DBConnection connection = new DBConnection(DB_URL, DB_USER, DB_PASSWORD, DB_TYPE); / Get a ModelMaker for database-backed models ModelMaker maker = ModelFactory.createModelRDBMaker(connection); / Create a new model named "wordnet."Setting the se

47、cond parameter to "true" causes an / AlreadyExistsException to be thrown if the db already has a model with this name Model wordnetModel = maker.createModel("wordnet",true); / Start a database transaction.Without one, each statement will be auto-committed / as it is added, which

48、slows down the model import significantly. model.begin(); / For each wordnet model . . InputStream in = this.getClass().getClassLoader().getResourceAsStream(filename); model.read(in,null); / Commit the database transaction model. commit();由于已經(jīng)填充了 wordnet 模型,以后可以通過(guò)調(diào)用 ModelMaker.openModel("wordne

49、t",true); 來(lái)訪問(wèn)該模型。 僅使用 Jena 的 API 查詢像 WordNet 這樣巨大的模型將有一定的限制性,因?yàn)橐獔?zhí)行的每類查詢都將需要專門編寫(xiě)多行的代碼。幸運(yùn)的是,Jena 以 RDQL 形式提供了一種表達(dá)通用查詢的機(jī)制?;仨?yè)首R(shí)DF 數(shù)據(jù)查詢語(yǔ)言(RDQL)RDQL 是 RDF 的查詢語(yǔ)言。雖然 RDQL 還不是正是的標(biāo)準(zhǔn),但已由 RDF 框架廣泛執(zhí)行。RDQL 允許簡(jiǎn)明地表達(dá)復(fù)雜的查詢,查詢引擎執(zhí)行訪問(wèn)數(shù)據(jù)模型的繁重工作。RDQL 的語(yǔ)法表面上類似 SQL 的語(yǔ)法,它的一些概念對(duì)已經(jīng)使用過(guò)關(guān)系數(shù)據(jù)庫(kù)查詢的人來(lái)說(shuō)將比較熟悉。在 Jena Web 站點(diǎn)中可以找到極好的

50、 RDQL 指南,但幾個(gè)簡(jiǎn)單的示例會(huì)對(duì)說(shuō)明基礎(chǔ)知識(shí)大有幫助。使用 jena.rdfquery 工具可以在命令行上對(duì) Jena 模型執(zhí)行 RDQL 查詢。RDFQuery 從文本文件中獲取 RDQL 查詢,然后對(duì)指定的模型運(yùn)行該查詢。對(duì)數(shù)據(jù)庫(kù)后臺(tái)模型運(yùn)行查詢需要相當(dāng)多的參數(shù)。清單 5 中顯示了運(yùn)行下列示例需要的完整命令行: 清單 5. 從命令行運(yùn)行 RDQL 查詢$java jena.rdfquery -data jdbc:mysql:/localhost/jena -user dbuser -password dbpass -driver com.mysql.jdbc.Driver -dbTy

51、pe MySQL -dbName wordnet -query example_query.rdql 正如您看到的,這些參數(shù)中的大多數(shù)參數(shù)都提供了創(chuàng)建與 MySQL 的連接所需的詳細(xì)信息。其中重要的部分是 -query example_query.rdql ,它是 RDQL 文件的位置。還要注意運(yùn)行 jena.rdfquery 需要 Jena 的 lib 目錄中的所有 JAR 文件。 清單 6 顯示了您將檢查的第一個(gè)查詢:清單 6. 查找“domestic dog”的 WordNet 詞匯條目的 RDQL 查詢SELECT ?definition WHERE (?concept, <wn

52、:wordForm>, "domestic dog"), (?concept, <wn:glossaryEntry>, ?definition) USING wn FOR </wn/schema/> SELECT 部分聲明查詢要輸出的變量 在本例中,是名為 definition 的變量。 WHERE 子句引入第二個(gè)變量 concept 并定義與圖形匹配的三元組。查詢?cè)诰哂?WHERE 子句中的所有三元組的圖形中查找語(yǔ)句。所以,在英語(yǔ)中, WHERE 子句的意思為“查找具有 'domestic dog' 作為單詞形式的概念,并查找這些概念的詞匯條目”,如圖 3 所示。 USING 子句提供一種便利,用于聲明名稱空間的前綴。 圖 3. 清單 6 中的 WHERE 子句匹配的圖形 運(yùn)行查詢的結(jié)果為:definition = "a member of the genus Canis (probably descended from the common wolf) that has been domesticated by man since prehistoric times; occurs in many breeds; "

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論