国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費(fèi)電子書(shū)等14項(xiàng)超值服

開(kāi)通VIP
Jena 簡(jiǎn)介

Philip McCarthy (phil@planetrdf.com), 開(kāi)發(fā)人員, SmartStream Technologies Ltd

2004 年 7 月 01 日

RDF 越來(lái)越被認(rèn)為是表示和處理半結(jié)構(gòu)化數(shù)據(jù)的一種極好選擇。本文中,Web 開(kāi)發(fā)人員 Philip McCarthy 向您展示了如何使用 Jena Semantic Web 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)廣泛用于社會(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 模型,如何將它們持久存儲(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 、 parentOfchildOf 來(lái)描述不同的關(guān)系類(lèi)型。為簡(jiǎn)單起見(jiàn),家庭成員用來(lái)自虛構(gòu)名稱(chēng)空間的 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ù)包括模式或本體文件的位置、要輸出的類(lèi)的名稱(chēng)和 Java 包。然后可以導(dǎo)出生成的 Java 類(lèi),其 Property 常量用于訪問(wèn)模型。

還可以使用 Ant 將 Schemagen 作為構(gòu)建處理的一部分來(lái)運(yùn)行,保持 Java 常量類(lèi)與正在變化的詞匯表保持同步。

Jena 的 ModelFactory 類(lèi)是創(chuàng)建不同類(lèi)型模型的首選方式。在這種情況下,您想要空的、內(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è) Resource 或常量值。常量在 Jena 中通過(guò) Literal 類(lèi)型表示。所有這些類(lèi)型共享公共接口 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ì)象,所以可以使用 ResourceLiteral 。還有有益過(guò)載,它們使用由 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 relationshipUri = "http://purl.org/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(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.createProperty(relationshipUri,"childOf");
                        Property parentOf = model.createProperty(relationshipUri,"parentOf");
                        Property siblingOf = model.createProperty(relationshipUri,"siblingOf");
                        Property spouseOf = model.createProperty(relationshipUri,"spouseOf");
                        // Add 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 add 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() 方法在 ModelResource 接口中執(zhí)行。可以使用這些方法獲得滿足特定條件的主題、對(duì)象和 Statement 。它們還返回 java.util.Iterator 的特殊化,其具有返回特定對(duì)象類(lèi)型的其他方法。

我們返回 清單 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()) {
                        // ResIterator 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 the 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 Resource 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. 使用選擇器查詢模型
// 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,null);
                        // 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ù)而透明地持久存儲(chǔ)到后備存儲(chǔ)器。Jena 可以在文件系統(tǒng)中或在關(guān)系數(shù)據(jù)庫(kù)中持久化它的模型。當(dāng)前支持的數(shù)據(jù)庫(kù)引擎是 PostgreSQL、Oracle 和 MySQL。

WordNet

WordNet 是“英文語(yǔ)言的詞匯數(shù)據(jù)庫(kù)”。我使用的是 Sergey Melnik 和 Stefan Decker 的 RDF 表示。它具有四個(gè)單獨(dú)的模型,本文示例中將使用其中三個(gè)模型。

WordNet-nouns 模型包含 WordNet 表示的所有“詞匯概念”和用于表示每個(gè)概念的“單詞形式”。例如,它包含由單詞形式“domestic dog”、“dog”和“Canis familiaris”表示的詞匯概念。

第二個(gè)模型是 WordNet-glossary。它提供模型中每個(gè)詞匯概念的簡(jiǎn)短定義。“dog”的詞匯概念具有詞匯條目“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 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)類(lèi),并創(chuàng)建 DBConnection 實(shí)例。 DBConnection 構(gòu)造函數(shù)使用用戶的 ID 和密碼登錄到數(shù)據(jù)庫(kù)。它還使用包含 Jena 使用的 MySQL 數(shù)據(jù)庫(kù)名稱(chēng)的數(shù)據(jù)庫(kù) URL 參數(shù),格式為 "jdbc:mysql://localhost/dbname" 。Jena 可以在一個(gè)數(shù)據(jù)庫(kù)內(nèi)創(chuàng)建多個(gè)模型。 DBConnection 的最后一個(gè)參數(shù)是數(shù)據(jù)庫(kù)類(lèi)型,對(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 、 InputStreamURL 填充模型??梢酝ㄟ^(guò) Notation3 、N-Triples 或默認(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");
                        // 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 second 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 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("wordnet",true); 來(lái)訪問(wèn)該模型。

僅使用 Jena 的 API 查詢像 WordNet 這樣巨大的模型將有一定的限制性,因?yàn)橐獔?zhí)行的每類(lèi)查詢都將需要專(zhuān)門(mén)編寫(xiě)多行的代碼。幸運(yùn)的是,Jena 以 RDQL 形式提供了一種表達(dá)通用查詢的機(jī)制。





