RDFスキーマ -- リソース表現の語彙定義

RDFによるリソースの叙述を計算機にも明確に理解可能にするには、そこで用いるプロパティをスキーマで定義し、参照できるようにする必要があります。RDFスキーマでは、基本クラスと基本プロパティからサブクラス、サブプロパティを生成することで、階層的な語彙を定義します。またプロパティのが関連づけるリソースのタイプを定義し、意味を精密化することができます。

RDFスキーマとは

RDFはリソースのプロパティやリソース間の関係を記述するモデル[RDF-C]を提供しますが、そこで使われるプロパティそのものについては直接定義しません。creator, date, channelといったプロパティ(リソース記述の語彙)は、RDFのスキーマ[RDFS]を用いて別途定義し、それをURIで参照します。

RDFスキーマは、これらのプロパティや一般的なリソースのカテゴリを定義するための基本的なメカニズムを提供します。仕様で用意される基本クラス、基本プロパティなどを用いて、必要なクラスを定義し、そのインスタンスやサブクラスを導いていく方法は、オブジェクト指向言語になぞらえて理解することもできます。

RDFスキーマは、語彙を定義するもっとも基本的な仕組みです。知識を表現するためのより詳細な語彙や関係性の定義のためには、このスキーマのツールをもとに、オントロジー言語[WEBONT]などを設計し、利用していくことになります。

基本クラスと基本プロパティ

RDFスキーマでは、主として次に示す4つの基本クラスと7つの基本プロパティを用いて語彙を定義していきます。以下、rdf:はRDFモデル構文の名前空間、rdfs:はRDFスキーマの名前空間を表すものとします(仕様書で示されている全クラス、プロパティは、本稿の最後に一覧で示します)。

基本クラス

RDFで扱うさまざまな「もの」の基本となるクラスです。全てのRDFモデルは、(間接的に)これらのクラスを利用して構成されます。

rdfs:Resource
RDFで表現するものはすべてリソースなので、これが最も基本的なクラスです。つまり、すべてのクラスはこのrdfs:Resourceクラスのサブクラスということになります(rdfs:Resourceの表すリソースにはリテラルも含まれます)。
rdfs:Class
リソースのタイプもしくはカテゴリを表します。
rdf:Property
プロパティを表すリソースは、rdf:Propertyタイプを持ちます(RDFモデルの基本になるので、rdfs:ではなくrdf:の名前空間に属します)。
rdfs:Literal
文字列などのリテラルを表すクラスです。
rdfs:Datatype
独自のデータ型を定義するためのクラスです。
rdf:XMLLiteral
XMLとしてマーク付けされたリテラルを表すクラスです。rdfs:Datatypeのインスタンスでもあります。

基本プロパティ

クラスからインスタンスを生成したり、サブクラスを導くためには、つぎの基本プロパティを用います。いずれも、rdf:Propertyクラスのインスタンスです。

rdf:type
リソースがあるクラスのメンバ(インスタンス)であることを示します。rdf:typeの値は必ずなんらかのクラスで、リソースはそのクラスの全ての性質を備えます。新たなクラスを定義するときは、rdf:typeの値がrdfs:Classとなります(つまり、クラスはrdfs:Classのインスタンス)
rdfs:subClassOf
あるクラスから派生クラスを生成します。派生クラスは親クラスの性質を継承します。
rdfs:subPropertyOf
あるプロパティをより精密に定義するときに用います。たとえば、「日付」というプロパティから「更新日」というプロパティを派生させるなどです。
rdfs:range
あるプロパティの目的語が、どんなタイプ(クラス)のインスタンスであるかを定義します。複数のrdfs:rangeが指定された場合は、目的語は全てのクラスのインスタンスとなります。
rdfs:domain
あるプロパティの主語が、どんなタイプ(クラス)のインスタンスであるかを定義します。複数のrdfs:domainが指定された場合は、主語は全てのクラスのインスタンスとなります。
rdfs:label
リソースに人間が読むための名前を付けます。
rdfs:comment
リソース定義に人間が読むための説明を加えます。

クラスとサブクラスの定義

