




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)
文檔簡介
1、Jena 簡介一般來說,我們在Protege這樣的編輯器里構(gòu)建了本體,就會想在應(yīng)用程序里使用它,這就需要一些開發(fā)接口。用程序操作本體是很必要的,因為在很多情況下,我們要自動生成本體,靠人手通過Protege創(chuàng)建所有本體是不現(xiàn)實的。Jena是HP公司開發(fā)的這樣一套API,似乎HP公司在本體這方面走得很靠前,其他大公司還在觀望嗎?可以這樣說,Jena對應(yīng)用程序就像Protege對我們,我們使用Protege操作本體,應(yīng)用程序則是使用Jena來做同樣的工作,當(dāng)然這些應(yīng)用程序還是得由我們來編寫。其實Protege本身也是在Jena的基礎(chǔ)上開發(fā)的,你看如果Protege的console里報異常的話,多半
2、會和Jena有關(guān)。最近出了一個Protege OWL API,相當(dāng)于對Jena的包裝,據(jù)說使用起來更方便,這個API就是Protege的OWL Plugin所使用的,相信作者經(jīng)過OWL Plugin的開發(fā)以后,說這些話是有一定依據(jù)的。題目是說用Jena處理OWL,其實Jena當(dāng)然不只能處理OWL,就像Protege除了能處理OWL外還能處理RDF(S)一樣。Jena最基本的使用是處理RDF(S),但畢竟OWL已經(jīng)成為W3C的推薦標(biāo)準(zhǔn),所以對它的支持也是大勢所趨。好了,現(xiàn)在來點實際的,怎樣用Jena讀我們用Protege創(chuàng)建的OWL本體呢,假設(shè)你有一個OWL本體文件(.owl),里面定義了動物類
3、(,注意這并不是一個實際存在的URL,不要試圖去訪問它),并且它有一些實例,現(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的全部功能,同時還有一些
5、Model沒有的功能,例如listClasses()、listObjectProperties(),因為只有在本體里才有“類”和“屬性”的概念。上面的代碼很簡單,從ModelFactory創(chuàng)建一個OntModel,從指定文件把模型讀到內(nèi)存里。再下面的代碼是一個例子,作用是取出模型中所有Animal的實例(Individual,也叫個體),并打印它們的名稱。要從OntModel里取實例,也可以用listIndividuals()方法,只不過你得在得到的實例中判斷它們是不是Animal的實例,我覺得不如用上面這種簡易查詢的方式來得方便。Jena里擴展了很多Iterator,比如ResIterato
6、r、StmtIterator和NodeIterator等等,剛開始用會覺得很別扭,好象還不如都用java標(biāo)準(zhǔn)的Iterator,不知道Jena的設(shè)計者是怎么考慮的。要熟練掌握還是得對整個Jena的API有全局掌握才好。在循環(huán)里,我們得到的每個元素都是一個Resource,因為本體里的任何東西都是資源,不論你想得到Subject、Property還是Object,在Jena里實際得到的都是資源(Resource),在Jena里,Property是Resource的子接口,而Jena并沒有Subject或Object接口。(注:在OWL本體中,Subject->Property->Ob
7、ject組成一個三元組,例如:張小剛->父親->張大剛;或者:綿羊多利->rdf:type->動物,rdf:type是一個特殊的屬性,表示前者是后者的實例)暫時先寫到這,關(guān)于在本體中引入其他本體和使用推理,下次繼續(xù)。本文簡單介紹Jena(Jena 2.4),使用Protégé 3.1(不是最新版本)創(chuàng)建一個簡單的生物(Creature)本體,然后參照J(rèn)ena文檔中的一個例子對本體進行簡單的處理,輸出本體中的Class、Property等信息。本文內(nèi)容安排如下:Ø
8、0; 介紹JenaØ 運行JenaØ Jena Ontology APIØ 例子Ø 參考資料一、介紹JenaJen
9、a由 HP Labs()開發(fā)的Java開發(fā)工具包, 用于Semantic Web(語義網(wǎng))中的應(yīng)用程序開發(fā);Jana是開源的,在下載的文檔中有Jena的完整代碼。Jena框架主要包括:a) 以RDF/XML、三元組形式讀寫RDF 資源描述框架是(RDF)是描述資源的一項標(biāo)準(zhǔn)(在技術(shù)上是W3C的推薦標(biāo)準(zhǔn)),Jena文檔中有一部分呢詳細(xì)介紹了RDF和Jena RDF API,其內(nèi)容包括對Jena RDF包的介紹、RDF模型的創(chuàng)建、讀寫、查詢等操作,以及RDF容器等的討論。b)
10、60; RDFS,OWL,DAML+OIL等本體的操作Jena框架包含一個本體子系統(tǒng)(Ontology Subsystem),它提供的API允許處理基于RDF的本體數(shù)據(jù),也就是說,它支持OWL,DAML+OIL和RDFS。本體API與推理子系統(tǒng)結(jié)合可以從特定本體中提取信息,Jena 2還提供文檔管理器(OntDocumentManager)以支持對導(dǎo)入本體的文檔管理。c) 利用數(shù)據(jù)庫保存數(shù)據(jù) Jena 2允許將數(shù)據(jù)存儲到硬盤中,或者是
11、OWL文件,或者是關(guān)系數(shù)據(jù)庫中。本文處理的本體就是OWL文件讀入的。d) 查詢模型 Jena 2提供了ARQ查詢引擎,它實現(xiàn)SPARQL查詢語言和RDQL,從而支持對模型的查詢。另外,查詢引擎與關(guān)系數(shù)據(jù)庫相關(guān)聯(lián),這使得查詢存儲在關(guān)系數(shù)據(jù)庫中的本體時能夠達到更高的效率。e) 基于規(guī)則的推理Jena 2支持基于規(guī)則的簡單推理,其推理機制支持將推理器(inference reasoners)導(dǎo)
12、入Jena,創(chuàng)建模型時將推理器與模型關(guān)聯(lián)以實現(xiàn)推理。Protégé是一個開源的本體編輯器(目前的版本是Protégé 3.2),用戶可以在GUI環(huán)境下創(chuàng)建本體或者知識庫。有一種說法是:Jena對應(yīng)用程序就像Protégé對我們我們使用Protégé操作本體,應(yīng)用程序則是使用Jena來做同樣的工作。當(dāng)然這些應(yīng)用程序還是得由我們來編寫。二、運行Jena可以在Jena的主頁()下載Jena的最新版本,目前是Jena2.4版本。Jena是Java API,所以需要Java運行環(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了。在解壓目錄下有一個test.bat文件,用于配置的測試。在控制臺運行此程序,如果你的配置正確,測試將順利完成。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,則可以通過修改工程的Java創(chuàng)建路徑的方法導(dǎo)入Jena jar文件。在Eclipse下創(chuàng)建Java工程,右健單擊工程名字,選擇“屬性/Properties”,在打開的對話框中選擇“Java創(chuàng)建路徑/Java Build Path”,在右邊標(biāo)簽中選擇“庫/Libraries”,之后選擇“添加外部文件/Add Extenal JARs”,找到Jena2.4 lib目錄下的所有jar文件并將其添加到工程。這樣就可
16、以運行Jean文檔中的例子了。三、Jena Ontology APIJena2.4的Ontology API包含在ontology包(com.hp.hpl.jena.ontology)中,可以在目錄 Jena-2.4 src com hp hpl jena ontology下查看所有程序的代碼,Jena本體部分的說明網(wǎng)頁是 Jena-2.4 doc ontology index.html,本部分內(nèi)容以及程序的編寫主要參考這兩個文檔。在語義網(wǎng)上有很多表示本體信息的本體語言,其中表達能力最強的是OWL,OWL按復(fù)雜程度分為 OWL Full、OWL DL和OWL Lite三個版本。其他的本體語言還
17、有RDFS、DAML+OIL。Jena Ontology API為語義網(wǎng)應(yīng)用程序開發(fā)者提供了一組獨立于具體語言的一致編程接口。Jena提供的接口本質(zhì)上都是Java程序,也就是.java文件經(jīng)過javac之后生成的.class文件。顯然,class文件并不能提示本體創(chuàng)建使用的語言。為了區(qū)別于其他的表示方法,每種本體語言都有一個自己的框架(profile),它列出了這種語言使用的類(概念)和屬性的構(gòu)建方式和URI。因此,在DAML框架里,對象屬性()的URI是daml:ObjectProperty,而在OWL框架里卻是owl:ObjectProperty。RDFS并沒有定義對象屬性,所以在RDFS
18、框架里,對象屬性的URI是null。在Jena中,這種框架通過參數(shù)的設(shè)置在創(chuàng)建時與本體模型(Ontology Model)綁定在一起。本體模型繼承自Jena中的Model類。Model允許訪問RDF數(shù)據(jù)集合中的陳述(Statements),OntModel對此進行了擴展,以便支持本體中的各種數(shù)據(jù)對象:類(classes)、屬性(properties)、實例(個體individuals)。本部分簡單介紹要用到的幾個java類或者接口。1本體模型OntModel本體模型(OntModel)是對Jena RDF模型的擴展(繼承自RDF模型),提供了處理本體數(shù)據(jù)的功能。使用Jena處理本體首先就是要建
19、立一個本體模型,之后就能夠通過本體模型中所定義的方法操作模型,比如導(dǎo)入子模型()、獲取模型中本體的信息、操作本體屬性以及將本體的表示輸出到磁盤文件等等。Jena通過model包中的ModelFactory創(chuàng)建本體模型,ModelFactory是Jena提供用來創(chuàng)建各種模型的類,在類中定義了具體實現(xiàn)模型的成員數(shù)據(jù)以及創(chuàng)建模型的二十多種方法。一個最簡單的創(chuàng)建本體模型的語句如下:OntModel ontModel = ModelFactory.createOntologyModel();該語句不含參數(shù),應(yīng)用默認(rèn)設(shè)置創(chuàng)建一個本體模型ontModel,也就是說:它使用OWL語言、基于內(nèi)存,支持RDFS推
20、理??梢酝ㄟ^創(chuàng)建時應(yīng)用模型類別(OntModelSpec)參數(shù)創(chuàng)建不同的模型,以實現(xiàn)不同語言不同類型不同推理層次的本體操作。例如,下面的語句創(chuàng)建了一個使用DAML語言內(nèi)存本體模型。直觀地講,內(nèi)存模型就是只在程序運行時存在的模型,它沒有將數(shù)據(jù)寫回磁盤文件或者數(shù)據(jù)庫表。OntModel ontModel = ModelFactory.createOntologyModel( OntModelSpec.DAML_MEM );更多類型設(shè)置可以參照OntModelSpec類中的數(shù)據(jù)成員的說明。我們所使用的本體是從OWL文件獲得的,也就是說,是從磁盤讀取的。讀取的方法是調(diào)用Jena OntoModel提供
21、的Read方法。例如ontModel.read("file:D:/temp/Creatrue/Creature.owl");就是讀取位于D盤相應(yīng)目錄下的Creature.owl文件以建立本體模型。Read方法也有很多重載,上面調(diào)用的方法以文件的絕對路徑作為參數(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)是用來幫助管理本體文檔的類,它包含了導(dǎo)入本體文檔創(chuàng)建本體模型、幫助緩存下載網(wǎng)絡(luò)上的本體等功能。每個本體模型都有一個相關(guān)聯(lián)的文檔管理器。在創(chuàng)建本體模型時,可以創(chuàng)建獨立的文檔管理器并作為參數(shù)傳遞給模型工廠(ModelFactory)。文檔管理器有非常多的配置選項,基本可以滿足應(yīng)用的需求。首先,每個文檔管理器的參數(shù)都可以通過Java代碼來設(shè)置(注:On
23、tDocumentManager有五種重載的構(gòu)造函數(shù))。另外,文檔管理器也可以在創(chuàng)建的時候從一個RDF格式的策略文件讀取相應(yīng)設(shè)定值。下面的例子創(chuàng)建一個文檔管理器并將它與以創(chuàng)建的本體模型關(guān)聯(lián)。OntModel m = ModelFactory.createOntologyModel();OntDocumentManager dm = m.getDocumentManager();(續(xù))見“對Jena的簡單理解和一個例子_2”RDF 越來越被認(rèn)為是表示和處理半結(jié)構(gòu)化數(shù)據(jù)的一種極好選擇。本文中,Web 開發(fā)人員 Philip McCarthy 向您展示了如何使用 Jena Semantic Web
24、Toolkit,以便在 Java 應(yīng)用程序中使用 RDF 數(shù)據(jù)模型。“資源描述框架(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)廣泛用于社會網(wǎng)絡(luò)和自助出版軟件(如 LiveJournal 和 TypePad)。Java 程序員將越來越多地得益于具有使用 RDF 模型的技能。在本文中,我將帶您體驗惠普實驗室的開放源代碼 Jena Semantic Web Framework(請參閱 參考資料)的一些功能。您將了解如何創(chuàng)建和填充 RDF
25、 模型,如何將它們持久存儲到數(shù)據(jù)庫中,以及如何使用 RDQL 查詢語言以程序方式查詢這些模型。最后,我將說明如何使用 Jena 的推理能力從本體推斷模型知識。 本文假設(shè)您已經(jīng)就圖形、三元組和模式等概念方面對 RDF 比較熟悉,并對 Java 編程有基本的了解。創(chuàng)建簡單的 RDF 模型我們從基本操作開始:從頭創(chuàng)建模型并向其添加 RDF 語句。本節(jié),我將說明如何創(chuàng)建描述一組虛構(gòu)家庭成員之間關(guān)系的模型,如圖 1 中所示:圖 1. 虛擬家庭樹將使用來自“關(guān)系”詞匯表(請參閱 參考資料)的屬性 siblingOf 、 spouseOf 、 parentOf 和 childOf 來描述不同的關(guān)系類型。為簡
26、單起見,家庭成員用來自虛構(gòu)名稱空間的 URI( http:/family/ )進行標(biāo)識。詞匯表 URI 通常以 Jena 代碼形式使用,所以將它們聲明為 Java 常量會非常有用,減少了錯誤輸入。 Schemagen當(dāng)您通過 Jena 的 API 來使用模型時,為模型詞匯表中的每個屬性定義常量非常有用。如果有詞匯表的 RDF、DAML 或 OWL 表示,Jena 的 Schemagen 工具可以自動生成這些常量,使您的工作更加容易。Schemagen 在命令行中運行,使用的參數(shù)包括模式或本體文件的位置、要輸出的類的名稱和 Java 包。然后可以導(dǎo)出生成的 Java 類,其 Property 常
27、量用于訪問模型。 還可以使用 Ant 將 Schemagen 作為構(gòu)建處理的一部分來運行,保持 Java 常量類與正在變化的詞匯表保持同步。Jena 的 ModelFactory 類是創(chuàng)建不同類型模型的首選方式。在這種情況下,您想要空的、內(nèi)存模型,所以要調(diào)用的方法是 ModelFactory.createDefaultModel() 。這種方法返回 Model 實例,您將使用它創(chuàng)建表示家庭中每個成員的 Resource 。創(chuàng)建了資源后,可以編寫關(guān)于這些資源的語句并添加到模型中。 在 Jena 中,語句的主題永遠是 Resource ,謂詞由 Property 表示,對象是另一個 Resourc
28、e 或常量值。常量在 Jena 中通過 Literal 類型表示。所有這些類型共享公共接口 RDFNode 。將需要四個不同的 Property 實例表示家庭樹中的關(guān)系。這些實例使用 Model.createProperty() 創(chuàng)建。 將語句添加到模型中的最簡單方法是通過調(diào)用 Resource.addProperty() 。此方法以 Resource 作為主題在模型中創(chuàng)建語句。該方法使用兩個參數(shù),表示語句謂詞的 Property 和語句的對象。 addProperty() 方法被過載:一個過載使用 RDFNode 作為對象,所以可以使用 Resource 或 Literal 。還有有益過載,
29、它們使用由 Java 原語或 String 表示的常量。在示例中,語句的對象是表示其他家庭成員的 Resource 。 通過使用三元組的主題、謂詞和對象調(diào)用 Model.createStatement() ,還可以直接在模型上創(chuàng)建語句。注意以此種方式創(chuàng)建 Statement 不將其添加到模型中。如果想將其添加到模型中,請使用創(chuàng)建的 Statement 調(diào)用 Model.add() ,如清單 1 所示: 清單 1. 創(chuàng)建模型來表示虛構(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); 整個代碼示例 FamilyModel.java 還說明了語句批量如何一次添加到模型中,或者作為一個數(shù)組或者作為 java.util.List 。 構(gòu)建了家庭模型后,我們看一下如何使用 Jena 的查詢 API 從模型中提取信息。回頁首查詢 RDF 模型程序化地查詢 Jena 模型主要通過 list() 方法在 Model 和 Resource 接口中執(zhí)行。可以使用這些方法獲得滿足特定條件的主題、對象和 Statement 。它們還返回 java.util.Iterator 的特
35、殊化,其具有返回特定對象類型的其他方法。 我們返回 清單 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) ,下面說明的便利方法都是以其為基礎(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); 回頁首導(dǎo)入和持久化模型不是所有的應(yīng)用程序都從空模型開始。更常見的是,在開始時從現(xiàn)有數(shù)據(jù)填充模型。在這種情況下,使用內(nèi)存模型的缺點是每次啟動應(yīng)用程序時都要從頭重新填充模型。另外,每次關(guān)閉應(yīng)用程序時,對內(nèi)存模型進行的更改都將丟失。一種解決方案是使用 Model.write() 序列化模型到文件系統(tǒng),然后在開始時使用 Model.read() 將其取消序列化。不過,Jena 還提供了持久化模型,它們會被持續(xù)而
41、透明地持久存儲到后備存儲器。Jena 可以在文件系統(tǒng)中或在關(guān)系數(shù)據(jù)庫中持久化它的模型。當(dāng)前支持的數(shù)據(jù)庫引擎是 PostgreSQL、Oracle 和 MySQL。 WordNetWordNet 是“英文語言的詞匯數(shù)據(jù)庫”。我使用的是 Sergey Melnik 和 Stefan Decker 的 RDF 表示。它具有四個單獨的模型,本文示例中將使用其中三個模型。WordNet-nouns 模型包含 WordNet 表示的所有“詞匯概念”和用于表示每個概念的“單詞形式”。例如,它包含由單詞形式“domestic dog”、“dog”和“Canis familiaris”表示的詞匯概念。第二個模型
42、是 WordNet-glossary。它提供模型中每個詞匯概念的簡短定義。“dog”的詞匯概念具有詞匯條目“a member of the genus Canis (probably descended from the common wolf) that has been domesticated by man since prehistoric times.”WordNet-hyponyms 是第三個模型。它定義模型中概念的層次結(jié)構(gòu)。概念“dog”是概念“canine”下位詞,而“canine” 本身是概念“carnivore”的下位詞。為了說明如何導(dǎo)入和持久化模型,我將 WordNet
43、1.6 數(shù)據(jù)庫的 RDF 表示導(dǎo)入到 MySQL 中。因為我使用的 WordNet 表示采用多個單獨 RDF 文檔的形式,將這些文檔導(dǎo)入到一個 Jena 模型中會合并它們的語句。 圖 2 說明了 Nouns 和 Glossary 模型合并后 WordNet 模型的片段的結(jié)構(gòu):圖 2. 合并的 WordNet nouns 和 glossary 模型的結(jié)構(gòu) 創(chuàng)建數(shù)據(jù)庫后臺模型的第一步是說明 MySQL 驅(qū)動類,并創(chuàng)建 DBConnection 實例。 DBConnection 構(gòu)造函數(shù)使用用戶的 ID 和密碼登錄到數(shù)據(jù)庫。它還使用包含 Jena 使用的 MySQL 數(shù)據(jù)庫名稱的數(shù)據(jù)庫 URL 參數(shù)
44、,格式為 "jdbc:mysql:/localhost/dbname" 。Jena 可以在一個數(shù)據(jù)庫內(nèi)創(chuàng)建多個模型。 DBConnection 的最后一個參數(shù)是數(shù)據(jù)庫類型,對于 MySQL,該參數(shù)為 "MySQL" 。 然后 DBConnection 實例可以與 Jena 的 ModelFactory 一起使用來創(chuàng)建數(shù)據(jù)庫后臺模型。 創(chuàng)建了模型后,可以從文件系統(tǒng)中讀入 WordNet RDF 文檔。不同的 Model.read() 方法可以從 Reader 、 InputStream 或 URL 填充模型。可以通過 Notation3 、N-Triple
45、s 或默認(rèn)情況下通過 RDF/XML 語法解析模型。WordNet 作為 RDF/XML 進行序列化,所以不需要指定語法。讀取模型時,可以提供基準(zhǔn) URI。基準(zhǔn) URI 用于將模型中的任何相對 URI 轉(zhuǎn)換成絕對 URI。因為 WordNet 文檔不包含任何相對 URI,所以此參數(shù)可以指定為 null 。 清單 4 顯示了將 WordNet RDF/XML 文件導(dǎo)入到 MySQL 持久化模型的完整過程:清單 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 模型,以后可以通過調(diào)用 ModelMaker.openModel("wordne
49、t",true); 來訪問該模型。 僅使用 Jena 的 API 查詢像 WordNet 這樣巨大的模型將有一定的限制性,因為要執(zhí)行的每類查詢都將需要專門編寫多行的代碼。幸運的是,Jena 以 RDQL 形式提供了一種表達通用查詢的機制。回頁首RDF 數(shù)據(jù)查詢語言(RDQL)RDQL 是 RDF 的查詢語言。雖然 RDQL 還不是正是的標(biāo)準(zhǔn),但已由 RDF 框架廣泛執(zhí)行。RDQL 允許簡明地表達復(fù)雜的查詢,查詢引擎執(zhí)行訪問數(shù)據(jù)模型的繁重工作。RDQL 的語法表面上類似 SQL 的語法,它的一些概念對已經(jīng)使用過關(guān)系數(shù)據(jù)庫查詢的人來說將比較熟悉。在 Jena Web 站點中可以找到極好的
50、 RDQL 指南,但幾個簡單的示例會對說明基礎(chǔ)知識大有幫助。使用 jena.rdfquery 工具可以在命令行上對 Jena 模型執(zhí)行 RDQL 查詢。RDFQuery 從文本文件中獲取 RDQL 查詢,然后對指定的模型運行該查詢。對數(shù)據(jù)庫后臺模型運行查詢需要相當(dāng)多的參數(shù)。清單 5 中顯示了運行下列示例需要的完整命令行: 清單 5. 從命令行運行 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 文件的位置。還要注意運行 jena.rdfquery 需要 Jena 的 lib 目錄中的所有 JAR 文件。 清單 6 顯示了您將檢查的第一個查詢:清單 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 子句引入第二個變量 concept 并定義與圖形匹配的三元組。查詢在具有 WHERE 子句中的所有三元組的圖形中查找語句。所以,在英語中, WHERE 子句的意思為“查找具有 'domestic dog' 作為單詞形式的概念,并查找這些概念的詞匯條目”,如圖 3 所示。 USING 子句提供一種便利,用于聲明名稱空間的前綴。 圖 3. 清單 6 中的 WHERE 子句匹配的圖形 運行查詢的結(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. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 藝術(shù)品租賃合同
- 會議場地租賃合同協(xié)議書
- 保密協(xié)議商業(yè)合同
- 無錫工藝職業(yè)技術(shù)學(xué)院《工程安全健康與環(huán)境管理》2023-2024學(xué)年第二學(xué)期期末試卷
- 寧夏民族職業(yè)技術(shù)學(xué)院《賓館酒店管理》2023-2024學(xué)年第二學(xué)期期末試卷
- 菏澤家政職業(yè)學(xué)院《輕工行業(yè)清潔生產(chǎn)及污染控制技術(shù)》2023-2024學(xué)年第二學(xué)期期末試卷
- Unit 5 Revealing Nature Developing ideas The Secret Language of Plants教學(xué)設(shè)計 2024-2025學(xué)年高中英語人教版選擇性必修第二冊
- 沈陽醫(yī)學(xué)院《機器人工程專業(yè)導(dǎo)論》2023-2024學(xué)年第二學(xué)期期末試卷
- 寧夏財經(jīng)職業(yè)技術(shù)學(xué)院《主題閱讀(1)》2023-2024學(xué)年第二學(xué)期期末試卷
- 山東勝利職業(yè)學(xué)院《化工原理一》2023-2024學(xué)年第二學(xué)期期末試卷
- 期末測試卷(一)(試題)2023-2024學(xué)年二年級上冊數(shù)學(xué)蘇教版
- 攜程在線能力測評真題
- 人教版(2024)六年級全一冊 第17課 設(shè)計我的種植園
- 承包商入廠安全培訓(xùn)試題附參考答案【完整版】
- 四川省公務(wù)員考試行測真題
- 2024年廣東省初中學(xué)業(yè)水平考試中考英語試卷(真題+答案解析)
- DL-T-255-2012燃煤電廠能耗狀況評價技術(shù)規(guī)范
- 家庭教育家長會教案及反思(3篇模板)
- 職業(yè)培訓(xùn)師三級操作技能鑒定卷庫及答案
- 【視頻號運營】視頻號運營108招
- 新能源客車安全應(yīng)急處理指南
評論
0/150
提交評論