回頁(yè)首


RDF 數(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ǔ)法表面上類(lèi)似 SQL 的語(yǔ)法,它的一些概念對(duì)已經(jīng)使用過(guò)關(guān)系數(shù)據(jù)庫(kù)查詢的人來(lái)說(shuō)將比較熟悉。在 Jena Web 站點(diǎn)中可以找到極好的 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 --dbType 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:wordForm>, "domestic dog"),
                        (?concept, <wn:glossaryEntry>, ?definition)
                        USING
                        wn FOR <http://www.cogsci.princeton.edu/~wn/schema/>
                        

SELECT 部分聲明查詢要輸出的變量 — 在本例中,是名為 definition 的變量。 WHERE 子句引入第二個(gè)變量 concept 并定義與圖形匹配的三元組。查詢?cè)诰哂?WHERE 子句中的所有三元組的圖形中查找語(yǔ)句。所以,在英語(yǔ)中, WHERE 子句的意思為“查找具有 'domestic dog' 作為單詞形式的概念,并查找這些概念的詞匯條目”,如圖 3 所示。 USING 子句提供一種便利,用于聲明名稱(chēng)空間的前綴。


圖 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; "the
                        dog barked all night""
                        

所以這種情況僅有一個(gè)結(jié)果。清單 7 中顯示的下個(gè)查詢的意思為“查找單詞 'bear' 表示的概念,并查找這些概念的詞匯條目”。


清單 7. 查找“bear”的 WordNet 詞匯條目的 RDQL 查詢
SELECT
                        ?definition
                        WHERE
                        (?concept, <wn:wordForm>, "bear"),
                        (?concept, <wn:glossaryEntry>, ?definition)
                        USING
                        wn FOR <http://www.cogsci.princeton.edu/~wn/schema/>
                        

此查詢返回 15 個(gè)結(jié)果,因?yàn)榇藛卧~形式表示多個(gè)不同的概念。結(jié)果為:

definition
                        ===============================================================================
                        "massive plantigrade carnivorous or omnivorous mammals with long shaggy coats
                        and strong claws"
                        "an investor with a pessimistic market outlook"
                        "have on one's person; "He wore a red ribbon"; "bear a scar""
                        "give birth (to a newborn); "My wife had twins yesterday!""
                        

清單 8 中顯示了另一個(gè)示例,查找其他兩個(gè)單詞的上位詞(母詞):


清單 8. 查找“panther”和“tiger”的 WordNet 上位詞的 RDQL 查詢
SELECT
                        ?wordform, ?definition
                        WHERE
                        (?firstconcept, <wn:wordForm>, "panther"),
                        (?secondconcept, <wn:wordForm>, "tiger"),
                        (?firstconcept, <wn:hyponymOf>, ?hypernym),
                        (?secondconcept, <wn:hyponymOf>, ?hypernym),
                        (?hypernym, <wn:wordForm>, ?wordform),
                        (?hypernym, <wn:glossaryEntry>, ?definition)
                        USING
                        wn FOR <http://www.cogsci.princeton.edu/~wn/schema/>
                        

