[其他語言版本]
從其根基上講,基於RDF的semantic web的世界,其實是很簡單的。這篇文章教你如何開始。本文會使用一種簡化的教學語言即 Notation 3,或者叫 N3。 這種語言基本上等同於使用XML語義的RDF,但是對初學者來說,它相對容易編寫。
在 RDF 中,資訊簡單地講就是一組語句,每個語句包括主語,動詞,賓語,僅此而已。 在 N3 中,你可以像下面那樣書寫一個 RDF 三元組,並在末尾附上一個句號:
<#pat> <#knows> <#jo> .
任何東西,主語,動詞,或者賓語也好,都是通過統一資源識別字(Uniform Resource Identifier,URI)來標識的, 就像這樣:<http://www.w3.org/> 或者 <http://www.w3.org/2000/10/swap/test/s1.n3#includes>, 但當 "#" 之前的所有東西 被省略掉後,它就把 <#pat> 標識在當前文檔中,不管這個“它”是什麽。
有一個例外,賓語(僅賓語)可以是一個字面常量,比如字串(string), 或者整數(integer):
<#pat> <#knows> <#jo> . <#pat> <#age> 24 .
動詞 "knows" 在RDF中被稱爲“屬性(property)”,並且被認爲是用來表達兩者之間 一種關係的名詞。事實上,你可以這樣寫:
<#pat> <#child> <#al> .
你也可以選擇像下面那樣書寫,使其更易閱讀
<#pat> has <#child> <#al> .
或者
<#al> is <#child> of <#pat> .
當對一個相同的主語你有若干個語句時,可以有這麽兩個快捷方式: 用一個分號 ";" 引入相同主語的其他屬性;用一個逗號引入相同主語及謂語的其他賓語。
<#pat> <#child> <#al>, <#chaz>, <#mo> ;
<#age> 24 ;
<#eyecolor> "blue" .
這樣,舉例來說,對於下面表格中的資料
| age | eyecolor | |
| pat | 24 | blue |
| al | 3 | green |
| jo | 5 | green |
可以寫成這樣:
<#pat> <#age> 24; <#eyecolor> "blue" . <#al> <#age> 3; <#eyecolor> "green" . <#jo> <#age> 5; <#eyecolor> "green" .
有時會出現這樣情況,你有一個語句但不想費勁給它一個識別字 -- 你知道有這麽個東西存在, 但你只是想描述它的屬性。你可以用方括號(其中包含要描述的屬性)來表示它。
<#pat> <#child> [ <#age> 4 ] , [ <#age> 3 ].
這個可以讀成這樣: #pat 有一個 #child,它的 #age 是 "4" ,另有一個 #child,它的 #age 是 "3" 。有兩點很重要需記住。
如果我們確實想使用名字(name), 我們可以將前面提到的表格寫成這樣:
[ <#name> "Pat"; <#age> 24; <#eyecolor> "blue" ]. [ <#name> "Al" ; <#age> 3; <#eyecolor> "green" ]. [ <#name> "Jo" ; <#age> 5; <#eyecolor> "green" ].
對於如何組合方括號,可以有很多方法 -- 你今後可以根據例子自己揣摩出。 關於使用 N3 來表現資料,我們剩下要學的已經不多了,讓我們繼續。
Semantic web 無法在一個文檔裏把某某東西是什麽定義完,你在英語這個語言裏面可以這麽做(或許有時在數學裏也可以這樣),但當我們真正在用一個概念,例如“標題”,進行溝通交流時(比如在一個國會圖書館的目錄卡上,或者在一個網頁上),我們依賴於一個關於“標題”的共用概念。在 semantic web 上,對於一個概念,我們通過使用一個完全相同的統一資源識別字(URI)來精確地共用它。
我想通過下面的方式來給一個 N3 文檔起個標題
<> <#title> "N3 的一個簡單示例".
(以上的 <> 作爲一個空的 URI 引用,總是引用當前正在書寫的文檔。) 而 <#title> 引用了這個文檔自身所定義的 #title 概念。 這對讀者來說沒有多大意義。但是,有一夥人創作了一組屬性叫做 Dublin Core,在這組屬性裏,其中就有標題(title),並且他們賦予了識別字給它。
<http://purl.org/dc/elements/1.1/title>. 於是,我們就可以像下面那樣定義一個更好的語句
<> <http://purl.org/dc/elements/1.1/title> "入門教程 - 使用 N3 初探 semantic web 和 RDF".
顯然,那樣做會比較繁瑣 -- 試想一下對於以上提到的 #age 及 #eyecolor 或任何其他東西都要用這麽長的識別字。 於是 N3 允許你創建一個快捷字首代表那長的一部分 -- 這部分我們稱爲 名字空間 (namespace) . 你用 "@prefix" 來設置它,就像這樣:
@prefix dc: <http://purl.org/dc/elements/1.1/> . <> dc:title "入門教程 - 使用 N3 初探 semantic web 和 RDF".
請注意,當你使用字首時,你在 dc 和 title 之間使用的應該是冒號(:),而不是井字元(#)。並且,你不需在整個上使用 <尖括弧>。 這樣就會很快。這個就會是你在 N3 中看到的,並且也會是你所寫的幾乎所有謂語的樣子。一旦設置好,一個字首可在文件的隨後部分任意使用。
你會有越來越多的 RDF 辭彙可以引用 -- 查看一下 RDF 的主頁 以及它所給的連接 -- 另外,你也可以很容易地爲你的應用程式創建你自己的辭彙。
接下來,我們會使用一些常見的名字空間,並且爲了節省空間,我將假設如下的字首
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> . @prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> . @prefix owl: <http://www.w3.org/2002/07/owl#> .
它們分別是 RDF, RDF schema, 以及 OWL 的名字空間。它們爲我們提高了核心的辭彙(術語),使我們可以很快地進入 semantic web 。我還將假設空字首表示我們當前正在寫的文檔,這在 N3 裏表示如下
@prefix : <#> .
這意味著我們可以將前面的例子表示成如下
:pat :child [ :age 4 ] , [ :age 3 ].
這樣可以少打一些字元。現在你明白了怎樣用 N3 來書寫資料,那你可以開始創建你自己的辭彙了,因爲辭彙它們本身也就是資料。
前面提到的像 dc:title 這樣的東西叫做 RDF 屬性(Properties). 當你想定義一個新的辭彙集,你需要定義一些新的類和新的屬性。當你想要表達某個東西是什麽類別時,你需要一個它所屬的類(Class)。
用來告訴你某個東西屬於什麽類別的屬性叫 rdf:type,這個屬性在 N3 裏可以簡寫成 a。這樣,我們可以定義這個人物(person)類:
:Person a rdfs:Class.
在同一個文檔裏,我們可以引入一個實際人物:
:Pat a :Person.
類告訴你某個東西的歸屬。一個東西可以屬於很多類。[類與類]之間並不一定要有層次關係 -- 試想一下如下的類:Person, AnimateObject, Animal, TallPerson, Friend 等等[它們之間並不一定要有什麽關係]。[當然,]如果兩個類之間有某種關係,你可以表示出來 - 請參考 RDF Schema 以及 OWL 辭彙集中的(類的)諸多屬性。
:Woman a rdfs:Class; rdfs:subClassOf :Person .
屬性(property)是用來聲明兩個東西之間的某種關係。
:sister a rdf:Property.
有時當某種關係存在於兩個東西之間,你可以很快瞭解它們的一些情況,你還可以將它們用類(class)的形式表達出來。 當任一屬性的主語[主體](subject)必須屬於某個類時,這個類便是這個屬性的 定義域(domain)。當其賓語[客體](object)必須屬於某個類時,這個類稱爲這個屬性的 值域(range)。一個屬性可以有很多定義域和值域,但一般總是[定義域和值域]一一對應的。
:sister rdfs:domain :Person;
rdfs:range :Woman.
需要注意的是,類識別字的首字母是大寫的,而屬性識別字的首字母是小寫的。這不是一個規定,但這是一個很好的約定值得遵守。另外需要注意的是,因爲 rdfs:range 及 rdfs:domain 本身的定義域就是 rdf:Property (即屬性),所以 :sister 便是一個 rdf:Property,而不需要明確說明了。
在你定義一個辭彙集時,不管你剛開始時有沒有意識到,其中通常會有一個或多個詞實際上就等同於另外一個辭彙集裏某個詞。這種情況,對於處理資訊的人或機器來說很有用!兩個詞之間這種等同的屬性是如此的有用和重要,以致 N3 專門爲此提供了一個簡寫符:“=”。
:Woman = foo:FemaleAdult . :Title a rdf:Property; = dc:title .
提示:如果可以,就[儘量]使用其他人的辭彙集 - 這樣有助於資料的交換。當你定義你自己的辭彙集,且辭彙集包含同義詞時,請儘量記錄等同性,因爲這樣也有助於當前和今後的處理程式能有效地處理你和他人的資料。
好的辭彙集的在線文檔有助於人們讀寫 RDF 資料。撰寫者需要知道一個詞該怎麽用;閱讀者需要知道它代表什麽意思。使用這些詞的軟體發展者特別需要詳細知道每個 URI 所代表的含義。
如果你使用 RDF Schema 以及 OWL 辭彙集來製作你自己的辭彙集,你的文檔將在很多種有趣且有用的情況下是機器可讀的。這就像前面我們所提及的那樣,這在辭彙集文檔(Vocabulary Documentation) 中有很詳細的討論。 這種RDF中的RDF文檔有時叫做 “schema” 或者 “本體(ontology)”
讓人們能很容易地找到你的文檔的最簡單的方法是:讓你製作的那些做爲辭彙的 URI 能夠被萬維網瀏覽器所接受。如果你能夠照著我們這兒的命名約定,即辭彙定義文檔的 URI 做成像 http://example.com/terms 這樣,且它像 <#Woman> 這樣引用其中的詞,那麽你的文檔就可以自動地被瀏覽器所接受。根據前面給出的 @prefix 的聲明,這樣就會得到 http://example.com/terms#Woman 這樣的 URI,於是,任何瀏覽器都可以顯示這樣的定義文檔。
理想情況下,你要發佈你的文檔到萬維網上去,就得使用一個伺服器以及一部分的 URI 空間,最好是它們屬於一個組織,這個組織願意一直很好地去維護它們。那樣地話,許多年過去之後,那些使用了你的辭彙的 RDF 資料還將被很好地記錄著,且還可能被[人們/機器]理解。[另外],把當前的年份放入 URI 的約定做法會有助於穩定性;某天人們也許會想重新使用 http://example.com/food-vocabulary, 但當他們真的想升級文檔時,也許只是更新一下http://example.com/2003/food-vocabulary。在某些場合下,通過使用一個特別的功能變數名稱(它得不會因爲可能的機構重命名而改變,也沒有商標問題), 你也可以達到提高穩定性的目的。
當然,如果你只是想玩玩,你可以使用一個文件(比如mydb.n3),把它跟其他你的文件放在同一個目錄裏。當你那樣做的話,你可以簡單地使用 <mydb.n3#> 作爲你的名字空間識別字,因爲在 N3 中(就像在 HTML 中),URI 可以用相對當前位置的方式來表示。