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
クラスを元にして、Symphony
とConcerto
という2つのサブクラスを導いてみます。スキーマの名前空間をex:
で表すことにすると、これらのクラスの派生関係のモデルは、次のようなものです。
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:ID
やrdf: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:domain
とrdfs:range
で、関連づけるリソースの型情報を与えます。
ここでは例として、音楽の作曲家というプロパティを定義してみます。rdfs:domain
とrdfs: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を、グラフで示したものが次の図です。
グラフの上半分は、例1,例3のクラス、プロパティ定義(の一部)、下半分の四角で囲まれた部分が例5のリソース記述のグラフです。プロパティcomposer
の主語がrdfs:domain
で示したクラス(Music
)、目的語がrdfs:range
で示したクラス(Person
)に対応していることが確認できます。
その他の主なプロパティなど
語彙の定義を柔軟に行うため、さらにいくつかのプロパティが仕様で用意されています。
- rdfs:seeAlso
- リソースについて、他の場所でさらに情報が得られることを示します。
- rdfs:isDefinedBy
- リソースの定義場所を示すもので、
rdfs:seeAlso
のサブプロパティです。プロパティの定義にrdfs:isDefinedBy
を加えておけば、そのプロパティを参照するための名前空間が明確になります。 - rdf:value
- RDFの記述に置いて、プロパティの値が構造化されたリソースとなる場合(たとえば単位と数値の両方があるなど)に、その主たる値を示すために用います。名前空間が示すように、リソース定義よりむしろリソース記述に使われるプロパティです。
RDFのクラスとプロパティ一覧
以下に、RDFスキーマ仕様示されているクラス、プロパティの一覧を挙げておきます。強調表示しているものは基本(Core)クラスおよびプロパティです。
クラス名 | 概要 |
---|---|
rdfs:Resource | リソース一般を表す基本クラス |
rdfs:Class | クラスという概念を示すクラス |
rdf:Property | プロパティという概念を示すクラス |
rdfs:Literal | 文字列などのリテラル値を示すクラス |
rdf:XMLLiteral | XMLとしてマーク付けしたリテラルを示すクラス |
rdfs:Datatype | データ型を定義するクラス |
rdf:Statement | RDFの文(ステートメント) |
rdfs:Container | RDFのコンテナ(以下参照)を示すクラス |
rdf:Bag | 順序のないコレクション |
rdf:Seq | 順序づけられたコレクション |
rdf:Alt | 代替関係にあるコレクション |
rdfs:ContainerMembershipProperty | rdf:_1, rdf:_2, ... としてコンテナのメンバーを表すプロパティのクラス(これらはrdfs:member のサブプロパティ)。 |
rdf:List | rdf:first , rdf:rest , rdf:nil によって有限リストを表すクラス。 |
プロパティについては、domainとrangeも合わせて示します。どのプロパティがどんなクラスを対象に、どんなクラスを値として持てるのかを確認してください。
プロパティ名 | 概要 | domain | range |
---|---|---|---|
rdfs:isDefinedBy | リソースの名前空間を示す | rdfs:Resource | rdfs:Resource |
rdf:subject | RDF文の主語 | rdf:Statement | rdfs:Resource |
rdf:predicate | RDF文の述語 | rdf:Statement | rdf:Property |
rdf:object | RDF文の目的語 | rdf:Statement | 定義なし |
rdf:type | リソースの型、つまりどんなクラスに属するかを示す | rdfs:Resource | rdfs:Class |
rdfs:member | コンテナのメンバー | rdfs:Container | 定義なし |
rdfs:subClassOf | あるクラスのメンバー、つまりサブクラスであることを示す | rdfs:Class | rdfs:Class |
rdf:value | 構造化されたリソースの主たる値を示す | rdfs:Resource | 定義なし |
rdfs:subPropertyOf | プロパティの精密化であることを示す | rdf:Property | rdf:Property |
rdfs:comment | 人間のための説明 | rdfs:Resource | rdfs:Literal |
rdfs:label | 人間が読みやすい形のリソース名 | rdfs:Resource | rdfs:Literal |
rdfs:domain | プロパティの主語のタイプ | rdf:Property | rdfs:Class |
rdfs:range | プロパティの目的語のタイプ | rdf:Property | rdfs:Class |
rdfs:seeAlso | 主語であるリソースについての情報を提供するリソース | rdfs:Resource | rdfs:Resource |
rdf:first | リストの項目をひとつ示す。headとも呼ばれる | rdf:List | 定義なし |
rdf:rest | リストから分岐して別のリストもしくはnilに続くアーク。tailとも呼ばれる | rdf:List | rdf:List |
※うっかりrdfs:first
, rdfs:rest
, rdfs:nil
, rdfs:List
と書いていた誤りを指摘していただいたので修正しました。
クラスとクラス外延(補足)
クラスはよく集合を用いて説明されますが、ex:Person
のようなクラスURIは、そのクラスに属するメンバー(たとえば人物)全体の集合を表すわけではありません。クラスのメンバーの集合は、クラス外延と呼ばれます。ex:Igor
がex:Person
のインスタンスであるということは、ex:Igor
の表すリソースがex:Person
のクラス外延(集合)の要素であることを意味します。CがPのサブクラスであるとき、Cの外延はPの外延の部分集合になります。
次の図ではIEXT(classURI)
がクラス外延を表しています(点線でクラスリソースと外延を結んでいます)。
rdfs:Resource
が「リソース一般を表す基本クラス」でrdfs:Class
が「クラスという概念を示すクラス」ということは、
rdfs:Resource
はrdfs:Class
のインスタンス(つまりクラスの一種)rdfs:Class
はrdfs:Resource
のサブクラス(つまりクラスは全てリソース)
という、少し混乱しそうな定義を導きます。これは、
rdfs:Resource
で表されるリソースはrdfs:Class
の外延(IEXT(rdfs:Class)
=内側の集合)の要素であり、- その
IEXT(rdfs:Class)
は、IEXT(rdfs:Resource)
(=外側の集合)の部分集合である
ということを意味しています。図からその関係が分かるでしょうか。
参照文献
- [RDFS]
- RDF Vocabulary Description Language 1.0: RDF Schema, , W3C Recommendation ,
- <http://www.w3.org/TR/rdf-schema/>
- [RDF-C]
- Resource Description Framework (RDF): Concepts and Abstract Syntax, , W3C Recommendation ,
- <http://www.w3.org/TR/rdf-concepts/>
- [RDF/XML]
- RDF/XML Syntax Specification (Revised), , W3C Recommendation ,
- <http://www.w3.org/TR/rdf-syntax-grammar/>
- [RDF-PRIMER]
- RDF Primer, , W3C Recommendation ,
- <http://www.w3.org/TR/rdf-primer/>
- [RDFMS]
- Resource Description Framework (RDF) Model and Syntax Specification, , W3C Recommendation (Obsolete) ,
- <http://www.w3.org/TR/REC-rdf-syntax>
- [WEBONT]
- Web Ontology Language (OWL) Guide Version 1.0, , W3C Working Draft ,
- <http://www.w3.org/TR/owl-guide/>