此處,查詢的意思是“查找單詞 'panther' 和 'tiger' 所指的概念;查找第三個(gè)概念,前兩個(gè)概念是其下位詞;查找第三個(gè)概念的可能的單詞和詞會(huì)條目”,如圖 4 所示:


圖 4. 清單 8 中 WHERE 子句匹配的圖形

wordformdefinition 都在 SELECT 子句中聲明,所以它們都是輸出。盡管詞查詢僅匹配了一個(gè) WordNet 概念,查詢的圖形可以以兩種方式匹配,因?yàn)樵摳拍钣袃蓚€(gè)不同的單詞形式:

wordform  | definition
                        =====================================================================================
                        "big cat" | "any of several large cats typically able to roar and living in the wild"
                        "cat"     | "any of several large cats typically able to roar and living in the wild"
                        





回頁(yè)首


使用 Jena 中的 RDQL

Jena 的 com.hp.hpl.jena.rdql 包包含在 Java 代碼中使用 RDQL 所需的所有類(lèi)和接口。要?jiǎng)?chuàng)建 RDQL 查詢,將 RDQL 放入 String 中,并將其傳送給 Query 的構(gòu)造函數(shù)。通常直接設(shè)置模型用作查詢的源,除非在 RDQL 中使用 FROM 子句指定了其他的源。一旦創(chuàng)建了 Query ,可以從它創(chuàng)建 QueryEngine ,然后執(zhí)行查詢。清單 9 中說(shuō)明了此過(guò)程:


清單 9. 創(chuàng)建和運(yùn)行 RDQL 查詢
// Create a new query passing a String containing the RDQL to execute
                        Query query = new Query(queryString);
                        // Set the model to run the query against
                        query.setSource(model);
                        // Use the query to create a query engine
                        QueryEngine qe = new QueryEngine(query);
                        // Use the query engine to execute the query
                        QueryResults results = qe.exec();
                        

使用 Query 的一個(gè)非常有用的方法是在執(zhí)行之前將它的一些變量設(shè)置為固定值。這種使用模式與 javax.sql.PreparedStatement 的相似。變量通過(guò) ResultBinding 對(duì)象與值綁定,執(zhí)行時(shí)該對(duì)象會(huì)傳送給 QueryEngine 。可以將變量與 Jena Resource 或與常量值綁定。在將常量與變量綁定之前,通過(guò)調(diào)用 Model.createLiteral 將其打包。清單 10 說(shuō)明了預(yù)先綁定方法:


清單 10. 將查詢變量與值綁定
// Create a query that has variables x and y
                        Query query = new Query(queryString);
                        // A ResultBinding specifies mappings between query variables and values
                        ResultBinding initialBinding = new ResultBinding() ;
                        // Bind the query's first variable to a resource
                        Resource someResource = getSomeResource();
                        initialBinding.add("x", someResource);
                        // Bind the query's second variable to a literal value
                        RDFNode foo = model.createLiteral("bar");
                        initialBinding.add("y", foo);
                        // Execute the query with the specified values for x and y
                        QueryEngine qe = new QueryEngine(query);
                        QueryResults results = qe.exec(initialBinding);
                        

QueryEngine.exec() 返回的 QueryResults 對(duì)象執(zhí)行 java.util.Iterator 。 next() 方法返回 ResultBinding 對(duì)象。查詢中使用的所有變量都可以憑名稱(chēng)通過(guò) ResultBinding 獲得,而不管它們是否是 SELECT 子句的一部分。清單 11 顯示了如何進(jìn)行此操作,仍使用 清單 6中的 RDQL 查詢:


清單 11. 查找“domestic dog”的 WordNet 詞匯條目的 RDQL 查詢
SELECT
                        ?definition
                        WHERE
                        (?concept, <wn:wordForm>, "domestic dog"),
                        (?concept, <wn:glossaryEntry>, ?definition)
                        USING
                        wn FOR <http://www.cogsci.princeton.edu/~wn/schema/>";
                        