簡単なクラス派生の例を見てみましょう。まず最初にMusicクラスを、rdfs:Classタイプのリソースとして定義します。次に、このMusicクラスを元にして、SymphonyConcertoという2つのサブクラスを導いてみます。スキーマの名前空間をex:で表すことにすると、これらのクラスの派生関係のモデルは、次のようなものです。

[rdfs:Class]<--[rdf:type]--[ex:Music]<--[rdfs:subClassOf]--[ex:Symphony] また、もうひとつ[ex:Music]<--[rdfs:subClassOf]--[ex:Concerto]

RDFのXML構文を用いると、このクラス定義のスキーマは次のように記述することができます。

[例1]

<!DOCTYPE rdf:RDF [
 <!ENTITY rdf 'http://www.w3.org/1999/02/22-rdf-syntax-ns#'>
 <!ENTITY rdfs 'http://www.w3.org/2000/01/rdf-schema#'>
 ]>
<rdf:RDF xmlns:rdf="&rdf;" xmlns:rdfs="&rdfs;">

 <rdf:Description rdf:ID="Music">
  <rdf:type rdf:resource="&rdfs;Class"/>
 </rdf:Description>

 <rdf:Description rdf:ID="Symphony">
  <rdf:type rdf:resource="&rdfs;Class"/>
  <rdfs:subClassOf rdf:resource="#Music"/>
 </rdf:Description>

 <rdf:Description rdf:ID="Concerto">
  <rdf:type rdf:resource="&rdfs;Class"/>
  <rdfs:subClassOf rdf:resource="#Music"/>
 </rdf:Description>

</rdf:RDF>

ここで、それぞれの主語となるリソースは「クラス」ですから、すべてrdf:typeプロパティがrdfs:Classであるという文も合わせて記述されています。このスキーマが名前空間ex:で定義されているとして、これらはex:Musicなどとして参照利用することができるわけです。

〔補足〕

rdf:IDrdf:recource属性の値はURIになりますが、RDFの仕様では、属性値として名前空間接頭辞を使ったrdfs:Classという表記ができません。そこでこの例では、名前空間URIを実体として定義しておき、&rdfs;Classという形で記述しています。実体を使わないと、プロパティの値(属性値)としてそれぞれhttp://www.w3.org/2000/01/rdf-schema#ClassといったURIをフルに記述しなければなりません。

〔以上補足〕

もう少し簡便な表記

RDFのXML構文では、rdf:typeでタイプを指定したノード(型付きノード)は、rdf:Description要素をタイプ名で置き換えて良いことになっています。これを用いると、例1のクラス定義は、もう少し簡便に記述できます。たとえばSymphonyクラスの定義ならば次のようになるわけです。

[例2]

 <rdfs:Class rdf:ID="Symphony">
  <rdfs:subClassOf rdf:resource="#Music"/>
 </rdfs:Class>

RDFのXMLによる表記方法については、当サイトRDF/XML構文の簡単な説明を参照してください。

プロパティの定義

プロパティは、rdf:Propertyクラスのインスタンスとして定義します。プロパティがどんな性質を持つかを定めるために、rdfs:domainrdfs:rangeで、関連づけるリソースの型情報を与えます。

ここでは例として、音楽の作曲家というプロパティを定義してみます。rdfs:domainrdfs:rangeのイメージを具体的にするために、上記のMusicクラスがhttp://kanzaki.com/ns/example#で定義されているものとし、さらに同じ名前空間で人物を示すPersonクラスも定義されているものとします。

[例3]

<!DOCTYPE rdf:RDF [
 <!ENTITY rdf 'http://www.w3.org/1999/02/22-rdf-syntax-ns#'>
 <!ENTITY rdfs 'http://www.w3.org/2000/01/rdf-schema#'>
 <!ENTITY ex 'http://kanzaki.com/ns/example#'>
 ]>
<rdf:RDF xmlns:rdf="&rdf;" xmlns:rdfs="&rdfs;" xmlns:ex="&ex;">

 <rdf:Description rdf:about="&ex;composer">
  <rdf:type rdf:resource="&rdf;Property"/>
  <rdfs:domain rdf:resource="&ex;Music"/>
  <rdfs:range rdf:resource="&ex;Person"/>
 </rdf:Description>

</rdf:RDF>

ここでは、composerというプロパティを用いた文は、主語がMusicクラスのインスタンス、目的語がPersonクラスのインスタンスであることを示しています。さらに、このプロパティがDublin Coreのdc:creatorプロパティを精密化するものであると考えれば、

