先週、上海で開かれていたDC2004でDCMIのAdvisory Board会議に出席していたDan Brickleyから、dc:creatorなどの目的語はリテラルなのか、あるいはオブジェクトノードなのかという問題についての面白いレポートDublin Core "RDF idiom conversion rules" in SPARQLが。内容がリテラルであっても、オブジェクトであっても、どちらにも変換できるような一定のルールを定めておき、たとえばSPARQLの機能を利用して、対応するトリプルをつくってしまえばいいという話だ。
dc:creatorをはじめとするDublin Coreのプロパティは、シンプルで応用が利くことを重視しているので、(敢えて)値域が定められていない。そのため、あるリソースの作者を記述するときに、
[例1]
<rdf:Description rdf:about="http://www.kanzaki.com"> <dc:creator>Masahide Kanzaki</dc:creator> </rdf:Description>
という方法と、
[例2]
<rdf:Description rdf:about="http://www.kanzaki.com"> <dc:creator> <foaf:Person> <foaf:name>Masahide Kanzaki</foaf:name> </foaf:Person> </dc:creator> </rdf:Description>
という方法が混在して用いられてきた。定義としては、どちらでもいいわけだが、そうするとアプリケーションにとってはいろいろ面倒な処理が必要になり、あまり具合がよろしくない。
DanBriのメモは、DCコミュニティ界隈で、次の2つのルールについての合意ができつつあると述べている(What I try to do below is capture DC community concensus about how the two styles of using properties from the http://purl.org/dc/elements/1.1/ vocabulary compare.
)。
- DCプロパティ p がオブジェクトリソース 'o' を値として持ち、その 'o' が rdfs:label プロパティの値 v を持っている場合は、v は p の値でもあるとみなす:
{s p o. o rdfs:label v.} => {s p v.}
- DCプロパティ p がリテラル値 'l' を持つ場合、主語リソースはこれとは別にあるオブジェクトリソース 'y' を p の目的語として持ち、その 'y' は rdfs:labelの値として 'l' を持つとみなす:
{s p l.} => {s p y. y rdfs:label l.}
最初のルールは、次のグラフがある場合は、例1のグラフも存在するとみなすというもの。
[例3]
<rdf:Description rdf:about="http://www.kanzaki.com"> <dc:creator> <rdf:Description> <rdfs:label>Masahide Kanzaki</rdfs:label> </rdf:Description> </dc:creator> </rdf:Description>
2番目のルールは、逆に例1のグラフから例3を導くというわけだ。
そうすると、例2のようにfoaf:nameを使っているのは、rdfs:labelに改めるべきなのか、あるいはrdfs:labelも併記するのかという疑問が湧くが、faof:nameはrdfs:labelのサブプロパティなので、このままでよいとのこと。つまりルール1は、「rdfs:labelもしくはそのサブプロパティの値 v」と読むことになり、これでめでたく例2からも例1が導かれる。
DanBriのメモは、さらにSPRQLのCONSTRUCTという演算子を使って、グラフパターンから上記の結果を導くルールを記述しようと試みている。この方法は、まだ未確定の要素も多いので、メモの通りになるかどかは分からないが、RDFのクエリや推論の考え方の例として読んでみると面白いだろう。
これと関連して、rdfweb-devメーリングリストには、Evaluating FOAF against Dublin Core Agent WG's draft Functional Requirementsというメッセージが投稿されていて、そこでDanBriはDCの使い方にまつわるもうひとつの問題点の動向についてもコメントしている。
At the Architecture-WG meeting there seemed to be some enthusiasm for not allowing rdf:Seq, rdf:Bag, rdf:Alt constructs to be used with dc:creator etc., which'd simplify things a bit.
DCプロパティの値が複数あるとき、それをコンテナモデルを使って書くのではなく、プロパティを列挙する形にしようということ。たとえば、著者が複数いる場合、
[例4]
<rdf:Description rdf:about="urn:isbn:..."> <dc:creator> <rdf:Bag> <rdf:li>神崎正英</rdf:li> <rdf:li>Dan Brickley</rdf:li> </rdf:Bag> </dc:creator> </rdf:Description>
とするのではなく、次のようにdc:creatorを列挙するわけだ。
[例5]
<rdf:Description rdf:about="urn:isbn:..."> <dc:creator>神崎正英</dc:creator> <dc:creator>Dan Brickley</dc:creator> </rdf:Description>
これも以前からどっちがいいのか分かりにくかった点だが、some enthusiasm for not allowing rdf:Seq, rdf:Bag, rdf:Alt constructs
ということなら、すっきりと例5の形を使うと考えておいてよさそうだ。
しかし、本が出る前から、本の補遺を書いてるみたいな感じだな…
- FOAFスキーマ更新 - 'Pages about Things' Edition (2005-07-28)
- Dublin CoreのRDFモデル新仕様案 (2006-06-04)