XML 觀察: 追溯 RDF 數據的源頭::RDF 工具正逐漸成熟起來
級別: 中級
Edd Dumbill, 編輯兼發(fā)行人, xmlhack.com
2003 年 3 月 01 日
當 您開始聚集來自 Web 的數據時,了解其來源是至關重要的。本文中,Edd Dumbill 研究了 Redland 資源描述格式(Resource Description Format,RDF)應用程序框架的上下文特性并創(chuàng)建了作為演示的一個 RDF Site Summary(RSS)1.0 聚集器。
一年前,我為 developerWorks寫了兩篇有關 朋友的朋友(Friend-of-a-Friend,FOAF)項目的文章。FOAF 是一種 XML/RDF 詞匯表,用于以計算機可讀的形式描述您通常可以放在主 Web 頁上的某種個人信息,如您的姓名、即時信使昵稱和工作地點等。
在我有關 FOAF 的第二篇文章(請參閱 參考資料)的清單 6 中,我演示了 FOAFbot,一個我編寫的聚集人們的 FOAF 文件并回答相關問題的社區(qū)支持代理。FOAFbot 能夠記錄誰說了關于誰的什么事情。當問及我叫什么名字時,FOAFbot 答道:
|
FOAFbot 背后的思想是,如果您能夠驗證不同的幾個人(您所信任的人)都記錄了一個事實,那么您很可能相信這是真實的。
以 下是追溯這樣的元數據源頭的另一個運用。搜索引擎在其早期歷史中被濫用的一個主要表現是惡意元標記(meta tag spamming)。網站會把錯誤的元數據放到它們的頁面中以提高它們的搜索引擎排名。由此,搜索引擎不再關注元標記,因為它們極有可能提供虛假信息。事 實上,象 Google 這樣的搜索引擎找到了其它更高級的度量來評定頁面關聯性。
展望 Web 的未來,避免諸如惡意元標記這樣的濫用將變得至關重要。Tim Berners-Lee 對 Semantic Web 的展望(請參閱 參考資料)是希望出現這樣一個 Web:其上大多數的數據都是機器可讀的,從而使得目前由人類完成的大多數信息處理自動進行。
元數據濫用在 Semantic Web 上可能造成的麻煩甚至更大:網站不再限于僅僅造自己站點的假。它還可以造其它站點的假。例如,一家書店對競爭者的報價作假,這是有可能的。
我不會探究各種安全性和可信機制(這些機制將防止這種語義的破壞行為)的細節(jié),而是將重點討論這樣的機制之所以成為可能的基礎: 追溯源頭。
處理 RDF 然后存儲它的應用程序使用
三元組存儲(triple store)來做到這一點。RDF/XML 輸入文檔被分解成一列包含
主語、謂語和賓語
的三元組。然后后續(xù)處理就是操作和查詢存儲中的三元組。只有在涉及到交換時,才會用 RDF 的 XML 語法。由于將數據直接分解成三元組,所以
XML 工具(象 XPath 或 XQuery)就沒有多少用處了。已經有人編寫了直接使用 XQuery 操作 XML 語法的 RDF
處理工具,但我認為對于通用的 RDF 處理,這多少有點多此一舉。
為了進行演示,我將向您展示如何將簡單的 RSS 1.0 文檔用作測試數據。最近我建立了一個 weblog 站點,其中,我對不知情的公眾強加了我的觀點。為了將我涂鴉式的元數據放在一起,我生成了一個 RSS 1.0 文件(請參閱 參考資料獲取鏈接)。該文件的開始部分類似于清單 1,曾接觸過 RSS 的任何人應該對它非常熟悉。
清單 1. 摘自 RSS 1.0 文件的開始部分
|
在 RDF 處理器將這一部分解析成三元組時,我獲得了清單 2 中顯示的數據。
清單 2. 與清單 1 的開始部分對應的 RDF 三元組
|
隨后 RDF 應用程序所要操作的就是 清單 2中顯示的這列三元組了。至此,一切都很順利。但在存儲這個數據時,您會丟失一些重要信息的線索,即數據的出處和其它相關數據,如我是何時對數據拍了快照。要記錄這個信息,我需要通過一些方式使該信息與我所找到的 RDF 語句相關聯。
首先,對于 清單 2中的數據,我需要模擬出一個描述,記錄下對于這些數據我可能要說的內容。清單 3 就包含了這樣一個示例描述,它使用了專為這一目的而虛構出的一個示例名稱空間。
清單 3. 檢索清單 1 和清單 2 中數據的示例描述
|
您可以從 清單 3中看出:我已經(任意)虛構了一個 URI 來表示對一個文件進行的第 52365 次檢索。這似乎是一個合理的方法,如同任何對遠程資源的每次輪詢所命名的那樣。這個資源的出處是這個 RSS 1.0 文件的 URI,而時間戳記表明何時找到它的。
現在,剩下的就是存儲四元組,而不是存儲三元組。清單 4 展示了我如何修改 清單 2以顯示我現在添加到存儲中的所有數據。
清單 4. 增加了上下文 URI 和上下文元數據的三元組
|
清單 4中演示的思想是每個 RDF 語句都增加了一個 URI,它將該 RDF 語句鏈接到我想要存儲的有關該 RDF 語句的元數據上。這個簡單機制給我?guī)砹藷o窮的力量。除了使我能夠檢索有關該 RSS 文件的元數據以外,它還提供了從存儲中除去該信息的便利方法。
![]() ![]() |
![]()
|
在運用這個思想時,我已將上面四元組的第四個元素稱為 上下文。這個術語并不規(guī)范,但它對我而言非常有效。而且,Redland RDF 應用程序框架中也使用了這個術語,我將使用該框架來演示這個追溯源頭的應用程序。
(順 便提一下,我要對 Dave Beckett(Redland 的創(chuàng)建者)表示感謝。在我去年編寫 FOAFbot 時,Redland 不支持上下文,所以我最終只能以一種非常繁冗的格式來實現上下文。Dave 回應了我的請求,他將上下文的支持添加到了他的工具箱中。)
Redland 是一個基于 C 的工具箱,帶有許多語言綁定,包括 Python、Perl 和 Java。它由一個 RDF 解析器、raptor 和一個數據存儲組成。該存儲目前使用 Berkeley DB 文件,不過還在開發(fā)對底層 SQL 存儲的支持。對于我的示例而言,我將使用到 Redland 的 Python 綁定。
這里的目標是要創(chuàng)建一個簡單的 RSS 1.0 聚集器。使用聚集器的目的是對多個 RSS 饋送進行重復拍快照,并允許您以有趣的方式組合它們。隨著新內容項的加入,RSS 文件會隨著時間的變化而發(fā)生更改 - 我想避免多個冗余項,而仍能保留歷史項。在本文后面,我將開發(fā)所需的一些功能。
您將在 參考資料中找到一個到這個項目的 Python 代碼(fraggle.tar.gz)的鏈接。還有一個到 Redland 工具箱的鏈接,您也需要安裝這個工具箱。
Aggregator
類會處理訪存和存儲 RDF 數據這個有趣的工作。清單 5 摘自這個類的
load_uri
方法,它從
aggregate.py
的第 189 行開始。
清單 5. 追溯檢索到的 RDF 的上下文
|
該清單中用粗體顯示的幾行與追溯上下文有關。首先,使用
context_uri_node()
生成上下文的 URI。這返回形式為
http://usefulinc.com/fraggie/global/1
的 URI 結果。這個上下文然后被追加到在檢索到的 RSS 中找到的每個語句中。一旦存儲了 RSS 數據,我隨后就將有關上下文 URI 的數據添加到存儲中。在本例中,我存儲了作為 RSS 文件來源的 URI、RSS 通道本身的 URI(
rss:channel
元素中的
rdf:about
值)、訪存文件的時間以及文件的 MD5 校驗和(以便以后確定 RSS 文件是否隨時間變化而發(fā)生了更改)。
如果您下載了源代碼,那么正如您將看到的,
Aggregator
類的其余部分實現了兩個功能:第一個是 RSS 搜索所需的內務處理方法;第二個向聚集器的詢問者提供了查詢方法。請注意,所有的內務處理變量(如
fetch
計數)都是用 RDF 表示的,并且保存在 RDF 存儲中。清單 6 展示了將計數變量表示為 RDF/XML 語句。
清單 6. 用 RDF 表示的內部計數器
|
我發(fā)現在 RDF 存儲中持久地保存任何擁有全局作用域的變量是很有意義的。這種方法的一個直接優(yōu)點是它在多次調用后仍能保持狀態(tài)。
該演示歸檔文件包括兩個您可以運行的示例 RSS 文件。使用
python fraggle.py
可以調用該演示。該演示首先使聚集器裝入這兩個示例 RSS 文件,它們都引用了 Mark Pilgrim 最近在 XML.com
上發(fā)表的一篇文章。這個練習的目的是找到誰對這篇文章作了什么評價。運行該演示產生的輸出如清單 7
所示(為可讀性起見,已對一些輸出行重新進行了格式處理)。
清單 7. fraggle.py 的輸出
|
摘自 XML.com 的第一部分展示了對這篇文章的正式描述。第二部分摘錄展示了由 paranoidfish.org 網站所有者提供的摘要。
如果您研究過
fraggle.py
的源代碼,那么將明白所有查詢都圍繞上下文進行。首先,會詢問聚集器哪些上下文提到了這篇文章的
URI。然后根據上下文請求文章元數據并建立索引。請注意,上下文在時間上對應于一個饋送的快照。如果我的示例隨時間變化要獲得更多 RSS
文件的快照,那么您可能會看到有幾項都是來自同一來源的 - 可能在描述上稍作了更改(人們常常會隨時修正拼寫錯誤)。對 fraggle.py
中查詢的一個明顯改進是根據源進行分組,而不是單單根據時間順序進行顯示。
盡 管從瀏覽、自我沖浪(ego-surfing)的角度而言,weblog 和其它因特網站點的 RSS 饋送很有趣,但我認為象這樣一個項目的真正價值很有可能體現在企業(yè)中。許多組織常常會生成大量以時間為序的數據流。舉一個簡單的示例,URI 分配給了客戶或項目,然后就可以生成并聚集活動的 RSS 流。
然后可以很輕松的為那些對這樣的聚集數據感興趣 的任何人劃分和切割這些數據。例如,管理者可能希望知道每個工人在做什么,項目經理可能希望獲得最近的三個狀態(tài)更新,更高級的管理層可能希望獲得整個部門 的快照視圖,等等。不難想象,這種工具很可能會在客戶關系管理(CRM)這一領域中產生最佳收益。
![]() ![]() |
![]()
|
本文中演示的簡單示例只觸及了追溯 RDF 源頭的皮毛。在 Web 上,信息來自哪里與信息本身同樣重要。源頭追溯的 RDF 工具剛開始興起,當它們的使用變得更廣泛時,它們的能力無疑會更加完善。
毫無疑問,Redland RDF 應用程序框架是一個值得進一步研究的工具箱。它具有到您最喜愛的腳本編制語言的接口;它運行在 UNIX、Windows 和 Mac OS X 上;而且它是一個開放源碼項目,所以您所做的任何改進會使整個社區(qū)受益。
![]() ![]() |
![]()
|
- 您可以參閱本文在 developerWorks 全球站點上的
英文原文.
- 請參加有關本文的
論壇。(您也可以單擊本文頂部或底部的
討論訪問該論壇。)
- 查閱
RDFWeb 站點,它是 FOAF 項目的“老家”。
- 請閱讀“
Finding friends with XML and RDF”,這是作者描述“朋友的朋友”項目的第一篇文章(
developerWorks,2002 年 6 月)。
- 請閱讀“
Support online communities with FOAF”,其中包含了上面提到的清單 6(
developerWorks,2002 年 8 月)。
- 探究
W3C 的 Semantic Web 主頁,其中說明了 Semantic Web 遠景和 W3C 正在對此進行的開發(fā)工作。
- 瀏覽
RSS 1.0 規(guī)范,其中描述了 RSS 核心詞匯表和擴展機制。
- 鏈接到作者自己的
RSS 文件,其中含有他的 weblog 中最新項的元數據。
- 請閱讀 Dave Beckett 編寫的開放源碼“
Redland RDF Application Framework”,以獲得本文示例中所用的框架。
- 查閱
Redland 的 Python 綁定,它們使得在 Python 腳本編制語言中能夠輕松建立基于 RDF 的應用程序的原型。
- 下載
fraggle 的源代碼和示例項目:fraggle.tar.gz。您還可以在
fraggle 的子版本(subversion)資源庫上跟蹤作者對這個代碼的持續(xù)開發(fā)。
- 在
developerWorksXML 專區(qū)上查找更多的 XML 參考資料。閱讀
XML 觀察專欄系列以前的專欄文章。
- 獲取
IBM WebSphere Studio,它是一套 XML 開發(fā)自動化的工具,可以使用 Java 和其它語言進行開發(fā)。它與
WebSphere Application Server緊密地集成在一起,而且還可以和其它 J2EE 服務器一起使用。
- 查找如何成為
IBM 認證的 XML 和相關技術的開發(fā)人員。
![]() ![]() |
![]()
|
![]() |
||
|
![]() |
Edd Dumbill 是 XML.com的執(zhí)行編輯以及 XML 開發(fā)人員新聞站點 XMLhack的編輯和發(fā)行人。他是 Programming Web Services with XML-RPC一書的合著者,以及 Pharmalicensing生命科學知識產權交易事務所的共同創(chuàng)始人和顧問。Edd 還是 每年一度的 XML 歐洲大會的議程主席。您可以通過 edd@xml.com與 Edd 聯系。 |
posted on 2006-03-18 21:26 Vincent.Chen 閱讀(507) 評論(0) 編輯 收藏 所屬分類: AJAX