Notation3:RDFの簡易表記から論理表現まで

RDFのモデルを記述する方法は、グラフ、XML構文などがありますが、第3の扱いやすい記法としてバーナーズ=リーが示しているのがNotation3です。コンパクトで分かりやすいだけでなく、XML構文では記述が困難な「引用」を表現でき、セマンティック・ウェブのRule、Logicレイヤーを具体的に書き表すことも可能です。

RDFのトリプルとN3:基本フォーマット

RDFは、主語、述語、目的語の3つの組(トリプル:triple)を用いてリソースを記述します。たとえば、ある文書でMaestro、conducts、Orchestraという語彙が定義されているとき、「マエストロはオーケストラを指揮する」という関係は、次のようなグラフで記述できます。

[#Maestro]--#conducts-->[#Orchestra]

Notation3(以下N3と略します)は、RDFのモデルを簡単に記述できるように提案されている方法です[N3]。N3で上のモデルを記述するには、次のようにします。

[例1] <#Maestro> <#conducts> <#Orchestra> .

主語、述語、目的語を示すURI(この場合は同じ文書内なのでフラグメント識別子)を<>で囲んで列挙し、最後にピリオド(.)を置くだけです。

目的語がURIで示されるリソースではなくリテラルである場合は、""で囲んで示します。

[例2] <#Maestro> <#name> "Norrington" .

目的語が複数ある場合は、カンマ(,)で区切って列挙することができます。「マエストロはオーケストラ、合唱、ソリストを指揮します」という場合は次のようになります。

[例3] <#Maestro> <#conducts> <#Orchestra>, <#Choir>, <#Solists> .

さらに、同じ主語に対して異なる述語を適用する2つの文は、セミコロン(;)を使って(主語を略して)つなぐことができます。[例2]と[例3]をまとめると次のような表記ができます。

[例4]

<#Maestro> <#conducts> <#Orchestra>, <#Choir>, <#Solists> ;
           <#name> "Norrington" .

一般的なRDFは、名前空間を用いて語彙を区別します。XML構文ではxmlns属性で名前空間URIと接頭辞を結びつけ、接頭辞+ローカル名(QName)を要素名に用いますが、N3でも同様に@prefixキーワードでQNameを利用することが可能です。

[例5]

@prefix dc: <http://purl.org/dc/elements/1.1/> .
<http://kanzaki.com/> dc:title "The Web KANZAKI" .

QNameを用いる場合は、<>で囲まないことに注意してください。また、XML構文ではrdf:aboutrdf:resourceといった属性の値としてQNameを用いることができないため、主語や目的語は長いURIを記述する必要がありましたが、N3では主語、目的語もQNameで表現できます。

@prefixで空の接頭辞と現在の文書(#のみ)に結びつけると、同じ文書内の語彙をQNameで表記することもできます。たとえば[例1]は次のようにも表記可能です。

[例6]

@prefix : <#> .
:Maestro :conducts :Orchestra .

匿名ノードと構造化

RDFでは、複数の文(Statement)を連結する時に匿名の(空白の)ノードを用いることがあります。たとえば、「この書籍の作者は○○でメールアドレスは△△です」という場合、「作者」というリソースは次のように空白ノードで示されます。

空白ノードが生成されて、そこからex:name、ex:mailのアークが伸びる

N3では、URIを持たない空白ノードは、匿名であることを示す特殊な接頭辞 _: を使って表します(ローカル名は任意にa1などとします)。

[例7]

@prefix dc: <http://purl.org/dc/elements/1.1/> .
@prefix ex: <http://example.com/ex/> .
<urn:isbn:4-8399-0454-5> dc:creator _:a1 .
_:a1 ex:name "KANZAKI, Masahide" .
_:a1 ex:email "webmaster@kanzaki.com" .

匿名ノードを主語とする文は、主語を略して[述語 目的語]と簡略に表記することができます。これを(主語の反復を省略する;と組み合わせて)用いると、[例7]は次のようにさらにシンプルになります。

[例7-2]

@prefix dc: <http://purl.org/dc/elements/1.1/> .
@prefix ex: <http://example.com/ex/> .
<urn:isbn:4-8399-0454-5> dc:creator 
             [ex:name "KANZAKI, Masahide"; ex:email "webmaster@kanzaki.com"] .

N-Triples(参考)

N-Triples(Nトリプル)[N-TRIPLE]は、N3をより簡略にしたRDFモデルの表記法で、RDFのテストケース[RDF-TEST]や、グラフィカルでない環境でグラフを表現したりするのに用いられます。ここまで取り上げたN3の表記法のうち、URIを<>で括って列挙するもの([例1])、リテラル目的語を""で示すもの([例2])および匿名ノードを接頭辞_:で示すもの([例7])のみが使えます。@prefixがないので、常に長いURIを記述しなければなりません。

N3を用いた語彙の定義

語彙を定義するにはRDFスキーマOWLなどのオントロジー言語を用いますが、N3ではこれらを表現するために便利な記法があらかじめ用意されています。以下、rdf:はRDF-MS、rdfs:はRDFスキーマの名前空間、:は同じ文書として宣言(@prefix)されているものとします。

例えばMusicianというクラスを定義するには、このリソースのタイプ(rdf:type)がRDFのクラス(rdfs:Class)であることを記述します。

[例8] :Musician rdf:type rdfs:Class .

N3では、rdf:typeを単にaと略記することができます。

[例8-2] :Musician a rdfs:Class .

さらに、MaestroというクラスはMusicianのサブクラスであることを定義します。

[例9] :Maestro a rdfs:Class; rdfs:subClassOf :Musician .

プロパティの定義も同様です。conductsがプロパティで、domain、rangeともにMusicianクラスであることを定義しましょう(指揮をするのもされるのも音楽家)。

[例10] :conducts a rdf:Property; rdfs:domain :Musician; rdfs:range :Musician .

分散処理のセマンティック・ウェブの世界では、別々のところで同様の語彙が定義されることは頻繁に生じます。こうしたとき、エージェントに2つの語彙が等しいと示してやることで、語彙を統合したり変換することが可能になります。オントロジーでは例えばowl:equivalentToという形でこの同等性を示しますが、N3では簡単に = で結ぶだけです。

[例11] :Maestro = ex:Conductor .

フォーミュラとコンテクスト:論理の表現

N3の大きな特徴に、RDFのXML構文では難しい「間接話法」を表現するフォーミュラがあります。フォーミュラは複数の文(Statement)を{}で囲んでグループ化したもので、それ自身が文の主語や目的語になることができます。フォーミュラ内の文にとっては、このフォーミュラはコンテクストとなります。

「ウェブの演奏会告知ページで、マエストロ・ノリントンがシュトゥットガルト放送響を指揮すると紹介している」という文を考えてみましょう。

[例12]

<http://kanzaki.com/norrington/> :introduces
  { :Maestro :name "Roger Norrington" ; :conducts :Orchestra .
    :Orchestra :name "SWR Stuttgart RSO" . } .

これをXML構文で表現しようとすると、具体化(reification)という複雑な手続きを踏むのですが、この方法についてはいまだに議論が続いています。

Rule, Logicレイヤーの表現

フォーミュラといくつかのキーワードを用いると、ルールや論理を表現することも可能になります。N3ではAからBが導かれることを示す=>という動詞が利用できます。たとえば「温度が42度を超えたらボイラーを止める」というルールは次のように書けるでしょう。

[例13]

@prefix math: <http://www.w3.org/1998/Math/MathML> .
{ :Temperature math:gt "42" . } => { :Controler :stop :Bolier . } .

さらに、N3では全数限量子(∀)に相当する@forAll、存在限量子(∃)に相当する@forSomeが用意され、一般的な論理が表現可能になっています。バーナーズ=リーが「N3によるセマンティック・ウェブ入門」[N3-PRIMER]で示している例を(少し変更して)示しましょう。

[例14]

@forAll :x, :y .
{ :x :parent :y . } => { :y :child :x . } .

OWLのowl:inverseOfはこのように反対の関係にあるプロパティを示す制約です。次のような一般的なルールで、マシンはこの関係を用いた推論を実行できます。

[例15]

@forAll :p, :q .
{ :p owl:inverseOf :q . }  =>
  { @forAll :x, :y . { :x :p :y . } => { :y :q :x . } . } .

[CWM]のようなシステムでは、実際にN3によるこうしたルールを使って、問い合わせや推論を行うことが可能です。

〔補足〕

=>@forAll@forSomeは、以前はlog:という名前空間(http://www.w3.org/2000/10/swap/log#)を用いて、それぞれlog:impliesthis log:forallthis log:forSomeと表現されていました。N3を紹介する文献では、この表記を使っていることが多いと思います。ここでthisは、ルート・フォーミュラを指します。

〔以上補足〕

参照文献

[N3]
Tim Berners-Lee, Notation 3: Ideas about Web Architecture - yet another notation, , (v.1.49; original: 1998)
<http://www.w3.org/DesignIssues/Notation3>
[N3-PRIMER]
Tim Berners-Lee, Primer: Getting into RDF & Semantic Web using N3, , (v.1.37)
<http://www.w3.org/2000/10/swap/Primer.html>
[CWM]
Tim Berners-Lee, cwm - a general purpose data processor for the semantic web, , (v1.19)
<http://www.w3.org/2000/10/swap/doc/cwm.html>
[N-TRIPLE]
Dave Beckett and Art Barstow, N-Triples, , W3C RDF Core WG Internal Working Draft (V1.9)
<http://www.w3.org/2001/sw/RDFCore/ntriples/>
[RDF-TEST]
Jan Grant and Dave Beckett, RDF Test Cases, , W3C Working Draft
<http://www.w3.org/TR/rdf-testcases>
[SEAN2001]
Sean B. Palmer, The Semantic Web: An Introduction,
<http://infomesh.net/2001/swintro/>
[SEAN2002]
Sean B. Palmer, Notation3: A Rough Guide to N3,
<http://infomesh.net/2002/notation3/>