ちょっとしたメモ

Musical BatonスキーマにRDFのFAQを見る

Musical baton vocabularyスキーマには、RDFでモデルを考えるに際して迷ったり勘違いしたりしやすいポイントがいくつか含まれている。概要紹介でも簡単に触れたが、参考までにFAQ的にとりあげてみることにしよう。

MusicalBaton要素にはrdf:aboutでRDF/XMLのURIを与えるべきではないのですか

すぐに出てきそうなのが、RDF/XMLでバトンを記述するのなら、それがmb:MusicalBaton型リソースのURIになるのではないかという発想。これは、URIとリソース(およびそのリプレゼンテーション)の関係についての、何度も取り上げられている問題ですね。

よく使われる例としては、《W3Cという組織を表すリソースに、http://www.w3.orgというURIを与えたらどうだ》というものがあります。もちろんこれでは、組織としてのW3Cと、そのホームページが区別できなくなり、このリソースのdc:creatorはバーナーズ=リーなのかW3Cのウェブマスターなのか混乱してしまいます。一般には、組織としてのW3Cは、foaf:homepageのようなIFPとしてURIを結びつけるのです。

(例)

<foaf:Organization>
 <foaf:homepage rdf:resource="http://www.w3.org"/>
</foaf:Organization>

FOAFのケースを考えてみてもいいでしょう。FOAFファイルがRDF/XMLとして記述してあっても、foaf:Person型リソース(人物)にrdf:aboutでそのファイルのURIを与えたりはしません。FOAFファイルはその人を識別するURI(IFP)ですらなく、FOAFにおいてはrdfs:seeAlsoによって結びつけられているだけなのです。

(例)

<foaf:Person>
 <foaf:nich>masaka</foaf:nick>
 <foaf:mbox rdf:resource="mailto:webmaster&#64;kanzaki.com"/>
 <rdfs:seeAlso rdf:resource="http://www.kanzaki.com/info/webwho.rdf"/>
</foaf:Person>

同様に、mb:MusicalBatonにはRDF/XMLのURIを与えず、rdfs:seeAlsoとしてロボットの参照のためにこのURIを示すというモデルを採用しています。またIFPは、mb:batonPageとしてバトンを表現したウェブページのURIを用います。

(例)

<mb:MusicalBaton>
 <mb:batonPage rdf:resource="http://www.kanzaki.com/memo/2005/06/18-1"/>
 <rdfs:seeAlso rdf:resource="http://www.kanzaki.com/.../musicalbaton.xml"/>
 <mb:total_volume_of_music_files_on_my_computer>
  242MB
 </mb:total_volume_of_music_files_on_my_computer>
 ...
</mb:MusicalBaton>

MusicalBatonは「ある人のある時の音楽環境を表し、人に送ったり受け取ったりできる特殊なバトン」という抽象的なリソースで、XMLファイルではありません。でないと「XMLファイルが242MBの音楽ファイルを持っている」という変な話になってしまいますよね?

※一般論として、抽象的なリソースURIがそのリプレゼンテーションとしてHTML/XMLファイルを持つことはあります。例えば、XML名前空間URIとそのURIに対応する文書の関係などです。ここでは、FOAFの一部としてバトンを記述できるようにしているため、RDF/XMLのURIがバトンを表すとは考えません。

バトンの4つの質問は、直接foaf:Personのプロパティにする方が良くないですか

「ある人の音楽的環境や嗜好」を表すプロパティは、当然foaf:Person型リソースを直接記述するものとして定義することもできます。“私が最近買ったCD”は、「私」についての話ですから、次のように記述することも可能でしょう。

(例)

<foaf:Person>
 <mb:last_CD_I_bought>Mendelssohn: Symphony No.3/No.4</mb:last_CD_I_bought>
 ...
</foaf:Person>

ただしこれは、「私」がまた別の新しいCDを買うと、その時点で真ではない文になってしまいます。この文が常に真になるようにするには、主語が時間スライスで限定可能な形になっていないとうまく行かないのです。

例えば「日本の外務大臣は○○だ」という文は、いつの時点かによって目的語が違ってきます。これが「第二次小泉内閣の外務大臣は○○だ」ならば、目的語の特定は可能です。あるいは年鑑の記述のように「2005年の日本の外務大臣は○○だ」という形もあり得るでしょう。

