ちょっとしたメモ

Exif RDFスキーマの改訂

4年ほど前につくったExifのデータをRDFで表現するための語彙を大幅に改訂しました。従来は全てのExifタグをリテラル値として扱っていましたが、今回は、数値の解釈が仕様で定められているものを統制語彙としてURIで表現し、より確実なデータ共有ができるようにしています。大きな変更ではありますが、名前空間URIはそのままとする予定です。

Exifのデータの多くは数値として記録されますが、画像サイズなどの本来の数値データ以外は、仕様でその解釈が定義されています。たとえば、タグ番号274のorientationの場合、値が1ならば The 0th row is at the visual top of the image, and the 0th column is the visual left-hand side、つまり左上が原点になる画像というわけです。Exifを扱うツールでは、この値を「1」と表示しても分かりにくいので、「左上」とか「top-left」などそれぞれの方法で表現しています。

Exif/RDFスキーマでも、従来はこうしたプロパティの値をリテラルとし、データの表現は利用者に委ねてきました。しかしこれは、人間にとってはそれなりに分かる方法ではあっても、コンピュータ処理には向きません。そこで今回、いくつか要望を受けたこともあって、これらの定義済みタグ値に全てURIを与え、とりうる値の集合をクラスとしてプロパティの値域を定義しました。また、純粋な数値も&xsd;integerなどのデータ型を与えるよう値域を加えています。

簡単なExifデータは、新しいスキーマでは次のように記述します。

(例)

<foaf:Image rdf:about="">
 <exif:make>Canon</exif:make>
 <exif:model>Canon IXY DIGITAL 30</exif:model>
 <exif:orientation rdf:resource="&exif;right-top"/>
 <exif:exif-info>
  <exif:Exif_IFD>
   <exif:exposureTime rdf:datatype="&xsd;decimal">0.0025</exif:exposureTime>
   <exif:fNumber rdf:datatype="&xsd;decimal">3.5</exif:fNumber>
   <exif:flash rdf:resource="&exif;Fired-compulsory-redeye"/>
   <exif:focalLength rdf:datatype="&xsd;decimal">9.1875</exif:focalLength>
  </exif:Exif_IFD>
 </exif:exif-info>
</foaf:Image>

ExifはIFDという構造を使ってデータをいくつかのブロックに分けて記録しますが、上のRDFはその構造を保っています。こうすると、露出時間やシャッタースピードなどは、画像そのものの直接のメタデータというより、「撮影状況」のメタデータとして間接的に表現されることになって具合がいいというメリットもあります(Exifのデータ構造は、必ずしも画像自身のデータとそれ以外をきれいに分けているわけではありませんが、自動処理を容易にするため、Exifの構造をそのまま使います)。

新しい語彙では、Exif処理アプリケーションが統制語彙URIを利用しやすいように、タグ番号とプロパティ名、値URIなどの関係を示したJSONファイルと、これを利用してRDFを抽出するPerlスクリプトを用意しています。抽出をオンラインで試してみるサービスも新しい語彙に対応しています。

これだけ大きな変更を加えると、以前のデータが新しいスキーマと整合性が取れなくなるため、名前空間URIを変えることが多いのですが、2つの理由で今回は名前空間をそのままにしようと考えています。

  • Exif/RDFはプログラムで画像から随時取り出すことが多く、整合性が取れなくなるファイルとしてのRDFデータはあまりなさそう
  • 旧スキーマは、W3Cに同一のコピーがあるので、必要ならその名前空間(http://www.w3.org/2003/12/exif/ns)を利用することができる

このスキーマを利用している方がいらっしゃったら、この変更にご注意を。現在、W3Cのsemantic-webメーリングリストに投稿して意見を募っていますが、特に反対がなければ、来週にもこの変更を確定させる予定です。何かご意見があれば、お知らせください。