Metadata と RDFa と ccREL
Web ページに cc-license のメタデータを指示するために RDFa をお勉強中。 以下は覚え書きのために残しておく。
HTML5 下でメタデータを埋め込むまたは指示する仕組みとしては Microdata と RDFa が有力っぽい。
(Microformats はよく分からないけど,あれってもう死んでるんじゃないのかなぁ(とはいえ RDFa は Microformats からの fork なんだけど。まぁ Trunk が潰れて Branch のみが生き残るってのはよく聞く話だし。それも進化の多様性のあり方じゃよ,フォッフォッフォッ)。 以前も思ったけど, Microformats は何がしたいのかさっぱりわからない。 たぶん基盤(infrastructure)がないせいだと思う。 メタデータってのは語彙(vocabulary)をいかに制御するかが肝で,たとえ「知らない語彙」でも合理的に扱えるようになっていなければならない。 何故ならメタデータを解釈(parse)する「機械」は何も知らない(ところから始める)のだから。 それが Machine-Readable であるということだ)
Microdata と RDFa の最大の違いは DOM の要素として制御できるかどうかで,その点では最後発の Microdata がもっとも有利といえる。 RDF/RDFa は意味(semantics)を解釈するための独自の parser が必要で, DOM つまり JavaScript 等で制御可能な Microdata のほうが将来性が見込める。
とはいえ Microdata の JavaScript 実装は進んでないみたい。
どうなるのかなぁ。 もったいない気がするんだけど。
というわけで,今回は RDFa で行きます。
RDFa の基礎
まず W3C のドキュメントから
- RDFa Lite 1.1 (2012-06-07)
- RDFa Core 1.1 - Second Edition (2013-08-22)
- XHTML+RDFa 1.1 - Second Edition (2013-08-22)
- HTML+RDFa 1.1 (2013-08-22)
で,これだとちょっと分かりにくいので以下を参照するとよい。
RDF では主語・述語・目的語の Triple を構成する。 実は主語と目的語は等価な resource で,つまり resource 同士を(述語を使って)つなぎ合わせてネットワーク(というか Web)にしていくことで意味(semantics)を形成する。 これが RDF の本質的な機能である。 だから RDF/RDFa では常に主語はなにか,述語はなにか,目的語はなにか,を意識していくとよい(という説明をちゃんとしているページを殆ど見かけないのだが,みんなどうしてるんだろう)。 ちなみに resource には URI を指定する。 またリテラルデータ(タイトルとか名前とか)は目的語にしか使えない。
ただし,自前で間違えずに RDFa の Triple を作るのは結構難しいので,以下の Validator の助けを借りることをお薦めする。
なんで2つも Validate しないといけないかというと HTML5 的には OK でも RDFa 的には NG だったり,またその逆もあったりして結構面倒なのだ。 この辺は慣れていくしかない,トホホ。
RDFa の語彙
RDFa 1,1 以降では語彙の指定を prefix 属性を使って行う。
<html prefix='dc: http://purl.org/dc/terms/ cc: http://creativecommons.org/ns#'>
これで Dublin Core の語彙が dc:
プレフィクスに, ccREL の語彙が cc:
プレフィクスに割り当てられる。
ただし以下の語彙については組み込み済みなので prefix 指定なしで使うことができる。
bibo:
http://purl.org/ontology/bibo/cc:
http://creativecommons.org/ns#dbp:
http://dbpedia.org/property/dbp-owl:
http://dbpedia.org/ontology/dbr:
http://dbpedia.org/resource/dc:
http://purl.org/dc/terms/ex:
http://example.org/foaf:
http://xmlns.com/foaf/0.1/og:
http://ogp.me/ns# (RDFa Core 1.1 のドキュメントにはなかったけど使えた)owl:
http://www.w3.org/2002/07/owl#rdf:
http://www.w3.org/1999/02/22-rdf-syntax-ns#rdfa:
http://www.w3.org/ns/rdfa#rdfs:
http://www.w3.org/2000/01/rdf-schema#xhv:
http://www.w3.org/1999/xhtml/vocab#xsd:
http://www.w3.org/2001/XMLSchema#
まぁ dc:
cc:
og:
foaf:
といったメジャーどころは組み込み済みなので,自前で語彙を作らない限り, prefix のお世話になることはほぼないだろう。
cc-license のメタデータを指示する
これで準備はできたので,早速 cc-license のメタデータを指示してみる。 cc-license のメタデータを指示するには Dublin Core と ccREL(Creative Commons Rights Expression Language) の語彙を使う。
(ちなみに Creative Commons のサイトでは選択したライセンスのメタデータを吐いてくれるツールがあるが,あれをそのまま貼り付けると Validator に怒られる,困ったことに)
使うプロパティは以下のとおり。
- dc:title : 作品のタイトル
- dc:dateCopyrighted : 公表日
- dc:source : 元になった作品(URL) 二次的著作物の場合
- cc:attributionName : 著作(権)者名
- cc:attributionURL : 著作(権)者の URL
- cc:license : ライセンス(URL)
- cc:morePermissions : 追加許可(URL)
- cc:useGuidelines : ガイドライン(URL)
実際には以下のように使う。
<div class='copyright' about='cc-license.shtml'> Written and revised by <a href='#me' rel='cc:attributionURL' property='cc:attributionName'>Yasuhiro (Spiegel) ARAKAWA</a> on <span property="dc:dateCopyrighted">Sunday, 03-Aug-2014 21:11:27 JST</span>,<br> Licensed under <&span rel='cc:license' resource='http://creativecommons.org/licenses/by/4.0/rdf'gt;<a property='cc:license' href='http://creativecommons.org/licenses/by/4.0/'><img src='/images/cc/by.s.png' alt='Attribution License' height='12'></a> and <a href='/cc-license.shtml#morePermissions' rel='cc:morePermissions'>more permissions</a></span>. </div>
述語が全て property 属性で指定されている点に注意。
ライセンスを指示する a 要素の場合は rel 属性のほうが正しい気がするが(実際 RDFa Validator は OK なんだけど), HTML5 Validator のほうが NG を吐く。
理由は不明。
これを RDFa Validator にかけると Turtle フォーマットで以下の情報を吐いてくれる。
@prefix cc: <http://creativecommons.org/ns#> . @prefix dc: <http://purl.org/dc/terms/> .</cc-license.shtml> cc:attributionName "Yasuhiro (Spiegel) Arakawa"@ja; cc:attributionURL </cc-license.shtml#me>; cc:license <http://creativecommons.org/licenses/by/4.0/rdf>; cc:morePermissions </cc-license.shtml#morePermissions>; dc:dateCopyrighted "Sunday, 03-Aug-2014 21:16:13 JST"@ja; dc:title "クリエイティブ・コモンズ・ライセンスについて"@ja .
ま,まぁ,正しく解釈してるみたいなんでいいのかな?
RDFa の仕様はかなり parser 任せな部分があるように感じる。 属性の指定さえ間違えなければ parser 側で勝手に解釈して主語や目的語を推定してくれる。 そもそも HTML5 の仕様からしてかなり ad hoc な感じだしなぁ。 まぁいいや。 今日はここまで。