[例4] <rdfs:subPropertyOf rdf:resource="&dc;creator"/>

という1行を加えます。これにより、他のメタデータ語彙との関連を示し、階層的な語彙の構築や語彙の再利用が可能となります(&dc;はDublin Coreの名前空間URIに対応する実体とします)。

また、例2と同様の短縮構文を用いて、rdf:Description要素をrdf:Propertyで置き換えることも可能です。

[例5] <rdf:Property rdf:about="&ex;composer">

リソースの記述とプロパティ定義の関連

ここで定義したプロパティを、簡単なリソースの記述に利用し、それぞれの関係がどのようになるのかRDFのグラフで確認してみましょう。

[例6]

<rdf:RDF xmlns...>
 <rdf:Description rdf:about="urn:isbn:0-393-09770-8">
  <ex:composer>
   <rdf:Description>
    <ex:name>Igor Stravinsky</ex:name>
   </rdf:Description>
  </ex:composer>
  <dc:title>Petrushka</dc:title>
 </rdf:Description>
</rdf:RDF>

音楽にURIを与えるのは難しいので、ここではストラヴィンスキー作曲の「ペトルーシュカ」について、そのスコア(楽譜)のISBNをURNとして記述しています。作曲家に例3で定義したプロパティを、作品名にDublin Coreを用いて記述しました。

例6は、domain, rangeの定義から主語はex:Musicクラス、目的語はex:Personクラスのインスタンスであることが分かります。従って、次のように書くのと同等の情報を暗黙的に持っていることになります。

[例7]

<rdf:RDF xmlns...>
 <ex:Music rdf:about="urn:isbn:0-393-09770-8">
  <ex:composer>
   <ex:Person>
    <ex:name>Igor Stravinsky</ex:name>
   </ex:Person>
  </ex:composer>
  <dc:title>Petrushka</dc:title>
 </ex:Music>
</rdf:RDF>

このRDFを、グラフで示したものが次の図です。

グラフでは、rdfs:Resourceから派生したex:Music, ex:composer, ex:Personのそれぞれが、リソース記述の主語、プロパティ、目的語となっている

グラフの上半分は、例1,例3のクラス、プロパティ定義(の一部)、下半分の四角で囲まれた部分が例5のリソース記述のグラフです。プロパティcomposerの主語がrdfs:domainで示したクラス(Music)、目的語がrdfs:rangeで示したクラス(Person)に対応していることが確認できます。

その他の主なプロパティなど

語彙の定義を柔軟に行うため、さらにいくつかのプロパティが仕様で用意されています。

rdfs:seeAlso
リソースについて、他の場所でさらに情報が得られることを示します。
rdfs:isDefinedBy
リソースの定義場所を示すもので、rdfs:seeAlsoのサブプロパティです。プロパティの定義にrdfs:isDefinedByを加えておけば、そのプロパティを参照するための名前空間が明確になります。
rdf:value
RDFの記述に置いて、プロパティの値が構造化されたリソースとなる場合(たとえば単位と数値の両方があるなど)に、その主たる値を示すために用います。名前空間が示すように、リソース定義よりむしろリソース記述に使われるプロパティです。

RDFのクラスとプロパティ一覧

以下に、RDFスキーマ仕様示されているクラス、プロパティの一覧を挙げておきます。強調表示しているものは基本(Core)クラスおよびプロパティです。

RDFクラス
クラス名概要
rdfs:Resourceリソース一般を表す基本クラス
rdfs:Classクラスという概念を示すクラス
rdf:Propertyプロパティという概念を示すクラス
rdfs:Literal文字列などのリテラル値を示すクラス
rdf:XMLLiteralXMLとしてマーク付けしたリテラルを示すクラス
rdfs:Datatypeデータ型を定義するクラス
rdf:StatementRDFの文(ステートメント)
rdfs:ContainerRDFのコンテナ(以下参照)を示すクラス
rdf:Bag順序のないコレクション
rdf:Seq順序づけられたコレクション
rdf:Alt代替関係にあるコレクション
rdfs:ContainerMembershipPropertyrdf:_1, rdf:_2, ...としてコンテナのメンバーを表すプロパティのクラス(これらはrdfs:memberのサブプロパティ)。
rdf:Listrdf:first, rdf:rest, rdf:nilによって有限リストを表すクラス。