運(yùn)行此查詢獲得的 ResultBinding 如期望的那樣包含常量詞匯條目。另外,還可以訪問(wèn)變量 concept 。變量通過(guò)調(diào)用 ResultBinding.get() 憑名稱(chēng)獲得。通過(guò)此方法返回的所有變量都可以轉(zhuǎn)換成 RDFNode ,如果您想將這些變量綁定回更進(jìn)一步的 RDQL 查詢,這將非常有用。

這種情況下, concept 變量表示 RDF 資源,所以從 ResultBinding.get() 獲得的 Object 可以轉(zhuǎn)換成 Resource 。然后可以調(diào)用 Resource 的查詢方法來(lái)進(jìn)一步探查這部分模型,如清單 12 中所示:


清單 12. 使用查詢結(jié)果
// Execute a query
                        QueryResults results = qe.exec();
                        // Loop over the results
                        while (results.hasNext()) {
                        ResultBinding binding = (ResultBinding)results.next();
                        // Print the literal value of the "definition" variable
                        RDFNode definition = (RDFNode) binding.get("definition");
                        System.out.println(definition.toString());
                        // Get the RDF resource used in the query
                        Resource concept = (Resource)binding.get("concept");
                        // Query the concept directly to find other wordforms it has
                        List wordforms = concept.listObjectsOfProperty(wordForm);
                        }
                        

程序源碼下載中包含的程序 FindHypernym.java(請(qǐng)參閱 參考資料)匯總了您這里研究的區(qū)域。它查找命令行上給定單詞的上位詞,清單 13 中顯示了使用的查詢:


清單 13. 查找概念的上位詞的單詞形式和詞匯條目的 RDQL 查詢
SELECT
                        ?hypernym, ?definition
                        WHERE
                        (?firstconcept, <wn:wordForm>, ?hyponym),
                        (?firstconcept, <wn:hyponymOf>, ?secondconcept),
                        (?secondconcept, <wn:wordForm>, ?hypernym),
                        (?secondconcept, <wn:glossaryEntry>, ?definition)
                        USING
                        wn FOR <http://www.cogsci.princeton.edu/~wn/schema/>
                        

命令行上給出的單詞與 hyponym 詞語(yǔ)綁定,查詢查找該單詞表示的概念,查找第二個(gè)概念(第一個(gè)概念是它的下位詞),然后輸出第二個(gè)概念的單詞形式和定義。清單 14 顯示了輸出:


清單 14. 運(yùn)行示例 FindHypernym 程序
$ java FindHypernym "wisteria"
                        Hypernyms found for 'wisteria':
                        vine:weak-stemmed plant that derives support from climbing, twining,
                        or creeping along a surface





回頁(yè)首


使用 OWL 添加意義

您可能想知道為什么“wisteria”的上位詞搜索僅返回它的直接上位詞“vine”。如果從植物學(xué)觀點(diǎn),您可能還希望顯示“traceophyte”也顯示為上位詞,以及“plant”。實(shí)際上,WordNet 模型表明“wisteria”是“vine”的下位詞,“vine”是“traceophyte”的下位詞。直觀地,您知道“wisteria”因此是“traceophyte”的下位詞,因?yàn)槟馈癶yponym of”關(guān)系是 可傳遞的。所以您需要有一種方法將這種認(rèn)識(shí)合并到 FindHypernym 程序中,從而產(chǎn)生了 OWL。

可傳遞關(guān)系

關(guān)系對(duì)于三個(gè)元素 abc是可傳遞的,從而 ab之間及 bc之間存在關(guān)系意味著 ac之間存在關(guān)系。

可傳遞關(guān)系的一個(gè)示例是“大于”關(guān)系。如果 a大于 b, b大于 c,因而 a肯定大于 c。

Web Ontology Language 或 OWL 是 W3C 推薦標(biāo)準(zhǔn),設(shè)計(jì)用來(lái)“明確表示詞匯表中詞語(yǔ)的意義以及那些詞語(yǔ)之間的關(guān)系”。與 RDF Schema 一起,OWL 提供了一種正式地描述 RDF 模型的機(jī)制。除了定義資源可以屬于的層次結(jié)構(gòu)類(lèi),OWL 還允許表達(dá)資源的屬性特征。例如,在 清單 1 中使用的 Relationship 詞匯表中,可以使用 OWL 說(shuō)明 childOf 屬性與 parentOf 屬性相反。另一個(gè)示例說(shuō)明 WordNet 詞匯表的 hyponymOf 屬性是可傳遞的。

在 Jena 中,本體被看作一種特殊類(lèi)型的 RDF 模型 OntModel 。此接口允許程序化地對(duì)本地進(jìn)行操作,使用便利方法創(chuàng)建類(lèi)、屬性限制等等。備選方法將本體看作特殊 RDF 模型,僅添加定義其語(yǔ)義規(guī)則的語(yǔ)句。清單 15 中說(shuō)明了這些技術(shù)。注意還可以將本體語(yǔ)句添加到現(xiàn)有數(shù)據(jù)模型中,或使用 Model.union() 將本體模型與數(shù)據(jù)模型合并。


清單 15. 創(chuàng)建 WordNet 的 OWL 本體模型
// Make a new model to act as an OWL ontology for WordNet
                        OntModel wnOntology = ModelFactory.createOntologyModel();
                        // Use OntModel's convenience method to describe
                        // WordNet's hyponymOf property as transitive
                        wnOntology.createTransitiveProperty(WordnetVocab.hyponymOf.getURI());
                        // Alternatively, just add a statement to the underlying model to express that
                        // hyponymOf is of type TransitiveProperty
                        wnOntology.add(WordnetVocab.hyponymOf, RDF.type, OWL.TransitiveProperty);





回頁(yè)首


使用 Jena 推理

給定了本體和模型后,Jena 的推理引擎可以派生模型未明確表達(dá)的其他語(yǔ)句。Jena 提供了多個(gè) Reasoner 類(lèi)型來(lái)使用不同類(lèi)型的本體。因?yàn)橐獙?OWL 本體與 WordNet 模型一起使用,所以需要 OWLReasoner

下例顯示了如何將 OWL WordNet 本體應(yīng)用到 WordNet 模型自身以創(chuàng)建推理模型。這里我實(shí)際將使用 WordNet 模型的子集,僅包含下位詞層次結(jié)構(gòu)中“plant life”之下的那些名詞。僅使用子集的原因是推理模型需要保存在內(nèi)存中,WordNet 模型對(duì)于內(nèi)存模型過(guò)大而不能實(shí)現(xiàn)。我用來(lái)從整個(gè) WordNet 模型中提取 plants 模型的代碼包含在文章來(lái)源中,名為 ExtractPlants.java(請(qǐng)參閱 參考資料)。

首先我從 ReasonerRegistry 中獲得 OWLReasoner 。 ReasonerRegistry.getOWLReasoner() 在它的標(biāo)準(zhǔn)配置中返回 OWL reasoner,這對(duì)于此簡(jiǎn)單情況已經(jīng)足夠。下一步是將 reasoner 與 WordNet 本體綁定。此操作返回可以應(yīng)用本體規(guī)則的 reasoner。然后,將使用綁定的 reasoner 從 WordNet 模型創(chuàng)建 InfModel

從原始數(shù)據(jù)和 OWL 本體創(chuàng)建了推理模型后,它就可以像任何其他 Model 實(shí)例一樣進(jìn)行處理。因此,如清單 16 所示,通過(guò) FindHypernym.java 與正常 Jena 模型一起使用的 Java 代碼和 RDQL 查詢可以重新應(yīng)用到推理模型,而不進(jìn)行任何更改:


