監(jiān)理公司管理系統(tǒng) | 工程企業(yè)管理系統(tǒng) | OA系統(tǒng) | ERP系統(tǒng) | 造價咨詢管理系統(tǒng) | 工程設(shè)計管理系統(tǒng) | 甲方項目管理系統(tǒng) | 簽約案例 | 客戶案例 | 在線試用
X 關(guān)閉

武漢OA信息化的基本XML和RDF技術(shù)(二):將文件合并到RDF模型和基本的RDF查詢

申請免費試用、咨詢電話:400-8352-114

AMTeam.org

知識管理的基本XML和RDF技術(shù)(二) : 將文件合并到RDF模型和基本的RDF查詢


Uche Ogbuji(
uche.ogbuji@fourthought.com

首席顧問,F(xiàn)ourthought, Inc.

2001 年 9 月

這篇“Thinking XML”專欄文章演示了如何將從多個 XML 源文檔中收集的元數(shù)據(jù)合并到用于有效查詢的單個“資源描述框架”(Resource Description Frame (RDF))模型中。專欄作家 Uche Ogbuji 在前一篇中介紹了如何一起使用 XML 和 RDF 來進行知識管理,本文是上一篇的繼續(xù),在本文中他論述了基于用從現(xiàn)有的 XML 格式獲取的數(shù)據(jù)組成 RDF 模型的技術(shù)。該文的中心是一個示例,在該示例中,擴展基于 Web 的問題跟蹤器(最初開發(fā)它來操縱 XML 格式的應(yīng)用程序數(shù)據(jù))來利用 RDF。XSLT 和 Python 樣本代碼清單演示了將來自 XML 文件的元數(shù)據(jù)聚合到單個 RDF 模型(一個使用 XSLT ,另一個使用 RDF)以及簡單 RDF 查詢的示例。

在本專欄的前一篇文章中,即知識管理的基本 XML 和 RDF 技術(shù),第一部分(在繼續(xù)閱讀之前,可能需要重新回顧一下),介紹了一個基于收集的數(shù)據(jù)(以 XML 格式表示)的問題跟蹤器應(yīng)用程序示例。然后演示了如何使用 XSLT 從應(yīng)用程序數(shù)據(jù)中抽取 RDF。

本專欄文章通過演示如何組合由轉(zhuǎn)換每個 XML 源文檔所創(chuàng)建的離散的 RDF 片段來完成這些事情。同時還演示了一些基本的查詢技術(shù)。

資源批量派生

在上篇專欄文章中,完成了一個從 XML 源文件中抽取作為序列化格式的 RDF 的練習(xí)。然而,知識管理的大多數(shù)有用之處在于操縱 RDF 語句的抽象模型,而不是個別序列化文件。RDF 模型是圖形結(jié)構(gòu),該結(jié)構(gòu)可以非常簡單也可以令人難以置信的復(fù)雜。(事實上,極端情況下,Semantic Web 的設(shè)想是要創(chuàng)建至少同當前 Web 一樣大的 RDF 模型。如果實現(xiàn)該模型的話,它可能是曾經(jīng)在使用中的最大的計算機數(shù)據(jù)結(jié)構(gòu)。)

迄今為止,問題跟蹤器的示例是由一組 XML 文件組成的,這些文件是 RDF 模型各部分的序列化。每一部分就象七巧板中的一塊,如果將它們組合到一塊兒,將表示問題跟蹤器應(yīng)用程序中所有數(shù)據(jù)的 RDF 模型。每一部分本身并不十分重要,因此下一步來討論如何創(chuàng)建一幅完整的“圖畫”,該“圖畫”才是知識管理的真正價值所在。

使用 XSLT 進行批量轉(zhuǎn)換

拼裝該“圖畫”的一種選擇是根本不處理七巧板塊,而是使用 XSLT 一勞永逸地生成該“圖畫”。可以編寫一個轉(zhuǎn)換,該轉(zhuǎn)換收集每個 XML 問題文檔,并運用前一篇文章中所描述的 RDF 轉(zhuǎn)換處理,然后將每次轉(zhuǎn)換結(jié)果累積到一個序列化 RDF 結(jié)果。要做到這一點,需要利用標準的 document() XSLT 函數(shù),該函數(shù)可以讀入任意的文檔,這些文檔是作為用于轉(zhuǎn)換的補充性 XML 源文檔。

document() 函數(shù)需要知道所要讀入文檔的準確名稱。XSLT 沒有(比如說)通過使用通配符來讀入多個文檔的標準機制。可以通過許多方法解決這一問題(包括借助于 XSLT 擴展,該擴展允許通過通配符或其它機制來批量裝入文檔)。然而,因為這不是本示例的中心問題,所以選擇創(chuàng)建帶有每個問題文檔清單的集中(hub) XSLT 文檔這項折中方案。清單 1 issue-hub.xml 用指定的兩個問題文檔(在前一篇專欄文章中介紹過)來演示集中文檔是什么樣子的。

清單 1:帶有每個應(yīng)用程序數(shù)據(jù)文檔的問題文檔清單的集中 XML 文檔。

issue1.xml

issue2.xml

一旦有了集中文檔,就可以將清單 2 metadata-batch.xslt 中的轉(zhuǎn)換應(yīng)用到作為源文檔的集中文檔中以從所有列出的問題中創(chuàng)建聚合 RDF。

清單 2 看起來可能非常熟悉;其中大多數(shù)同前一篇文章中的轉(zhuǎn)換相同。這是因為我很留意 XML 結(jié)構(gòu)的模塊化處理。根模板現(xiàn)在從集中文檔中查找每個 issue 元素(注意,這里使用空名稱空間)。然后它從每個元素內(nèi)容中指定的文件名裝入文檔。注意,這里使用 document(.)/* 而不僅僅是 document(.)。這種構(gòu)造防止處理器匹配問題文檔的根節(jié)點,這會結(jié)束調(diào)用打算用于集中文檔根節(jié)點的模板。那些正是本專欄文章的批量轉(zhuǎn)換中的唯一區(qū)別。

可以使用任何 XSLT 處理器來執(zhí)行該轉(zhuǎn)換。我使用 4XSLT 來執(zhí)行轉(zhuǎn)換,如下所示:

$ 4xslt -o issues.rdf issue-hub.xml metadata-batch.xslt

該轉(zhuǎn)換導(dǎo)致 issues.rdf 中的序列化 RDF,它包含來自 issue1.xml 和 issue2.xml 中的元數(shù)據(jù)。

使用 RDF 工具進行批量轉(zhuǎn)換

將多個 XML 文檔聚合到單個 RDF 模型中的另一種選擇是(如前一篇文章所述)分別構(gòu)建每個 RDF 文檔,然后使用 RDF 解析器將所有的文檔解析成單個抽象模型。例如,通過對從前面一篇專欄文章中的示例問題文件中生成的兩個 RDF 文件使用 4RDF,將得到清單 3。

清單 3:從 XML 文件中派生,并由 RDF 解析器(這里是 4RDF)分析的兩個 RDF 問題文件的批量轉(zhuǎn)換結(jié)果

$ 4rdf -d 1.rdf 2.rdf

The following is a list of resulting tuples, each in the form "subject,

predicate, object".

[

("http://meta.rdfinference.org/ril/issue-tracker/ril-20010502",

"http://xmlns.rdfinference.org/ril/issue-tracker#issue",

"#i2001030423"),

("#anonymous:e08-e06-30b-90d-a060005104", "id", "i2001030423"),

("#anonymous:e08-e06-30b-90d-a060005104",

"http://xmlns.rdfinference.org/ril/issue-tracker#author",

"http://users.rdfinference.org/ril/issue-tracker#uogbuji"),

("#anonymous:1040d07-20b-909-407-b0e0402205",

"http://xmlns.rdfinference.org/ril/issue-tracker#author", "Alexandre

Fayolle "),

("#anonymous:1040d07-20b-909-407-b0e0402205",

"http://xmlns.rdfinference.org/ril/issue-tracker#body", "The

abbreviation in listing 8 doesn't seem necessary to Nico Chauvat or

me."),

("#anonymous:e08-e06-30b-90d-a060005104",

"http://xmlns.rdfinference.org/ril/issue-tracker#comment",

"#anonymous:1040d07-20b-909-407-b0e0402205"),

("#anonymous:60e0b06-50a-80c-90c-50a0a08602",

"http://xmlns.rdfinference.org/ril/issue-tracker#author",

"http://users.rdfinference.org/ril/issue-tracker#uogbuji"),

("#anonymous:60e0b06-50a-80c-90c-50a0a08602",

"http://xmlns.rdfinference.org/ril/issue-tracker#assignment",

"http://users.rdfinference.org/ril/issue-tracker#uogbuji"),

("#anonymous:e08-e06-30b-90d-a060005104",

"http://xmlns.rdfinference.org/ril/issue-tracker#action",

"#anonymous:60e0b06-50a-80c-90c-50a0a08602"),

("http://meta.rdfinference.org/ril/issue-tracker/ril-20010502",

"http://xmlns.rdfinference.org/ril/issue-tracker#issue",

"#i2001042003"),

("#anonymous:2030002-506-10a-201-f090809c08", "id", "i2001042003"),

("#anonymous:2030002-506-10a-201-f090809c08",

"http://xmlns.rdfinference.org/ril/issue-tracker#author",

"http://users.rdfinference.org/ril/issue-tracker#nchauvat"),

("#anonymous:c000706-b0b-d02-d0a-e050c0460b",

"http://xmlns.rdfinference.org/ril/issue-tracker#author", "Alexandre

Fayolle "),

("#anonymous:c000706-b0b-d02-d0a-e050c0460b",

"http://xmlns.rdfinference.org/ril/issue-tracker#body", "I agree"),

("#anonymous:2030002-506-10a-201-f090809c08",

"http://xmlns.rdfinference.org/ril/issue-tracker#comment",

"#anonymous:c000706-b0b-d02-d0a-e050c0460b"),

("#anonymous:b0c0c00-800-2-c08-20a0d0f209",

"http://xmlns.rdfinference.org/ril/issue-tracker#author",

"http://users.rdfinference.org/ril/issue-tracker#uogbuji"),

("#anonymous:b0c0c00-800-2-c08-20a0d0f209",

"http://xmlns.rdfinference.org/ril/issue-tracker#assignment",

"http://users.rdfinference.org/ril/issue-tracker#uogbuji"),

("#anonymous:2030002-506-10a-201-f090809c08",

"http://xmlns.rdfinference.org/ril/issue-tracker#action",

"#anonymous:b0c0c00-800-2-c08-20a0d0f209"),

]

清單 3 中第一行里的 -d 選項告訴 $RDF 將 subject/predicate/object 三元組從抽象 RDF 模型轉(zhuǎn)儲到命令行,該命令行顯示清單 3 的剩余部分.

一旦有了問題跟蹤器的完整 RDF 模型,可能希望以一種更易于閱讀的格式而不是清單 3 中所顯示的那種格式來查看它。例如,如果以清單 3 中的聚合 RDF 文件為例,并使用 Dan Brickley 的 RDF 可視化工具(請參閱參考資料)來處理它。

可以立即辨別出某種模式,譬如用戶“uogbuji”的投稿和職責。當然,我必須承認 RDF 中隨同 URI 而來的冗長的標識符妨礙了這一清晰性。

跨系統(tǒng)查詢

擁有可用元數(shù)據(jù)的 RDF 模型的另外一個立桿見影的好處在于:它使許多系統(tǒng)級查詢(相對于編寫針對一組 XML 文檔的 XPath 查詢,或?qū)?shù)據(jù)集中到專用數(shù)據(jù)結(jié)構(gòu)以用于查詢)變得更簡單更一般。雖然,“XML 查詢語言”(XQuery)和 XML 資源庫供應(yīng)商提供的專用文檔收集查詢工具的出現(xiàn)也幫助解決了這一需求,但是現(xiàn)在可以使用 RDF,至少這種基本模型是標準化的。

遺憾的是,RDF 模型的查詢還不是標準化的,這是 RDF 社區(qū)需要填補的非常重要的漏洞。幸運的是,由于 RDF 模型的簡單性,所以非常容易通過基本模式匹配來構(gòu)建幾乎所有形式的查詢。這是 4RDF 中所使用的基本方法,其中,查詢就是就是查找語句三元組的過程,該三元組匹配給定的主語、謂語和賓語模式。作為示例,請看表 1 中剛創(chuàng)建的部分統(tǒng)一模型。

表 1 .來自問題跟蹤器數(shù)據(jù)的一些語句

主語: #anonymous:a0d010d-f0c-706-20e-80a0407606 謂語: http://xmlns.rdfinference.org/ril/issue-tracker#body 賓語: Organize a vote on this topic 主語: #anonymous:a0d010d-f0c-706-20e-80a0407606 謂語: http://xmlns.rdfinference.org/ril/issue-tracker#assign-to 賓語: http://users.rdfinference.org/ril/issue-tracker#uogbuji 主語: #anonymous:402000d-403-309-c01-9080a205 謂語: http://xmlns.rdfinference.org/ril/issue-tracker#body 賓語: Correct all to use the "0/1" form in the next draft. 主語: #anonymous:402000d-403-309-c01-9080a205 謂語: http://xmlns.rdfinference.org/ril/issue-tracker#assign-to 賓語: http://users.rdfinference.org/ril/issue-tracker#uogbuji

有了這些三元組,就會非常容易地明白別人是如何會簡單地詢問如下問題:“給用戶 uogbuji 分配的操作標識是什么?”以及“每個操作的主體是什么?”。將第一個問題轉(zhuǎn)換成查找匹配下列模式的三元組,這里的“*”是匹配任何值的通配符:

主語 謂語 賓語 * http://xmlns.rdfinference.org/ril/issue-tracker#assign-to http://users.rdfinference.org/ril/issue-tracker#uogbuji

對此的響應(yīng)之一是帶有主語“#anonymous:a0d010d-f0c-706-20e-80a0407606”(表示匹配的操作標識)的語句。注意,該標識是由 4RDF 為匿名資源(如果資源沒有標識,則由應(yīng)用程序顯式地分配一個)生成的特殊標識。構(gòu)成全球唯一標識符(UUID)的一個十六進制值緊跟在“anonymous”序列之后。有了這個標識,第二個示例問題相當于匹配下列模式,該模式返回帶有賓語“Organize a vote on this topic”的語句:

主語 謂語 賓語 #anonymous:a0d010d-f0c-706-20e-80a0407606 http://xmlns.rdfinference.org/ril/issue-tracker#body *

建立在這一簡單的想法上,幾乎任何形式的 RDF 查詢(甚至關(guān)系型(SQL)查詢和對象(OQL)查詢的等價查詢)都是可能的。

編碼 RDF 查詢
清單 4 中的 Python 程序 query1.py 通過模式匹配、讀入 issues.rdf 文件以及打印 uogbuji 的所有任務(wù)的主體,使用 4RDF 來運用這項查詢技術(shù)。(如果沒有使用 Python,當然可以使用其它 RDF 查詢工具,譬如 RDFDb、Jena 或列在參考資料中“Dave Beckett 的 RDF 資源指南”中的工具。)

清單 4:演示一個 RDF 模型簡單查詢的 Python 程序。

from Ft.Rdf import Util

#Returns an RDF model object, and the database instance it uses for

#persistence (in our case, it's just a memory data structure)

model, db = Util.DeserializeFromUri('issues.rdf')

db.begin()

USER_ID_BASE = 'http://users.rdfinference.org/ril/issue-tracker#'

IT_SCHEMA_BASE = 'http://xmlns.rdfinference.org/ril/issue-tracker#'

print 'Actions assigned to uogbuji:'

#None is used as the wild-card

matching_statements = model.complete(None,

IT_SCHEMA_BASE+'assign-to',

USER_ID_BASE+'uogbuji'

)

for statement in matching_statements:

id = statement.subject

matching_statements = model.complete(id,

IT_SCHEMA_BASE+'body',

None

)

body = matching_statements[0].object

print "*", body

db.commit()

在清單 4 中,首先從 issues.rdf 文件中讀?。ń獬蛄谢㏑DF;然后執(zhí)行查詢以查找表示指派給 uogbuji 哪些操作的語句。然后使用每個語句的主語(操作標識)來查詢每個操作的主體。如果安裝了 Python 和 4Suite,運行和下面相同的示例:

$ python query1.py

Actions assigned to uogbuji

* Organize a vote on this topic

* Correct all to use the "0/1" form in the next draft.

這是 RDF 模型查詢的最底級別,因此有一點麻煩。清單 5 中的 Python 程序 query2.py 通過直接查詢相關(guān)主語和賓語等而走了一些捷徑。其結(jié)果就是清單 4 中同一個功能的更簡單的版本。

清單 5:簡化查詢代碼

from Ft.Rdf import Util

#Returns an RDF model object, and the database instance it uses for

#persistence (in our case, it's just a memory data structure)

model, db = Util.DeserializeFromUri('issues.rdf')

db.begin()

USER_ID_BASE = 'http://users.rdfinference.org/ril/issue-tracker#'

IT_SCHEMA_BASE = 'http://xmlns.rdfinference.org/ril/issue-tracker#'

print 'Actions assigned to uogbuji:'

actions = Util.GetSubjects(model, IT_SCHEMA_BASE+'assign-to',

USER_ID_BASE+'uogbuji')

for action in actions:

body = Util.GetObject(model, action, IT_SCHEMA_BASE+'body')

print "*", body

db.commit()

清單 5 仍然包含兩種級別的查詢;使用結(jié)合多個查詢的單個請求將更方便和更有效。(通過使用“RDF 推論語言(RDF Inference Language (RIL))”,那也是可能的,“RDF 推論語言”將在本專欄的后續(xù)文章中討論。順便提一下,示例問題跟蹤器數(shù)據(jù)中參考了 RIL 開放規(guī)范草稿。)清單 6 演示了在使用或不使用 API 捷徑情況下,執(zhí)行基本查詢的結(jié)果。

清單 6:執(zhí)行同清單 5 相同任務(wù)的簡化的查詢會話

$ python query2.py

Actions assigned to uogbuji

* Organize a vote on this topic

* Correct all to use the "0/1" form in the next draft.

RDF 查詢不必涉及元數(shù)據(jù)語句組件的精確匹配。大多數(shù)的查詢語言提供大量的靈活性。作為一個示例,清單 7(query3.py)中的 Python 程序使用基于正則表達式的查詢來查找所有指派給 uogbuji 的操作(該操作的主體包含字符串“vote”)。

同樣,通過使用 RIL,清單 7 中的代碼將是一個簡單查詢而且更有效(將在下一篇專欄文章里講述)。清單 8 演示了查詢中正則表達式的使用。

清單 8:演示在查詢中使用正則表達式的會話

$ python query3.py

Actions assigned to uogbuji

* Organize a vote on this topic

下一次……

本專欄文章演示了如何從示例問題跟蹤器應(yīng)用程序?qū)⒏鞑糠纸M成完整的 RDF 模型,并且舉例說明了該模型的基本查詢。在下篇文章中將探討一種豐富特性,可以利用 RDF 的強大功能來低成本地利用該特性。

參考資料

通過單擊文章頂部或底部的討論來參與本文的討論論壇。

請下載作者上一篇專欄文章中樣本代碼(介紹了使用 XML 的 RDF 技術(shù))和本專欄中樣本代碼文件的壓縮文件,這些文件使得理解這些示例或修改它們以利于重用變得更加容易。

Uche Ogbuji 的 Introduction to RDF 提供了對 RDF 的基本介紹,并包含指向其它有用資源的鏈接。

Dave Beckett 的 RDF 資源指南 是一個指向與 RDF 相關(guān)文章、 工具、規(guī)范、討論和事件等等的綜合性的鏈接集。

Dan Brickley 的 RDF 可視化器(是基于 Web 的,并且可以應(yīng)用到任何平臺)象本專欄文章中的圖 1 一樣,以圖形形式表示 RDF 文件。

本文中提及過但沒有演示過的兩個 RDF 查詢工具是與 RDF 數(shù)據(jù)庫 RDFDb 相關(guān)聯(lián)的查詢語言(其提供了用 C 與 Perl 來訪問數(shù)據(jù)庫)和 Jena(用于操縱 RDF 模型的實驗性 Java API)。

使用 4Suite 的 XSLT 處理器測試了本文中的示例。

XML:the next big thing,是由 Tom Halfhill 所寫的學(xué)術(shù)性 IBM 研究論文,它討論了使用 RDF 增強下一代搜索引擎的可能性。

請參閱本專欄以前的專題,題為:

    • XML 和語義: 實際情況
    • XML 和語義: 該領(lǐng)域中的新生事物以及舊的鄰近范疇的另一事物
    • 踏著語義的節(jié)拍
    • 知識管理的基本 XML 和 RDF 技術(shù), 第一部分

正如 Scientific American article 中所描述的那樣,Semantic Web 正在逐漸成為人們所研究和感興趣的事物,并且現(xiàn)在是 W3C 官方活動


關(guān)于作者

Uche Ogbuji 是 Fourthought Inc. 的顧問兼合伙創(chuàng)始人,該公司是專為企業(yè)知識管理應(yīng)用提供 XML 解決方案的供應(yīng)商和咨詢公司。Fourthought 開發(fā)了 4Suite、4Suite 服務(wù)器,它們是 XML 中間件的開放源碼平臺。Ogbuji 先生是一名出生于尼日利亞的計算機工程師兼作家,他生活和工作在美國科羅拉多州的博耳德??梢酝ㄟ^ uche.ogbuji@fourthought.com 與 Ogbuji 先生聯(lián)系。

瀏覽:知識管理的基本XML和RDF技術(shù)(一)

知識管理的基本XML和RDF技術(shù)(三)

知識管理的基本XML和RDF技術(shù)(四)

知識管理的基本XML和RDF 技術(shù)(五)

知識管理的基本XML和RDF技術(shù)(六)

發(fā)布:2007-03-25 14:07    編輯:泛普軟件 · xiaona    [打印此頁]    [關(guān)閉]
相關(guān)文章:
武漢OA系統(tǒng)
聯(lián)系方式

成都公司:成都市成華區(qū)建設(shè)南路160號1層9號

重慶公司:重慶市江北區(qū)紅旗河溝華創(chuàng)商務(wù)大廈18樓

咨詢:400-8352-114

加微信,免費獲取試用系統(tǒng)

QQ在線咨詢