プロパティについては、domainとrangeも合わせて示します。どのプロパティがどんなクラスを対象に、どんなクラスを値として持てるのかを確認してください。

RDFプロパティ
プロパティ名概要domainrange
rdfs:isDefinedByリソースの名前空間を示すrdfs:Resourcerdfs:Resource
rdf:subjectRDF文の主語rdf:Statementrdfs:Resource
rdf:predicateRDF文の述語rdf:Statementrdf:Property
rdf:objectRDF文の目的語rdf:Statement定義なし
rdf:typeリソースの型、つまりどんなクラスに属するかを示すrdfs:Resourcerdfs:Class
rdfs:memberコンテナのメンバーrdfs:Container定義なし
rdfs:subClassOfあるクラスのメンバー、つまりサブクラスであることを示すrdfs:Classrdfs:Class
rdf:value構造化されたリソースの主たる値を示すrdfs:Resource定義なし
rdfs:subPropertyOfプロパティの精密化であることを示すrdf:Propertyrdf:Property
rdfs:comment人間のための説明rdfs:Resourcerdfs:Literal
rdfs:label人間が読みやすい形のリソース名rdfs:Resourcerdfs:Literal
rdfs:domainプロパティの主語のタイプrdf:Propertyrdfs:Class
rdfs:rangeプロパティの目的語のタイプrdf:Propertyrdfs:Class
rdfs:seeAlso主語であるリソースについての情報を提供するリソースrdfs:Resourcerdfs:Resource
rdf:firstリストの項目をひとつ示す。headとも呼ばれるrdf:List定義なし
rdf:restリストから分岐して別のリストもしくはnilに続くアーク。tailとも呼ばれるrdf:Listrdf:List

※うっかりrdfs:first, rdfs:rest, rdfs:nil, rdfs:Listと書いていた誤りを指摘していただいたので修正しました。

クラスとクラス外延(補足)

クラスはよく集合を用いて説明されますが、ex:PersonのようなクラスURIは、そのクラスに属するメンバー(たとえば人物)全体の集合を表すわけではありません。クラスのメンバーの集合は、クラス外延と呼ばれます。ex:Igorex:Personのインスタンスであるということは、ex:Igorの表すリソースがex:Personのクラス外延(集合)の要素であることを意味します。CがPのサブクラスであるとき、Cの外延はPの外延の部分集合になります。

次の図ではIEXT(classURI)がクラス外延を表しています(点線でクラスリソースと外延を結んでいます)。

[ex:Igor]<--[rdf:type]--[ex:Person]であるとき、[ex:Igor]はex:Personの外延IEXT(ex:Person)である集合の1要素となる

rdfs:Resourceが「リソース一般を表す基本クラス」でrdfs:Classが「クラスという概念を示すクラス」ということは、

という、少し混乱しそうな定義を導きます。これは、

ということを意味しています。図からその関係が分かるでしょうか。

参照文献

[RDFS]
Dan Brickley and R.V. Guha eds., RDF Vocabulary Description Language 1.0: RDF Schema, , W3C Recommendation
<http://www.w3.org/TR/rdf-schema/>
[RDF-C]
Graham Klyne and Jeremy Carroll eds., Resource Description Framework (RDF): Concepts and Abstract Syntax, , W3C Recommendation
<http://www.w3.org/TR/rdf-concepts/>
[RDF/XML]
Dave Beckett ed., RDF/XML Syntax Specification (Revised), , W3C Recommendation
<http://www.w3.org/TR/rdf-syntax-grammar/>
[RDF-PRIMER]
Frank Manola, Eric Miller, RDF Primer, , W3C Recommendation
<http://www.w3.org/TR/rdf-primer/>
[RDFMS]
Ora Lassila, et al., Resource Description Framework (RDF) Model and Syntax Specification, , W3C Recommendation (Obsolete)
<http://www.w3.org/TR/REC-rdf-syntax>
[WEBONT]
Michael K. Smith, et al., Web Ontology Language (OWL) Guide Version 1.0, , W3C Working Draft
<http://www.w3.org/TR/owl-guide/>