清單 16. 創(chuàng)建和查詢推理模型
// Get a reference to the WordNet plants model
                        ModelMaker maker = ModelFactory.createModelRDBMaker(connection);
                        Model model = maker.openModel("wordnet-plants",true);
                        // Create an OWL reasoner
                        Reasoner owlReasoner = ReasonerRegistry.getOWLReasoner();
                        // Bind the reasoner to the WordNet ontology model
                        Reasoner wnReasoner = owlReasoner.bindSchema(wnOntology);
                        // Use the reasoner to create an inference model
                        InfModel infModel = ModelFactory.createInfModel(wnReasoner, model);
                        // Set the inference model as the source of the
                        query query.setSource(infModel);
                        // Execute the query as normal
                        QueryEngine qe = new QueryEngine(query);
                        QueryResults results = qe.exec(initialBinding);
                        

文章來(lái)源中有完整清單,名為 FindInferredHypernyms.java。清單 17 顯示了當(dāng)對(duì)推理模型查詢“wisteria”的上位詞時(shí)的結(jié)果:


清單 17. 運(yùn)行示例 FindInferredHypernyms 程序
$ java FindInferredHypernyms wisteria
                        Hypernyms found for 'wisteria':
                        vine:weak-stemmed plant that derives support from climbing, twining, or creeping along a surface
                        tracheophyte:green plant having a vascular system:ferns, gymnosperms, angiosperms
                        vascular plant:green plant having a vascular system:ferns, gymnosperms, angiosperms
                        plant life:a living organism lacking the power of locomotion
                        flora:a living organism lacking the power of locomotion
                        plant:a living organism lacking the power of locomotion
                        

OWL 本體中包含的信息已經(jīng)使 Jena 可以推斷“wisteria”在模型中有上位詞。





回頁(yè)首


結(jié)束語(yǔ)

本文說(shuō)明了 Jena Semantic Web Toolkit 的一些最重要的功能,并用示例說(shuō)明了如何創(chuàng)建、導(dǎo)入和持久化 RDF 模型。您已經(jīng)了解了查詢模型的不同方法,并看到了如何使用 RDQL 簡(jiǎn)明地表達(dá)任意查詢。另外,您還了解了如何使用 Jena 的推理引擎對(duì)基于本體的模型進(jìn)行推理。

本文中的示例已經(jīng)說(shuō)明了將數(shù)據(jù)表示為 RDF 模型的一些效果,以及 RDQL 從這些模型中提取數(shù)據(jù)的靈活性。當(dāng)在您自己的 Java 應(yīng)用程序中使用 RDF 模型時(shí),這里說(shuō)明的基本方法將是非常有用的起點(diǎn)。

Jena 是綜合的 RDF 工具集,它的功能遠(yuǎn)不止您這里了解的這些。Jena 項(xiàng)目的主頁(yè)是開(kāi)始學(xué)習(xí)其功能的好地方。






回頁(yè)首


下載

名字 大小 下載方法
j-jena-examples.zip HTTP
關(guān)于下載方法的信息


參考資料



關(guān)于作者

 

Philip McCarthy 是一名 Web 開(kāi)發(fā)人員,專(zhuān)門(mén)研究 J2EE 和前沿技術(shù)。他有四年的 Java 編程經(jīng)驗(yàn),曾在 Orange 從事客戶 Internet 應(yīng)用程序開(kāi)發(fā)。他目前在 SmartStream Technologies 開(kāi)發(fā)基于 Web 的財(cái)務(wù)應(yīng)用程序。

本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
對(duì)Jena的簡(jiǎn)單理解和一個(gè)例子
本體論及語(yǔ)義搜索引擎
面向鐵路站場(chǎng)平面數(shù)字化設(shè)計(jì)系統(tǒng)的本體建模研究
構(gòu)建細(xì)粒度商品本體元模型和實(shí)例運(yùn)用
JENA操作本體
使用jena寫(xiě)入多個(gè)本體文件到mysql
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長(zhǎng)圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服