ちょっとしたメモ

Musical Baton記述のスキーマ

ミュージカル・バトンをRDFで記述しようとMusical baton vocabularyスキーマを考えていたら、案外、練習問題として面白そうなので、概要をメモしておこう。ポイントは、バトンを表すリソースをどう扱うかと、バトンのやり取りをどうやって表現するかというところかな。基本的には遊びなので、気軽にやればいいんですが。

この手のスキーマを考える時、もっとも手っ取り早いのは、それぞれの「質問」項目を人物のプロパティにしてしまう方法だ。

(例)

<foaf:Person>
 <mb:total_volume_of_music_files_on_my_computer>
  242MB
 </mb:total_volume_of_music_files_on_my_computer>
 <mb:song_playing_right_now>
  川田知子のバイオリンリサイタルのMD
 </mb:song_playing_right_now>
 ...
</foaf:Person>

しかしこれだと、song_playing_right_now といってもいつの時点の話なのかが分からず、ちょっと意味不明になってしまう。これらは時間経過によって変化する情報なのだから、人によってはバトンを何回か受け取って、そのたびに異なる答えを書くこともあるだろう。したがって、ここでは「ある人のある時の音楽的嗜好や環境」を表すクラス MusicalBaton を定義し、そのプロパティとして各質問の答えを記述する方が扱いやすい。そうすれば、MusicalBaton のプロパティとして日付を加えたり、バトンが公開されているウェブページを示すことも可能になる。

(例)

<foaf:Person>
 <mb:hasBaton>
  <mb:MusicalBaton>
   <dc:date>2005-06-17</dc:date>
   <mb:batonPage rdf:resource="http://www.kanzaki.com/memo/2005/06/18-1"/>
   <mb:total_volume_of_music_files_on_my_computer>
    242MB
   </mb:total_volume_of_music_files_on_my_computer>
   <mb:song_playing_right_now>
    川田知子のバイオリンリサイタルのMD
   </mb:song_playing_right_now>
   ...
  </mb:MusicalBaton>
 </mb:hasBaton>
</foaf:Person>

さて、今度はバトンのやり取りを記述して、自動的にバトンの経路を追跡したりさかのぼったりできるようにしてみよう。一般には、「○○さんからバトンを受け取った」「△△さんにバトンを渡した」と言うが、バトンは人物とは別のリソースとして定義したので、ここはバトンどうしの関係記述の方が都合がよい。つまり、「○○さんが持っていたバトンを受け取った」という形にしたいわけだ。

バトンの受領をbatonFrom、次に送るバトンをbatonToとし、誰がバトンを持っていたかをbatonHolder(hasBatonの反対関係)で表してみる。

(例)

<mb:MusicalBaton>
 ...
 <mb:batonFrom>
  <mb:MusicalBaton>
   <mb:batonHolder rdf:parseType="Resource">
    <foaf:nick>foo</foaf:nick>
   </mb:batonHolder>
   <mb:batonPage rdf:resource="http://example.org/foo/baton_entry"/>
  </mb:MusicalBaton>
 </mb:batonFrom>
 <mb:batonTo>
  <mb:MusicalBaton>
   <mb:batonHolder rdf:parseType="Resource">
    <foaf:nick>bar</foaf:nick>
   </mb:batonHolder>
   <mb:batonPage rdf:resource="http://example.org/bar/baton_diary"/>
  </mb:MusicalBaton>
 </mb:batonTo>
</mb:MusicalBaton>

人物とバトンの関係に絞って図示すると次のような具合だ。

つながりは受領、送付ともにバトンどうしの関係として記述している。

これで関係は明瞭になるが、バトンを誰かに渡そうと考えた時点では、その人がどんなページにバトンを記述するか(そもそもバトンを受け取ってくれるか)は分からない。つまり、送り先についてはバトンではなく人物を記述する方が現実的ということになる。バトンを渡す人をpassedToで表現すれば、次のようになる。

(例)

<mb:MusicalBaton>
 ...
 <mb:batonFrom>
  <mb:MusicalBaton>
   <mb:batonHolder rdf:parseType="Resource">
    <foaf:nick>foo</foaf:nick>
   </mb:batonHolder>
   <mb:batonPage rdf:resource="http://example.org/foo/baton_entry"/>
  </mb:MusicalBaton>
 </mb:batonFrom>
 <mb:passedTo>
  <foaf:Person>
   <foaf:nick>bar</foaf:nick>
   <foaf:weblog rdf:resource="http://example.org/foo/bar/"/>
  </foaf:Person>
 </mb:passedTo>
</mb:MusicalBaton>

図示してみると、違いがはっきりするだろう。

送付のつながりは、バトンから人物への関係として記述している。

バトンを渡す側は、その時点では相手のバトンの存在は分からないので、「人にバトンを渡す」という形で記述する。受け取った側がバトン(その時点での自分の音楽環境や嗜好)を記述すると、点線のhasBatonbatonFromが実際に存在するものとなるわけだ。さらに、バトンをRDF/XMLで記述したファイルがあれば、batonFromでつないだバトンにrdfs:seeAlsoを加えておくことで、ロボットによる連続収集も可能になる。

(例)

 <mb:batonFrom>
  <mb:MusicalBaton>
   <mb:batonHolder rdf:parseType="Resource">
    <foaf:nick>foo</foaf:nick>
   </mb:batonHolder>
   <mb:batonPage rdf:resource="http://example.org/foo/baton_entry"/>
   <rdfs:seeAlso rdf:resource="http://example.org/foo/baton.xml"/>
  </mb:MusicalBaton>
 </mb:batonFrom>

このモデルでは、バトンは空白ノードとして、そのバトンを紹介するHTMLページをIFPとしてバトンを識別している。つまり、バトン保持者がRDF/XMLとしてバトンを記述するかどうかに関係なく、このグラフは独自に書き進めることができる。batonFromを基本にして5つほどのバトンの関係を記述し、W3CのRDF Validatorでグラフ表示してみると、次のような感じ(黄色のノードがバトン)。

気楽な遊びだけれども、実際の世界のつながりをRDFで視覚化してみるという意味では、それなりに面白いかな。

関連メモ: