精彩的人生

          好好工作,好好生活

          BlogJava 首頁 新隨筆 聯系 聚合 管理
            147 Posts :: 0 Stories :: 250 Comments :: 0 Trackbacks
          譯者:gracepig

          E-mail & MSN : zhangchi_nwpu@hotmail.com


          版權聲明:可以任意轉載,轉載時請務必以超鏈接形式標明文章原始出處和作者信息及本聲明
          英文原文地址:
          http://www.javaworld.com/javaworld/jw-07-2005/jw-0704-jena.html

          中文地址
          http://www.matrix.org.cn/resource/article/43/43598_RDF_JAVA.html

          關鍵詞:Resource Description Framework models RDF XML Jena Protégé

          摘要
          資源描述框架(Resource Description Framework RDF)是一種以XML格式描述元數據的標準格式。Jena是一種用于將關系數據庫或是文本文件中所表示的數據建立為元數據模型的框架方法。Protégé 用用來創建RDF元數據文檔的編輯工具。 建立這種數據庫和文件的元數據模型需要由用戶自己定義腳本。本文介紹介紹了SemantiRDFUtils這種腳本,它擁有多個功能塊可以用于維護Jena RDF 元數據模型.(2200詞,2005-7-4) By Venkata N.VAsam

          與XML成為不同軟件廠商之間數據交互的標準過程相似,資源描述框架(RDF)也沿著這條道路前進,希望能夠成為描述與交互元數據的標準。XML 使用文件類型定義(DTD)和XML格式定義(XSD)來描述數據。RDF使用XML語法和RDF Schema(RFDS)來將元數據描述成為數據模型。

          本文介紹了一種使用Jena RDF API 編寫的用戶自定義工具,使用這種工具來管理存儲在關系數據庫或是文本文件的數據模型。這種工具是由HP實驗室開發的,Jena框架是一個RDF,RDFS以及OWL(Web Ontology Language)的開源實現, 它包含著一個基于規則的推論引擎。它提供了建立和操縱RDF模型的Java API。本文介紹的SemanticRDFUtils.bat是一種使用Jena開發的腳本。使用這種腳本,我們可以維護存儲在關系數據庫和文本文件中的元數據模型。本文還介紹了怎樣使用Protégé來將建RDF的語意描述文件(.rdfs)和數據文件(.rdf)。

          軟件安裝
          在使用SemanticRDFUtils.bat之前必須先安裝以下的軟件。關于以下工具的鏈接請參看文中所附的資源。
          ????????J2SE 1.3 或更高的版本
          ????????Jena 2.0
          ????????Oracle 9.2.0.1.0
          ????????Apache Ant 1.5.4 或更新的版本
          ????????Protégé 2.1


          RDF和RDFS 文件簡要介紹
          下面的XML格式的RDF和RDFS文件用于顯示一個字母順序的交叉引用模型。它們是使用Protégé 2.1 的圖形界面工具創建的。當執行腳本和RDF查詢工具的時候我們可以動態的引入RDF文件。RDFS文件則在我們使用Protégé 給RDF文件中加入更多數據時使用。


          列表1. RDFTest1.rdf

          <?xml version='1.0' encoding='UTF-8'?>
          <!DOCTYPE rdf:RDF [
          ?? <!ENTITY rdf 'http://www.w3.org/1999/02/22-rdf-syntax-ns#'>
          ?? <!ENTITY rdfs 'http://www.w3.org/TR/1999/PR-rdf-schema-19990303#'>
          ?? <!ENTITY Maana 'http://www.vvasam.com/Maana#'>
          ]>
          <rdf:RDF xmlns:rdf="&rdf;"
          ?? xmlns:Maana="&Maana;"
          ?? xmlns:rdfs="&rdfs;">
          <Maana:ASCII rdf:about="&Maana;RDFTest_Instance_0"
          ?? Maana:Name="A"
          ?? Maana:value="65"
          ?? rdfs:label="A:65">
          ?? <Maana:system rdf:resource="&Maana;RDFTest_Instance_2"/>
          </Maana:ASCII>
          <Maana:System rdf:about="&Maana;RDFTest_Instance_1"
          ?? Maana:Name="lowercase"
          ?? rdfs:label="lowercase"/>
          <Maana:ASCII rdf:about="&Maana;RDFTest_Instance_10000"
          ?? Maana:Name="b"
          ?? Maana:value="98"
          ?? rdfs:label="b:98">
          ?? <Maana:system rdf:resource="&Maana;RDFTest_Instance_1"/>
          </Maana:ASCII>
          <Maana:ASCII rdf:about="&Maana;RDFTest_Instance_10001"
          ?? Maana:Name="B"
          ?? Maana:value="66"
          ?? rdfs:label="B:66">
          ?? <Maana:system rdf:resource="&Maana;RDFTest_Instance_2"/>
          </Maana:ASCII>
          <Maana:AscXRef rdf:about="&Maana;RDFTest_Instance_10002"
          ?? rdfs:label="b:98:B:66">
          ?? <Maana:keyName rdf:resource="&Maana;RDFTest_Instance_10000"/>
          ?? <Maana:keyValue rdf:resource="&Maana;RDFTest_Instance_10001"/>
          </Maana:AscXRef>
          <Maana:AscXRef rdf:about="&Maana;RDFTest_Instance_10005"
          ?? rdfs:label="a:97:A:65">
          ?? <Maana:keyValue rdf:resource="&Maana;RDFTest_Instance_0"/>
          ?? <Maana:keyName rdf:resource="&Maana;RDFTest_Instance_8"/>
          </Maana:AscXRef>
          <Maana:System rdf:about="&Maana;RDFTest_Instance_2"
          ?? Maana:Name="uppercase"
          ?? rdfs:label="uppercase"/>
          <Maana:ASCII rdf:about="&Maana;RDFTest_Instance_8"
          ?? Maana:Name="a"
          ?? Maana:value="97"
          ?? rdfs:label="a:97">
          ?? <Maana:system rdf:resource="&Maana;RDFTest_Instance_1"/>
          </Maana:ASCII>
          </rdf:RDF>


          列表 2. RDFTest1.rdfs

          <?xml version='1.0' encoding='UTF-8'?>
          <!DOCTYPE rdf:RDF [
          ?? <!ENTITY rdf 'http://www.w3.org/1999/02/22-rdf-syntax-ns#'>
          ?? <!ENTITY system 'http://protege.stanford.edu/system#'>
          ?? <!ENTITY Maana 'http://www.vvasam.com/Maana#'>
          ?? <!ENTITY rdfs 'http://www.w3.org/TR/1999/PR-rdf-schema-19990303#'>
          ]>
          <rdf:RDF xmlns:rdf="&rdf;"
          ?? xmlns:system="&system;"
          ?? xmlns:rdfs="&rdfs;"
          ?? xmlns:Maana="&Maana;">
          <rdf:Property rdf:about="&system;maxCardinality"
          ?? rdfs:label="system:maxCardinality"/>
          <rdf:Property rdf:about="&system;minCardinality"
          ?? rdfs:label="system:minCardinality"/>
          <rdf:Property rdf:about="&system;range"
          ?? rdfs:label="system:range"/>
          <rdfs:Class rdf:about="&Maana;ASCII"
          ?? rdfs:label="ASCII">
          ?? <rdfs:subClassOf rdf:resource="&rdfs;Resource"/>
          </rdfs:Class>
          <rdfs:Class rdf:about="&Maana;AscXRef"
          ?? rdfs:label="AscXRef">
          ?? <rdfs:subClassOf rdf:resource="&rdfs;Resource"/>
          </rdfs:Class>
          <rdf:Property rdf:about="&Maana;Name"
          ?? rdfs:label="Name">
          ?? <rdfs:domain rdf:resource="&Maana;ASCII"/>
          ?? <rdfs:domain rdf:resource="&Maana;System"/>
          ?? <rdfs:range rdf:resource="&rdfs;Literal"/>
          </rdf:Property>
          <rdf:Property rdf:about="&Maana;RDFTest_Slot_10003"
          ?? rdfs:label="RDFTest_Slot_10003">
          ?? <rdfs:range rdf:resource="&rdfs;Literal"/>
          </rdf:Property>
          <rdfs:Class rdf:about="&Maana;System"
          ?? rdfs:label="System">
          ?? <rdfs:subClassOf rdf:resource="&rdfs;Resource"/>
          </rdfs:Class>
          <rdf:Property rdf:about="&Maana;keyName"
          ?? rdfs:label="keyName">
          ?? <rdfs:range rdf:resource="&Maana;ASCII"/>
          ?? <rdfs:domain rdf:resource="&Maana;AscXRef"/>
          </rdf:Property>
          <rdf:Property rdf:about="&Maana;keyValue"
          ?? rdfs:label="keyValue">
          ?? <rdfs:range rdf:resource="&Maana;ASCII"/>
          ?? <rdfs:domain rdf:resource="&Maana;AscXRef"/>
          </rdf:Property>
          <rdf:Property rdf:about="&Maana;system"
          ?? rdfs:label="system">
          ?? <rdfs:domain rdf:resource="&Maana;ASCII"/>
          ?? <rdfs:range rdf:resource="&Maana;System"/>

          </rdf:Property>
          <rdf:Property rdf:about="&Maana;value"
          ?? rdfs:label="value">
          ?? <rdfs:domain rdf:resource="&Maana;ASCII"/>
          ?? <rdfs:range rdf:resource="&rdfs;Literal"/>
          </rdf:Property>
          </rdf:RDF>


          Jena和Protégé概述
          本節在宏觀層面上介紹Jena和Protégé。用戶可以在附加資源中得到關于這兩個產品更多的信息。本文的目的是使您對Jena和Protégé有一個比較清晰的理解。

          Jena RDF 和RDQL

          RDF數據模型是一個聲明(statement)的集合,每一個聲明都包括三個部分:資源,屬性和值。 資源(resource)可以是任何使用URI標示的內容,它可以包含其它屬性。每一個屬性有一個值。
          Jena可以將RDF模型保存在關系數據庫或是文件當中。RDQL是用來查詢RDF模型的語言。RDF提供一種節點可以為資源或是文本的有向圖(有向圖的概念請參看《離散數學》)。RDQL則提供一種方式,由用戶定義一種圖模式,使用這種模式對目標圖集合進行匹配,獲得所有符合定義模式的結果。圖1 使用RDF圖來表示列表1和列表2中文件

          resized image

          圖1:范例RDF文件的RDF 圖表示


          上圖中,橢圓代表資源,長方形代表描述。資源通過箭頭連接到其它的資源或是描述值(一個對象或是一個值)上,這樣一組關系形成一個三元組,成為一個聲明(statement)。
          下面給我一個RDQL查詢的例子。三元組(?x <http://www.vvasam.com/Maana#value> "97")是一個聲明。X是一個綁定的變量用來代表一個資源;http://www.vvasam.com/Maana#value是一個叫做“value”的屬性;97是這個屬性的值。

          SELECT ?x WHERE (?x <http://www.vvasam.com/Maana#value> "97")

          Jena的toolkit提供了一個在命令行方式執行的Java類(jjena.rdfquery)來進行RDQL查詢。下面的例子演示了如果使用這個命令進行查詢并將查詢結果存入test1.rdql當中。
          java jena.rdfquery --data RDFTest1.rdf --query test1.rdql
          x
          ================================================
          http://www.vvasam.com/Maana#RDFTest_Instance_8

          注意:通過文后的資源鏈接來獲得關于RDF和RDQL更多的信息。


          RDF 中使用Protégé

          Protégé 是一個用來建立和編輯ontologies和知識庫的GUI工具。Protégé可以在RDF格式下創建和保存數據。在使用Protégé建立RDF模型時,需要在新建一個工程的時候選取RDF Schema,如圖2所示。


          圖2. RDF Schema工程


          在Protégé's工程菜單選擇新建工程時,選擇格式(Select Format)對話框會彈出。點擊OK按鈕,圖3的窗口會出現。


          圖3. 缺省Protégé工程視圖


          正如您在圖3中所看到的那樣,Protégé有一些標簽。本文主要介紹其中的Classes,Instances和Algernon標簽。
          圖4顯示了Protégé的保存對話框。在其中用戶可以填入工程,類文件,實例文件,和命名空間的名字。如圖4所示,類文件名中包括RDF Schema的信息,實例文件名中包括RDF的數據。命名空間中以唯一URI的方式標示出RDF模型。


          圖4: Protégé's保存對話框


          圖5和圖6顯示的是Protégé's類標簽和實例標簽,分別表示了列表1和列表2中的.rdf和.rdfs文件。這些文件使用Protégé's schema 格式創建。


          圖5: Protégé的類標簽



          圖6: Protégé的實例標簽


          Protégé中的Algeronon 查詢
          Protégé's的Algernon query標簽為進行Algernon查訊提供了一個圖形界面,用戶可以在這個UI當中進行查詢,并查看結果。Algernon是一種基于三元組的查詢語言,如圖7所示Algernon將資源以遍歷(traversal)路徑的方式返回給用戶。缺省的Algernon并不會如下圖那樣顯示。要看到這個標簽,用戶必須從工程菜單的設置子菜單中選擇。



          圖7. Algernon 標簽


          Jena和Protégé之間的命名(terminology)映射
          由于Jena和Protégé是兩個不同的開源技術,所以他們的RDF 命名(terminology)存在差別。下表中列出了這些命名規則,用戶可以更具這些命名規則來創建和處理RDF文件。


          表1. Jena 和 Protégé 命名比較



          Jena 的語義RDF工具

          一節講解了一些用于維護Jena數據庫和文件模型的有用的工具/腳本。這些腳本文件包含在SemanticRDFUtils-scripts-files.zip文件當中,您可以在資源當中找到。下面的列表中描述了這些腳本文件可以執行的任務。當用戶以沒有任務ID號作為參數的命令行方式執行SemanticRDFUtils批處理文件時,下面的內容將會出現在你的控制臺當中

          C:\RDF\SemanticRDFUtils
          Usage: SemanticRDFUtils taskid
          ?? Where taskid should be any one of the following:
          ????1 --> To create and initialize the Jena system tables with a system model name as JenaRDFSystem
          ????2 --> To create a database model
          ????3 --> To remove a database model.
          ????4 --> To list the contents of a given model.
          ????5 --> To import RDF/XML file to a database.
          ????6 --> To list existing database model names
          ????7 --> To export a database model to a RDF/XML file
          ????8 --> To delete all the contents of a database model
          ????9 --> To create a union(RDF/XML file) of RDF/XML file models
          ????10 --> To create an intersection(RDF/XML file) of RDF/XML file models
          ????11 --> To create a difference(RDF/XML file) of RDF/XML file models
          ????12 --> To get the size of the given model
          ????13 --> Export the RDF query results as RDF/XML file.
          ????14 --> Delete the resource(s) from a model based on RDF query



          以上各任務ID的意思分別為:
          1:建立并初始化一個Jena系統表,系統模型名為JenaRDFSystem
          2:建立數據庫模型
          3:刪除一個數據庫模型
          4:列出所給出模型當中的內容
          5:將RDF/XML文件導入數據庫
          6:列出存在數據庫模型的名字
          7:將數據庫模型導出到RDF/XML文件中
          8:刪除一個數據庫模型當中的所有內容
          9: 為不同RDF/XML文件模型建立一個合并的RDF/XML文件
          10:建立不同RDF/XML文件直接的交集文件。
          11: 建立不同RDF/XML文件直接的差集文件。
          12:得到給定模型的大小
          13:將RDF查詢結果保存在RDF/XML文件當中
          14:從RDF查詢結果模型當中刪除資源

          SemanticRDFUtils腳本使用SemanticRDFUtils.properties文件儲存配置信息。下表給出了配置信息中的所有屬性:

          表 2. 屬性設置


          resized image


          任務
          第一個任務是在數據庫中建立一個Jena 系統表并要求下列屬性的正確值:
          ????????rdf_sytem_model_name
          ????????db_user
          ????????db_password
          ????????isRDFInDB
          ????????url

          第二個任務是在數據庫建立一個新的RDF模型并要求下列屬性的正確值:
          ????????rdf_sytem_model_name
          ????????db_user
          ????????db_password
          ????????isRDFInDB
          ????????url
          ????????modelName (如果這個屬性為空,那么腳本會提示用戶從鍵盤輸入值)

          第三個任務是從數據庫中刪除RDF模型并要求以下屬性的正確值:
          ????????rdf_sytem_model_name
          ????????db_user
          ????????db_password
          ????????isRDFInDB
          ????????url
          ????????modelName (如果這個屬性為空,那么腳本會提示用戶從鍵盤輸入值)

          第四個任務是列出RDF數據庫中的內容并要求以下屬性的正確值:
          ????????rdf_sytem_model_name
          ????????db_user
          ????????db_password
          ????????isRDFInDB
          ????????url
          ????????modelName (如果這個屬性為空,那么腳本會提示用戶從鍵盤輸入值)

          第五個任務是將RDF導入到數據庫模型當中,并要求以下屬性的正確值:
          ????????rdf_sytem_model_name
          ????????db_user
          ????????db_password
          ????????isRDFInDB
          ????????url
          ????????modelName (如果這個屬性為空,那么腳本會提示用戶從鍵盤輸入值)
          ????????import_rdffile_abs_name
          屬性import_rdffile_abs_name值將被置為.rdf文件的絕對路徑(如下的例子所示)。如果這個值為空那么腳本會提示用戶從鍵盤輸入值。
          import_rdffile_abs_name=C:\temp\RDFTest1.rdf

          第六個任務是列出一個數據庫模型中所有的模型,需要以下的屬性的正確值:
          ????????rdf_sytem_model_name
          ????????db_user
          ????????db_password
          ????????isRDFInDB
          ????????url

          第七個任務是將指定數據庫模型的內容導出到一個RDF文件當中,需要以下的屬性的正確值:
          ????????rdf_sytem_model_name
          ????????db_user
          ????????db_password
          ????????isRDFInDB
          ????????url
          ????????modelName (如果這個屬性值為空,腳本將提示用戶從鍵盤輸入)
          ????????import_rdffile_abs_name
          屬性export_rdffile_abs_name值將被置為.rdf文件的絕對路徑(如下的例子所示)。如果這個值為空那么腳本會提示用戶從鍵盤輸入值。
          export_rdffile_abs_name=C:/temp/export.rdf

          第八個任務是從數據模型中刪除內容,需要以下正確的屬性值:
          ????????rdf_sytem_model_name
          ????????db_user
          ????????db_password
          ????????isRDFInDB
          ????????url
          The ninth task performs a union operation on two file models and requires appropriate values for the following properties:

          第九個任務是對兩個文檔模型進行并集操作,需要以下正確的屬性值:
          ????????isRDFInDB
          ????????url
          ?????????????? file_rdfmodel1_abs_name
          ????????file_rdfmodel2_abs_name
          ????????result_rdfmodel_abs_name
          下面是一個范例的屬性值:
          file_rdfmodel1_abs_name=C:/temp/RDFTest1.rdf

          file_rdfmodel2_abs_name=C:/temp/RDFTest2.rdf

          result_rdfmodel_abs_name=C:/temp/RDFTestUnion.rdf

          當使用SemanticRDFUtils執行任務9的時候,兩個.rdf文件會被合并。如果要在一個合并的.rdf文件上建立一個Protégé工程,.rdfs文件必須被手工生成。

          第10個任務是執行兩個文件模型的交集操作,需要以下屬性的正確值:
          ????????isRDFInDB
          ????????url
          ????????file_rdfmodel1_abs_name
          ????????file_rdfmodel2_abs_name
          ????????result_rdfmodel_abs_name
          下面是一個范例的屬性值:
          file_rdfmodel1_abs_name=C:/temp/RDFTest1.rdf
          file_rdfmodel2_abs_name=C:/temp/RDFTest2.rdf
          result_rdfmodel_abs_name=C:/temp/RDFTestInterSection.rdf


          第11個任務是執行兩個文件模型的差集操作,需要以下屬性的正確值:
          ????????isRDFInDB
          ????????url
          ????????file_rdfmodel1_abs_name
          ????????file_rdfmodel2_abs_name
          ????????result_rdfmodel_abs_name
          下面是一個范例的屬性值:
          file_rdfmodel1_abs_name=C:/temp/RDFTest1.rdf
          file_rdfmodel2_abs_name=C:/temp/RDFTest2.rdf
          result_rdfmodel_abs_name=C:/temp/ RDFTestDifference.rdf


          第12個任務是列出指定數據庫模型的大小,需要以下屬性的正確值:
          ????????rdf_sytem_model_name
          ????????db_user
          ????????db_password
          ????????isRDFInDB
          ????????url
          ????????modelName (如果這個值為空那么腳本會提示用戶從鍵盤輸入值)

          第13個任務將對數據庫模型的一個RDF查詢結果導出到一個RDF文件中,需要以下屬性的正確值:
          ????????rdf_sytem_model_name
          ????????db_user
          ????????db_password
          ????????isRDFInDB
          ????????url
          ????????modelName (如果這個屬性值為空,腳本會要求用戶從鍵盤輸入值)
          ????????rdf_query
          ????????bind_var_name
          ????????export_rdffile_abs_name
          下面是一個范例的屬性值:
          rdf_query=SELECT ?x WHERE (?x????"65")
          bind_var_name=x
          export_rdffile_abs_name=C:/temp/exportquery.rdf


          第14個任務是將一個將數據庫模型的RDF查詢結果刪除,需要以下屬性的正確值:
          ????????rdf_sytem_model_name
          ????????db_user
          ????????db_password
          ????????isRDFInDB
          ????????url
          ????????modelName (如果這個屬性值為空,腳本會要求用戶從鍵盤輸入值)
          ????????rdf_query
          ????????bind_var_name
          下面是一個范例的屬性值:
          rdf_query=SELECT ?x WHERE (?x????"65")
          bind_var_name=x


          結論
          這篇文章介紹了怎么樣使用Jena和Protégé來創建RDF源數據模型。并描述了怎樣使用SemanticRDFUtils在命令行腳本方式下維護RDF模型。在這篇文章的資源中的SemanticRDFUtils-source-files.zip文件包含了能夠用來創建基于Web接口或是Protégé的插件的源文件,使用它們可以管理RDF模型。針對每一個RDF模型所加載的腳文會有所不同,所以需要區別對待,每一種情況都要獨立處理。

          關于作者:
          Venkata N. Vasam 主要工作領域是J2EE/Web services/EAI 架構。目前他使用SeeBeyond集成工具包(eGate和ICAN)為A2A和B2B集成需求提供Web服務/J2EE/EAI 架構。他獲得了J.N.T University,Hyderabad, India的計算機科學與工程學位。業余時間Vasam喜歡打網球看喜劇和運動電影。

          gracepig是(Matrix.org.cn)的會員,可以通過zhangchi_nwpu@hotmail.com和他聯系。


          資源
          文中的源碼下載地址
          http://www.javaworld.com/javaworld/jw-07-2005/jena/jw-0704-jena.zip
          "What is RDF?" 作者 Tim Bray (XML.com, 一月 2001): http://www.xml.com/pub/a/2001/01/24/rdf.html
          ????????RDF 規范
          http://www.w3.org/RDF/
          ????????Jena下載地址
          http://jena.sourceforge.net/downloads.html
          ????????RDF和Jena RDF API簡介
          http://jena.sourceforge.net/tutorial/RDF_API/index.html
          ????????Jena2: 一種語意Web框架
          http://www.hpl.hp.com/semweb/jena2.htm
          ????????RDQL:
          http://jena.sourceforge.net/tutorial/RDQL/index.html
          ????????RDF 入門
          http://www710.univ-lyon1.fr/~champin/rdf-tutorial/
          ????????Protégé 入門
          http://protege.stanford.edu/doc/tutorial/get_started/index.html
          ????????Protégé 下載
          http://protege.stanford.edu/download/download.html
          ????????Algernon標簽
          http://algernon-j.sourceforge.net/doc/algernon-protege.html
          ????????ava 下載地址
          http://java.sun.com/
          ????????Oracle下載地址
          http://www.oracle.com/technology/software/index.html
          ????????????????Matrix java門戶
          http://www.matrix.org.cn
          posted on 2006-04-17 13:06 hopeshared 閱讀(2513) 評論(0)  編輯  收藏 所屬分類: Web Service
          主站蜘蛛池模板: 崇信县| 柳林县| 东兰县| 开化县| 澎湖县| 蒙阴县| 南投市| 寿阳县| 赣州市| 嘉鱼县| 洛隆县| 丰都县| 开平市| 黄浦区| 赫章县| 建始县| 黑山县| 巧家县| 黑龙江省| 舒城县| 永仁县| 孝昌县| 巴青县| 牡丹江市| 阿克陶县| 黎川县| 遂溪县| 科技| 海城市| 鲁山县| 祁阳县| 渭源县| 镶黄旗| 鹰潭市| 永丰县| 上栗县| 新乡县| 云和县| 二连浩特市| 剑阁县| 龙川县|