RDF/XML 並不是 RDF 模型的唯一表示。W3C 開發了 N-Triples,這是一種特別適合於測試套件的 RDF 表示格式。在本文中,Uche Ogbuji 使用從 RDF/XML 轉換而來的示例介紹了 N-Triples。
在 以前的文章中,我使用了標題“Repeat after me: There is no syntax”(跟著我重復:沒有語法)。RDF 的傳統 XML 語法經常受誹謗,但幸好這不是 RDF 存在的原因,而且出現另一些序列化方式總是必然的。XML 作為序列化語法的一個問題是它如此靈活以致於在自動測試過程中要比較所希望的結果與實際結果會很困難。不論是在回歸測試中還是在一致性測試中,試著將 XML 規范化成某種形式通常很有用,這樣,簡單的文本比較就會得出有意義的結果。為此,XML 社區開發了 XML 范式,而且當 W3C RDF 工作組在開發 RDF 一致性測試套件時需要同種形式的 RDF。
一個選項是定義與任何圖都匹配的 RDF/XML 范式,然後依照相關的 W3C 推薦來將結果 XML 規范化。但是,我認為 RDF 工作組在開發用於 RDF 圖的簡單且嚴格定義的文本格式時選擇了正確的路線。這個格式被命名為 N-Triples,而且被編入了 RDF Test Cases 工作草案中(請參閱 參考資料)。在本文中,我將使用從 RDF/XML 轉換而來的示例介紹 N-Triples。您應該熟悉 XML 和 RDF。
三是幸運數字
我將首先描述一個簡單的 N-Triples 示例。清單 1 是 RDF/XML,摘自我以前有關 PRISM 的文章。
清單 1. 用 RDF/XML(基本 PRISM 詞匯表)描述的 Thinking XML 第 12 篇專欄文章
<?XML version="1.0" encoding="UTF-8"?>
<rdf:RDF
XMLns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
XMLns:dc="http://purl.org/dc/elements/1.1/"
XML:lang="en"
>
<rdf:Description
rdf:about="http://www.ibm.com/developerworks/XML/library/x-think12.Html">
<dc:description>
A discussion of the broader context and relevance of XML/RDF techniques.
</dc:description>
<dc:title>
Basic XML and RDF techniques for knowledge management, Part 7
</dc:title>
<dc:publisher>IBM developerWorks</dc:publisher>
<dc:creator>Uche Ogbuji</dc:creator>
<dc:subject>XML</dc:subject>
<dc:subject>RDF</dc:subject>
<dc:format>text/Html</dc:format>
</rdf:Description>
</rdf:RDF>
清單 2顯示了與清單 1 等價的 N-Triples。
我願意把 N-Triples 描述成“冗長但很清晰”。正如您看到的,沒有任何縮寫詞 - 甚至沒有名稱空間。所有的 URI 都是完整拼寫的。這對於測試及類似情況很理想,因為它不會引入有關“相應的 RDF 模型是什麼”這樣的任何混淆。
N-Triples 是一種面向行的格式。每個三元組必須寫成一個獨立行,它由主語說明符、謂語說明符以及賓語說明符組成,後面還有一個句號。主語和謂語的分隔,以及謂語和賓語的分隔都使用一個或多個空格或制表符實現。指定資源的形式有兩種。如果它們有 URI,那麼它們必須表示為您在 清單 1 中看到的形式:用尖括號將絕對 URI 引用括起來。禁止諸如 <local/file.ext> 這樣的相對 URI 引用。
當然,在 RDF 中,所有主語和謂語都是 URI,但是賓語可以是 URI 也可以是文字。盡管 N-Triples 確實支持語言說明符和數據類型(正如我稍後將在 文字細節中討論的那樣),但所有文字都表示為用引號括起來的字符串。
匿名領域
正如我提到的,用 N-Triples 表示資源有兩種形式。我已經討論了用 URI 表示資源的形式。N-Triples 還有一個表示 匿名節點(也稱為 空節點)的約定。清單 3 是一個包含一對空節點的簡單 RDF/XML 示例:
清單 3. 帶有空節點的簡單 RDF/XML 示例
<rdf:RDF XMLns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
XMLns:dc="http://purl.org/dc/elements/1.1/">
<rdf:Description>
<dc:title>Unwritten work</dc:title>
<dc:creator rdf:parseType="Resource">
<dc:title>The League of Procrastinators</dc:title>
</dc:creator>
<dc:contributor rdf:resource="http://put-off.org"/>
</rdf:Description>
</rdf:RDF>
圖 1以圖形的形式顯示了 清單 3。
圖 1. 清單 3 的模型圖
正如您看到的,有兩個橢圓形框中沒有任何標簽。它們是空節點。它們確實有標識,但那個標識不是由 URI 給定的。當實際上沒有任何適合的 URI 與資源相關聯時,常常會使用空節點,就如 清單 3和 圖 1中的示例那樣,其中正被描述的工作還沒有被寫入。
清單 4 顯示了與 清單 3等價的 N-Triples,它也對應於 圖 1中的圖。
清單 4. 與清單 3 等價的 N-Triples
_:blank1 <http://purl.org/dc/elements/1.1/title> "Unwritten work" .
_:blank2 <http://purl.org/dc/elements/1.1/title> "The League of Procrastinators" .
_:blank1 <http://purl.org/dc/elements/1.1/creator> _:blank2 .
_:blank1 <http://purl.org/dc/elements/1.1/contributor> <http://put-off.org> .
空節點的形式是 _: name ,其中 name 是給定的 N-Triples 集內該空節點的標識。 _: name 標識維護節點標識,即使 RDF 模型中沒有任何標識與它們對應。RDF/XML 最近為您添加了一個類似的工具,以在 rdf:Description 或類型節點開始標記中使用 rdf:nodeID 。清單 5 與 清單 3等價,但所用的本地節點標識與 清單 4中的相同。
清單 5. 帶有空節點的簡單 RDF/XML 示例
<rdf:RDF XMLns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
XMLns:dc="http://purl.org/dc/elements/1.1/">
<rdf:Description rdf:nodeID="blank1">
<dc:title>Unwritten work</dc:title>
<dc:creator rdf:parseType="Resource" rdf:nodeID="blank2">
<dc:title>The League of Procrastinators</dc:title>
</dc:creator>
<dc:contributor rdf:resource="http://put-off.org"/>
</rdf:Description>
</rdf:RDF>
同樣, 非常重要的是注意這些空節點的本地標識純粹是特定 RDF/XML 或 N-Triples 文件內的約定。雖然清單 4和清單 5剛好都使用節點標識“blank1”,但這並不意味著其對應的空節點都擁有同一標識。這使人可能有點混淆,但它是空節點的一個基本特性。
文字細節
RDF 始終允許用戶指定用於表示特性值的語言。清單 6 顯示了一個匿名資源的 RDF/XML 示例,其特性是用英語和西班牙語表示的。
清單 6. 使用語言元特性的 RDF 描述
<rdf:RDF XMLns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
XMLns:dc="http://purl.org/dc/elements/1.1/">
<rdf:Description>
<dc:title XML:lang="es">A lo cubano</dc:title>
<dc:title XML:lang="en">Cuban style</dc:title>
<dc:creator>Orishas</dc:creator>
</rdf:Description>
</rdf:RDF>
這裡,給定的 dc:title 特性使用兩種不同的語言。語言說明符總的說來並不是該語句的特性(這就是為什麼國際化沒有將 RDF 轉換成四元組而是三元組系統的原因)。相反,語言是文字本身的一個基本特性。N-Triples 在其語言表示法中指出了這一點,就如您在清單 7 中看到的,這是 清單 6到 N-Triples 的轉換。
清單 7. 與清單 6 等價的 N-Triples
_:blank1 <http://purl.org/dc/elements/1.1/title> "A lo cubano"@es .
_:blank1 <http://purl.org/dc/elements/1.1/title> "Cuban style"@en .
_:blank1 <http://purl.org/dc/elements/1.1/creator> "Orishas" .
@ 被附加到了文字值的表示中。其後是 RFC 3066 中定義的語言碼;這是主要的語言指派符號(“en”代表“English”(英語),“es”代表“Spanish”(西班牙語)等)。它也可以指派語言變體;例如,“en-US”代表美式英語、“en-GB”代表英式英語或“es-MX”代表墨西哥西班牙語。
另一種文字可以包含的特性(有人最近將它引入到了 RDF 中)是 數據類型。可以為 RDF 文字給定數據類型,如“整數”、“字符串”、“日期”或甚至是“莫爾斯代碼”。數據類型被指派為 URI,您可以通過使用基於 W3C XML Schema(WXS)名稱空間(一般被映射成前綴 xsd )的 URL 來使用 WXS 語言中的常見數據類型。清單 8 中的一個 N-Triples 包含數據類型指定。
清單 8. 賓語包含數據類型指定的三元組
#This is a comment in N-Triples
#It must appear by itself on a separate line
#The object of the following triple is of type xsd:int
http://example.com/employees/jdoe http://example.com/employee-id
"23"^^http://www.w3.org/2001/XMLSchema#int
^^ 標記後面是指定數據類型的 URI,它可能基於某個標准(如本例),也可以是某個本地約定。重要的是記住:即使這裡的賓語是用引號括起來表示的,任何支持數據類型的系統實際上仍將它解釋為 WXS 整數。 清單 8還顯示了如何在 N-Triples 中嵌入注釋。小心:我曾看到過許多 N-Triples 示例中的注釋位於三元組所在行的結束小數點之後。當前的 N-Triples 語法不支持這種用法。
“三元”中的信息
這就是 N-Triples 的全部結構。我未涉及幾個細微差別;例如語法中允許非常嚴格的字符集,因此您必須小心轉義這些范圍以外的任何字符。有些字符(在 URI 引用中)必須使用 URI 約定來轉義,而其它則使用前面帶有反斜槓的 N-Triples 約定。如果您正編寫讀或寫 N-Triples 的代碼,那麼請確保參閱了這些細節的規范。
有幾項工作以用於 RDF 的基於簡單三元組的表示為目標,其中之一是 N3(請參閱 參考資料),它相當流行並且是 N-Triples 中某些思想的起源。但是 N-Triples 的優勢在於被寫入了正式規范,而且由於它在標准 RDF 測試用例中的使用,因此可能所有的 RDF 處理器都將實現它。