日本と外務大臣を直接結びつける代わりに「○○内閣」という中間リソースをおくことで、時間変化をうまく吸収できます。同じように、Musical Batonでは「私が最近買ったCD」ではなく、バトンを表す中間リソースを導入し、「私がこのバトンを受け取った時の一番新しい購入CD」と表現しているのです。

また、「私」が複数のバトンを受け取って、それぞれに異なる「環境・嗜好」を記述した場合、それぞれのプロパティが直接「私」に結びつけられていると、どの文がワンセットのバトン(4つの質問)になるかが不明になってしまいます。この点からも、mb:MusicalBaton型のリソースを使って質問をグループ化するほうが都合がよいのです。

Musical Batonは人と人をつなぐものだから、batonFromの目的語を人にしてしまう方が適切ではありませんか

foaf:knowsが人と人のつながりを示すプロパティであるように、mb:batonFromはバトンの受け渡しを記述するプロパティです。この関係によって、バトンがどのように伝播していったかを示すことができます。

「このバトンはある“人”から渡された」という文を記述するためには、別のプロパティmb:receivedFromがいちおう定義してあります。ただしこの“人”は、mb:batonFromで記述したバトンにmb:batonHolderプロパティを加えて示すことができるので、mb:receivedFromは実質的には必要ありません。mb:passedToの対として存在しているだけです。

バトンの受け渡しをmb:receivedFromのような「人」を目的語としたプロパティで記述しようとすると、その人が複数のバトンを保有していた場合、どのバトンが渡されたのかを特定することができないという問題もあります。バトンの流れも、間に人物リソースが介在してくるので、伝搬をストレートに示すことができないでしょう。

なお、バトンを「ある人に渡した」ことはmb:passedToで示しています。これは、バトンを渡す時点ではその人がどんなバトンリソースを作るか、あるいはそもそもバトンを受け取ってくれるかどうか分からないため、バトンどうしの関係記述ではなく、「バトンと受け取る人」という非対称な関係を記述しているわけです。仮に、バトンは受け取ってもらえるという前提に立てば、次のようにbatonToを用いた記述も可能でしょう。

(例)

<mb:batonTo>
 <mb:MusicalBaton>
  <mb:batonHolder rdf:parseType="Resource">
   <foaf:nick>bar</foaf:nick>
   <foaf:weblog rdf:resource="http://example.org/bar/"/>
  </mb:batonHolder>
 </mb:MusicalBaton>
</mb:batonTo>

mb:batonToは純粋にmb:batonFromの反対関係のプロパティで、バトンの流れを示すという観点では、重複していて不要なものです。バトンはどこから受け取ったかはウェブページに記述する習慣になっているので、mb:batonFromは基本的には与えられると考えると、これだけで流れを追うのに十分ということになります。

mb:passedToは、バトンの流れを追うというよりも、自分のバトン記述の中で「次に誰に渡したか」を示して記述を完結させるという目的が中心です。

five_tunes_I_listen_to...はRDFコンテナを用いる一方、passedToは列挙にしているのはなぜですか

このスキーマは《Musical Batonの質問を忠実に再現する》という遊びからスタートしたため、プロパティは必要以上に質問そのものの名前(とセマンティクス)を用いています。その結果、4番目の質問に対応するプロパティはfive_tunes_I_listen_to...と、メンバー数が5であるグループを示すプロパティになってしまいました。つまり、RDFコンテナでないと表現しにくいものになっているわけです。

プロパティを、たとえばmb:favorite_tuneのようなもっとニュートラルな形で定義していれば、列挙型で記述する方がよいでしょう。

(例)

<mb:MusicalBaton>
 ...
 <mb:favorite_tune>Britten: Peter Grimes</mb:favorite_tune>
 <mb:favorite_tune>バルトーク: 弦楽四重奏曲</mb:favorite_tune>
 <mb:favorite_tune>ブラームス: ピアノ協奏曲第2番</mb:favorite_tune>
 <mb:favorite_tune>マーラー: 大地の歌</mb:favorite_tune>
 <mb:favorite_tune>ニールセン: 交響曲第5番</mb:favorite_tune>
</mb:MusicalBaton>

mb:favorite_tuneが5回出現するということを明確にしたければ、スキーマでowl:cardinalityを使って制約を加えておくことも可能です。

mb:passedToはこのような特殊事情がないので、素直に列挙型にしています。一般に、複数出現するプロパティ/値の記述は、必然的な理由がなければ、RDFコンテナではなく列挙型とすることが推奨されています。

まだ疑問点はあるかも知れないが、長くなってきたので、ひとまずこの辺りで。

関連メモ: