RDFa 入門
ここでは Web ページにメタデータを記述する RDFa について簡単に説明します。
「メタデータ(metadeta)」というのは「情報に関する情報」といった程度の意味で,特に RDF/RDFa の場合は,検索エンジンなどの機械が理解可能な(machine-understandable)情報を記述することを目標にしています。
- まずは RDF から
- RDF から RDFa へ
- RDFa の基本的なルールと語彙
- Dublin Core Terms
- Friend of a Friend
- Creative Commons Rights Expression Language
- 付録: Open Graph
まずは RDF から
RDF(Resource Description Framework)は情報を「主語( subject)」,「述語(predicate)」,「目的語(object)」の3つに分類し,この3つ組(triple)の関係を使って情報を記述します。 例えば「私は猫が好きです」という文章は主語を「私」,述語を「好き」,目的語を「猫」と分類し,以下の関係で表すことができます。
更にもうひとつ「猫の名前はべるのです」という情報を加えてみましょう。
ここで「私は猫が好きです」の目的語である「猫」と「猫の名前はべるのです」の主語である「猫」が同一であるなら上の図のような関係になります。 人間であれば前後の文脈から2つの「猫」が同じものであると推測できますが,機械にはそれができません。 2つの「猫」が同じであるとするためには両者に同じ識別情報(identifier)を与える必要があります。 RDF ではこの識別情報に URI (Uniform Resource Identifier) を用います(URI は URL (Uniform Resource Locator) の拡張と考えていただければ概ね間違いないです)。 また URI によって一意に決まる情報を「リソース(resource)」と呼びます。
一方で,「べるの」という目的語はただの文字列で一意である必要がありません。 このようなデータを「リテラル・データ(literal data)」と呼びます。 リテラル・データは目的語には使えますが主語には使えません。 主語は必ずリソースである必要があります。
主語や目的語と同じく述語もまた URI で表現します。 従って「私は犬も好きです」と言うとき
「猫」に対する「好き」と「犬」に対する「好き」が同一であるとするなら,「私」と「猫」,「私」と「犬」との関係は「好き」という点において同じであると「理解」することができます。 これが machine-understandable であるということの意味です。
(RDF で使われる述語等のセットを語彙(vocabulary)といいます。 語彙は RDF Schema のルールに従えばだれでも定義することができます(語彙の定義に興味のある方はこちらのページをどうぞ)。 しかし通常は Dublin Core Terms などの汎用の語彙を使うべきです)
このように RDF では, Triple を用いてリソースをノードとした意味(semantic)の網(web)を構成していくのです。
RDF から RDFa へ
RDF は仕様としては良く出来ていましたが,主な形式である RDF/XML の記述が複雑なため使い勝手がイマイチなのと HTML に情報を埋め込む方法がなかったため(RSS(RDF Site Summary)など一部での利用を除いて)普及しているとは言えない状況です。
この状況を改善するために RDFa(Resource Description Framework in Attributes)が提案されました。
RDFa は Microformats からの fork と言えるもので, rel や property といった HTML 要素の属性を使い, RDF の語彙によって HTML 上の情報同士を関連付けていきます。
RDFa は2013年に W3C によってバージョン 1.1 が勧告(Recommendation)となりました。
- 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)
- RDFa Lite 1.1 (2012-06-07)
- RDFa 1.1 Primer - Second Edition (2013-08-22 Group Note)
RDFa の基本的なルールと語彙
RDFa で利用することのできる属性は以下のとおりです。
| RDF 要素 | 属性名 | 内容 |
|---|---|---|
| 主語 | about, src | 主語となるリソースを指示します |
| 述語 | rel, rev | 目的語がリソースである述語を指示します(rev は主語と目的語が反転します) |
property | 目的語がリテラル・データである述語を指示します | |
inlist | 目的語がコレクションになります(他の述語と組み合わせて使います) | |
| 目的語 | resource, href | 目的語となるリソースを指示します |
content | 目的語となるリテラル・データを記述します | |
| クラス | typeof | 主語または述語となるリソースのタイプを指示します |
| データタイプ | datatype | リテラル・データのデータタイプを指示します |
| 語彙 | prefix, vocab | 語彙を指示します |
語彙を追加するには主に prefix を用います。 prefix` は接頭辞(prefix)を指定することで複数の語彙を指示できます。
たとえば Dublin Core Terms および ccREL の語彙を追加する場合は以下のように記述します。
<html prefix='dc: http://purl.org/dc/terms/ cc: http://creativecommons.org/ns#'>
ただし, HTML5 では以下の語彙が組込み済みとなっているため,これらについて改めて指示する必要はありません。
bibo:http://purl.org/ontology/bibo/cc:http://creativecommons.org/ns#dbp:http://dbpedia.org/property/(Validator 等では認識しない?)dbp-owl:http://dbpedia.org/ontology/(Validator 等では認識しない?)dbr:http://dbpedia.org/resource/dc:http://purl.org/dc/terms/ex:http://example.org/foaf:http://xmlns.com/foaf/0.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#
主語・述語・目的語の Triple の指定は,以下のように行います。 たとえば,以下のテキストがあるとします。
アルベルト・アインシュタインについて
アルベルト・アインシュタインは1879年3月14日,ドイツ生まれの理論物理学者です。 彼による革命的な3つの論文
光電効果の理論ブラウン運動の理論特殊相対性理論が発表された1905年は奇跡の年と呼ばれています。
アインシュタインに関する記述ですね。 このテキストのマークアップは以下のとおりです。
<section id='AlbertEinstein'>
<h4>アルベルト・アインシュタインについて</h4>
<p>
アルベルト・アインシュタインは1879年3月14日,ドイツ生まれの理論物理学者です。
彼による革命的な3つの論文<q>光電効果の理論</q><q>ブラウン運動の理論</q><q>特殊相対性理論</q>が発表された1905年は<q><a href='http://www.einstein1905.info/einstein/1905.html'>奇跡の年</a></q>と呼ばれています。
</p>
</section>
これに名前・生年月日等のメタデータを加えます。 人物についての記述ですので FoaF および BIO 語彙が中心になります。
<section id='AlbertEinstein' about='#AlbertEinstein' prefix='bio: http://purl.org/vocab/bio/0.1/' typeof='foaf:Person'>
<h4>アルベルト・アインシュタインについて</h4>
<p property='bio:biography'>
<span property='foaf:name'>アルベルト・アインシュタイン</span>は<span id='birth' resource='#birth' rel='bio:birth' typeof='bio:Birth'><span property='dc:date' content='1879-03-14' datatype='xsd:date'>1879年3月14日</span></span>,<span property='bio:olb'>ドイツ生まれの理論物理学者</span>です。
彼による革命的な3つの論文<span id='docs' resource='#docs' rel='foaf:made' rev='foaf:maker' typeof='foaf:Document'><q property='dc:title'>光電効果の理論</q><q property='dc:title'>ブラウン運動の理論</q><q property='dc:title'>特殊相対性理論</q>が発表された<span property='dc:created' content='1905' datatype='xsd:date'>1905年</span>は<q><a href='http://www.einstein1905.info/einstein/1905.html' rel='dc:references'>奇跡の年</a></q></span>と呼ばれています。
</p>
</section>
ちょっとゴチャゴチャし過ぎちゃいましたかね。 関係を分かりやすくするために Distiller を使って RDF/XML に変換してみます。
<?xml version="1.0" encoding="utf-8"?>
<rdf:RDF
xmlns:foaf="http://xmlns.com/foaf/0.1/"
xmlns:bio="http://purl.org/vocab/bio/0.1/"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:dc="http://purl.org/dc/terms/"
>
<bio:Birth rdf:about="#birth">
<dc:date rdf:datatype="http://www.w3.org/2001/XMLSchema#date">1879-03-14</dc:date>
</bio:Birth>
<foaf:Person rdf:about="#AlbertEinstein">
<foaf:name>アルベルト・アインシュタイン</foaf:name>
<bio:olb>ドイツ生まれの理論物理学者</bio:olb>
<bio:biography>
アルベルト・アインシュタインは1879年3月14日,ドイツ生まれの理論物理学者です。
彼による革命的な3つの論文光電効果の理論ブラウン運動の理論特殊相対性理論が発表された1905年は奇跡の年と呼ばれています。
</bio:biography>
<bio:birth rdf:resource="#birth"/>
<foaf:made>
<foaf:Document rdf:about="#docs">
<dc:title>特殊相対性理論</dc:title>
<dc:title>ブラウン運動の理論</dc:title>
<dc:title>光電効果の理論</dc:title>
<dc:created rdf:datatype="http://www.w3.org/2001/XMLSchema#date">1905</dc:created>
<dc:references rdf:resource="http://www.einstein1905.info/einstein/1905.html"/>
<foaf:maker rdf:resource="#AlbertEinstein"/>
</foaf:Document>
</foaf:made>
</foaf:Person>
</rdf:RDF>
更にこれを RDF のグラフで表すと以下のようになります。 (図のクリックで拡大されます)
RDFa と RDF/XML の記述を見比べるといくつかわかることがあります。
まず,全体の主語は #AlbertEinstein で,主語を指示している <section> 要素の子要素が全て #AlbertEinstein に対する目的語になっています。
このように, RDFa では HTML 要素の親子関係から主語と目的語を推測します。
明示的な主語が見つからない場合にはページそのもの(の URI)が主語となります。
次に #docs に注目してみます。
#docs は #AlbertEinstein の目的語ですが(述語は foaf:made),同時に #docs を含む <span> 要素の子要素の主語にもなっています(#docs 自体は resource 属性で指示されている点に注目して下さい)。
RDFa では,リソースは about や resource といったHTML 要素の属性を使って主語か目的語かを指示するのですが,絶対的なものではなく, HTML 要素の親子関係によって主語と目的語が反転する場合があります。
他の例でいくと,以下のようなテキストの場合,
<div id='AlbertEinstein' about='#AlbertEinstein' typeof='foaf:Person' rel='foaf:made'>
<ul>
<li id='doc1' about='#doc1' typeof='foaf:Document'><span property='dc:title'>ブラウン運動の理論</span></li>
<li id='doc2' about='#doc2' typeof='foaf:Document'><span property='dc:title'>光電効果の理論</span></li>
<li id='doc3' about='#doc3' typeof='foaf:Document'><span property='dc:title'>特殊相対性理論</span></li>
</ul>
</div>
RDF/XML に変換するとこのようになります。
<?xml version="1.0" encoding="utf-8"?>
<rdf:RDF
xmlns:foaf="http://xmlns.com/foaf/0.1/"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:dc="http://purl.org/dc/terms/"
>
<foaf:Person rdf:about="#AlbertEinstein">
<foaf:made>
<foaf:Document rdf:about="#doc1">
<dc:title>ブラウン運動の理論</dc:title>
</foaf:Document>
</foaf:made>
<foaf:made>
<foaf:Document rdf:about="#doc2">
<dc:title>光電効果の理論</dc:title>
</foaf:Document>
</foaf:made>
<foaf:made>
<foaf:Document rdf:about="#doc3">
<dc:title>特殊相対性理論</dc:title>
</foaf:Document>
</foaf:made>
</foaf:Person>
</rdf:RDF>
(about 属性で指示している #doc1 ~ #doc3 が #AlbertEinstein の目的語になっているのがわかると思います)
目的語がリテラル・データの場合,通常は HTML 要素で囲まれた内容がリテラル・データとなりますが, content 属性があると content の内容が優先されます。
たとえば
<span id='birth' resource='#birth' rel='bio:birth' typeof='bio:Birth'><span property='dc:date' content='1879-03-14' datatype='xsd:date'>1879年3月14日</span></span>
の記述部分では, dc:date の目的語は 1879年3月14日 ではなく 1879-03-14 となります(RDF/XML の記述を参照してみてください)。
何故このようなことをするかというと, 1879年3月14日 では機械が日付として解釈できないからです。
このため機械が解釈可能な W3C Date and Time Formats(今回の例では 1879-03-14)で上書きしているのです。
HTML の内容と解離するようなものはダメですが,機械可読な状態に「翻訳」するのであれば,この方法は有効です。
さて,基本的なルールについては以上です。 ここからは Web 上でよく使われる語彙について解説していきます。
Dublin Core Terms
DCMI (Dublin Core Metadata Initiative) が管理・運用している語彙のセットを “Dublin Core Terms” といいます1。
Dublin Core Terms は15の基本要素(http://purl.org/dc/elements/1.1/)を再定義したものと,その拡張語彙から構成されています。
以下に Dublin Core Terms の一覧を示します。
| dcterms: | subPropertyOf | domain | range |
|---|---|---|---|
| contributor | dc:contributor | rdfs:Resource | dcterms:Agent |
| creator | dc:creator, dcterms:contributor | rdfs:Resource | dcterms:Agent |
| coverage | dc:coverage | rdfs:Resource | dcterms:LocationPeriodOrJurisdiction |
| spatial | dc:coverage, dcterms:coverage | rdfs:Resource | dcterms:Location |
| temporal | dc:coverage, dcterms:coverage | rdfs:Resource | dcterms:PeriodOfTime |
| date | dc:date | rdfs:Resource | rdfs:Literal |
| available | dc:date, dcterms:date | rdfs:Resource | rdfs:Literal |
| created | dc:date, dcterms:date | rdfs:Resource | rdfs:Literal |
| dateAccepted | dc:date, dcterms:date | rdfs:Resource | rdfs:Literal |
| dateCopyrighted | dc:date, dcterms:date | rdfs:Resource | rdfs:Literal |
| dateSubmitted | dc:date, dcterms:date | rdfs:Resource | rdfs:Literal |
| issued | dc:date, dcterms:date | rdfs:Resource | rdfs:Literal |
| modified | dc:date, dcterms:date | rdfs:Resource | rdfs:Literal |
| valid | dc:date, dcterms:date | rdfs:Resource | rdfs:Literal |
| description | dc:description | rdfs:Resource | rdfs:Resource |
| abstract | dc:description, dcterms:description | rdfs:Resource | rdfs:Resource |
| tableOfContents | dc:description, dcterms:description | rdfs:Resource | rdfs:Resource |
| format | dc:format | rdfs:Resource | dcterms:MediaTypeOrExtent |
| extent | dc:format, dcterms:format | rdfs:Resource | dcterms:SizeOrDuration |
| medium | dc:format, dcterms:format | dcterms:PhysicalResource | dcterms:PhysicalMedium |
| identifier | dc:identifier | rdfs:Resource | rdfs:Literal |
| bibliographicCitation | dc:identifier, dcterms:identifier | dcterms:BibliographicResource | rdfs:Literal |
| language | dc:language | rdfs:Resource | dcterms:LinguisticSystem |
| publisher | dc:publisher | rdfs:Resource | dcterms:Agent |
| relation | dc:relation | rdfs:Resource | rdfs:Resource |
| source | dc:source, dcterms:relation | rdfs:Resource | rdfs:Resource |
| conformsTo | dc:relation, dcterms:relation | rdfs:Resource | dcterms:Standard |
| hasFormat | dc:relation, dcterms:relation | rdfs:Resource | rdfs:Resource |
| hasPart | dc:relation, dcterms:relation | rdfs:Resource | rdfs:Resource |
| hasVersion | dc:relation, dcterms:relation | rdfs:Resource | rdfs:Resource |
| isFormatOf | dc:relation, dcterms:relation | rdfs:Resource | rdfs:Resource |
| isPartOf | dc:relation, dcterms:relation | rdfs:Resource | rdfs:Resource |
| isReferencedBy | dc:relation, dcterms:relation | rdfs:Resource | rdfs:Resource |
| isReplacedBy | dc:relation, dcterms:relation | rdfs:Resource | rdfs:Resource |
| isRequiredBy | dc:relation, dcterms:relation | rdfs:Resource | rdfs:Resource |
| isVersionOf | dc:relation, dcterms:relation | rdfs:Resource | rdfs:Resource |
| references | dc:relation, dcterms:relation | rdfs:Resource | rdfs:Resource |
| replaces | dc:relation, dcterms:relation | rdfs:Resource | rdfs:Resource |
| requires | dc:relation, dcterms:relation | rdfs:Resource | rdfs:Resource |
| rights | dc:rights | rdfs:Resource | dcterms:RightsStatement |
| accessRights | dc:rights, dcterms:rights | rdfs:Resource | dcterms:RightsStatement |
| license | dc:rights, dcterms:rights | rdfs:Resource | dcterms:LicenseDocument |
| subject | dc:subject | rdfs:Resource | rdfs:Resource |
| title | dc:title | rdfs:Resource | rdfs:Literal |
| alternative | dc:title, dcterms:title | rdfs:Resource | rdfs:Literal |
| type | dc:type | rdfs:Resource | rdfs:Class |
| audience | rdfs:Resource | dcterms:AgentClass | |
| educationLevel | dcterms:audience | rdfs:Resource | dcterms:AgentClass |
| mediator | dcterms:audience | rdfs:Resource | dcterms:AgentClass |
| accrualMethod | dcmitype:Collection | dcterms:MethodOfAccrual | |
| accrualPeriodicity | dcmitype:Collection | dcterms:Frequency | |
| accrualPolicy | dcmitype:Collection | dcterms:Policy | |
| instructionalMethod | rdfs:Resource | dcterms:MethodOfInstruction | |
| provenance | rdfs:Resource | dcterms:ProvenanceStatement | |
| rightsHolder | rdfs:Resource | dcterms:Agent |
(via
DCプロパティと定義域、値域一覧licensed (and guideline) by KANZAKI, Masahide, 2008-2010)
この表では包含関係を明確にするため接頭辞を
として再定義しています。
dc: と同じ名前で dcterms: で再定義された述語は強調して表示しています。
domain は主語として使えるリソースの種類を, range は目的語として使えるリソースの種類(またはリテラル・データ)を示しています。
またリソースのタイプを示すクラスとしては以下のものが用意されています。
| クラス | 説明 |
|---|---|
| dc:Collection | リソースのコレクション |
| dc:Dataset | データベースなどの符号化されたデータ構造 |
| dc:Event | 時間に基づいた非永続的な事象 |
| dc:Image | 写真,絵画,映画,地図,音楽記号などの象徴的な視覚表現 |
| dc:InteractiveResource | 対話的なリソース。 Web ページのフォームやチャットなど |
| dc:MovingImage | アニメーション,映画,テレビ番組,ビデオなどの動画。 dc:Image のサブクラス |
| dc:PhysicalObject | 彫刻などの実体,あるいは3次元オブジェクト。これらの映像表現は dc:Image クラスなどに分類される |
| dc:Service | サービス。銀行サービスなどオンラインでないものも含まれる |
| dc:Software | ソフトウェアのソースコードまたはバイナリ |
| dc:Sound | 音楽ファイル,CD,スピーチなど音声表現 |
| dc:StillImage | 絵画,グラフィックデザイン,地図,図案などの静止画像。 dc:Image のサブクラス |
| dc:Text | 書籍,手紙,論文,詩,新聞など語(words)による表現。画像データでも文字表現が主なものであればこのクラスに分類される |
Friend of a Friend
FoaF (Friend of a Friend) は知人・友人のネットワークを記述するための語彙です。 また(自分を含む)人物の Profile 情報を記述するためにも使えます2。
まずFoaF の基本クラス(主語または述語となるリソースのタイプ)は以下のとおりです。
| クラス | 説明 |
|---|---|
| foaf:Agent | エージェント(人間,グループ,ソフトウェア,人工物など) |
| foaf:Person | 人物。実存するかどうかは問わない。 foaf:Agent のサブクラス |
| foaf:Organization | 会社,組織など。 foaf:Agent のサブクラス |
| foaf:Group | 個々の foaf:Agent の集合体としてのグループ。 foaf:Agent のサブクラス |
| foaf:Project | プロジェクト。公式・非公式を問わない |
| foaf:Document | (広い意味での)文書。映像作品や Web ページなども含まれる |
| foaf:Image | 映像。 foaf:Document のサブクラス |
| foaf:PersonalProfileDocument | 人物について記述された RDF 文書 |
このうち foaf:Agent クラスに関する述語について主なものを挙げます。
| 述語 | domain | range | 説明 |
|---|---|---|---|
| foaf:mbox | foaf:Agent | owl:Thing | mailto: から始まるメールアドレスの URI。識別子(identifier)として機能する |
| foaf:mbox_sha1sum | foaf:Agent | rdfs:Literal | foaf:mbox の SHA1 ハッシュ値。 foaf:mbox を示さなくても,この値を識別子として使うことができる |
| foaf:name | owl:Thing | rdfs:Literal | 名前(人とは限らない) |
| foaf:givenName | — | — | 姓名の「名」 |
| foaf:familyName | foaf:Person | rdfs:Literal | 姓名の「姓」 |
| foaf:nick | — | — | ニックネーム |
| foaf:depiction | owl:Thing | foaf:Image | 対象を描いた絵や写真など |
| foaf:birthday | foaf:Agent | rdfs:Literal | 誕生日 |
| foaf:schoolHomepage | foaf:Person | foaf:Document | 対象の人物の母校 |
| foaf:workplaceHomepage | foaf:Person | foaf:Document | 対象の人物の勤務先 |
| foaf:workInfoHomepage | foaf:Person | foaf:Document | 対象の人物の仕事内容 |
| foaf:knows | foaf:Person | foaf:Person | 知人(相互に知り合ってるレベル) |
| foaf:homepage | owl:Thing | foaf:Document | ホームページ |
| foaf:weblog | foaf:Agent | foaf:Document | ウェブログ |
| foaf:tipjar | foaf:Agent | foaf:Document | 対象への支払いや寄付の方法を記述したページ。 Flattr にも使える? |
| foaf:interest | foaf:Agent | foaf:Document | 関心を持ってる事に関するページ |
| foaf:topic_interest | foaf:Agent | owl:Thing | 関心を持ってるトピック |
| foaf:publications | foaf:Person | foaf:Document | 対象の人物の出版物 |
| foaf:made | foaf:Person | owl:Thing | 対象の人物の作品 |
| foaf:currentProject | foaf:Person | owl:Thing | 対象の人物が現在手がけているプロジェクト |
| foaf:pastProject | foaf:Person | owl:Thing | 対象の人物が過去に手がけてたプロジェクト |
また foaf:Agent で記述される作品やプロジェクト等に関する述語(上記以外)も挙げておきます。
| 述語 | domain | range | 説明 |
|---|---|---|---|
| foaf:page | owl:Thing | foaf:Document | ページ |
| foaf:topic | foaf:Document | owl:Thing | ページに関するトピック。 foaf:page の逆 |
| foaf:primaryTopic | foaf:Document | owl:Thing | 主語ページ・文書のメイントピック |
| foaf:isPrimaryTopicOf | owl:Thing | foaf:Document | 目的語ページ・文書のメイントピック。 foaf:primaryTopic の逆で foaf:page のサブプロパティ |
| foaf:maker | owl:Thing | foaf:Agent | 主語を作った人。 foaf:made の逆 |
| foaf:logo | owl:Thing | owl:Thing | ロゴ |
| foaf:depicts | foaf:Image | owl:Thing | 映像が描写している対象。 foaf:depiction の逆 |
| foaf:thumbnail | foaf:Image | foaf:Image | 映像のサムネイル |
foaf:maker は Dublin Core Terms の dc:creator と被りますが, foaf:maker のほうが構造化リソースとしての作者を記述することができます。
FoaF にはオンラインサービスのアカウントに関する語彙もあります。 以下にオンラインサービスのアカウントに関するクラスと述語を挙げます。
| クラス | 説明 |
|---|---|
| foaf:OnlineAccount | オンラインサービスのアカウント |
| foaf:OnlineGamingAccount | オンラインゲームのアカウント。 foaf:OnlineAccount のサブクラス |
| foaf:OnlineEcommerceAccount | オンラインショップ等のアカウント。foaf:OnlineAccount のサブクラス |
| foaf:OnlineChatAccount | チャットやメッセージング・サービスのアカウント。 foaf:OnlineAccount のサブクラス |
| 述語 | domain | range | 説明 |
|---|---|---|---|
| foaf:account | foaf:Agent | foaf:OnlineAccount | オンラインサービスのアカウント |
| foaf:accountServiceHomepage | foaf:OnlineAccount | foaf:Document | オンラインサービスのホームページ |
| foaf:accountName | foaf:OnlineAccount | rdfs:Literal | オンラインサービスのアカウント名(識別子) |
Creative Commons Rights Expression Language
ccREL (Creative Commons Rights Expression Language) は Web 上の作品の著作権情報を記述するための語彙です。 Creative Commons License 3.0 を念頭に設計されていますが,他の(自由な)著作権ライセンスや利用ガイドラインにも対応しています。
ccREL の語彙は「著作権ライセンスを記述する」語彙と「著作権ライセンスを表示する」語彙とに分かれます。 以下は ccREL の基本クラス(主語または述語となるリソースのタイプ)です。
| クラス | 説明 |
|---|---|
| cc:Work | 作品 |
| cc:License | ライセンス。 dc:LicenseDocument のサブクラス |
| cc:Jurisdiction | 準拠法 |
| cc:Permission | ライセンスにおける許諾事項 |
| cc:Requirement | ライセンスにおける要求(条件)事項 |
| cc:Prohibition | ライセンスにおける禁止事項 |
このうち「著作権ライセンスを表示する」語彙である cc:Work に関する述語を挙げてみます。
| 述語 | domain | range | 説明 |
|---|---|---|---|
| cc:license | cc:Work | cc:License | ライセンス |
| cc:morePermissions | cc:Work | rdfs:Resource | (cc:license 以外の)追加の許諾 |
| cc:useGuidelines | cc:Work | rdfs:Resource | 利用ガイドライン |
| cc:attributionURL | cc:Work | rdfs:Resource | 著作(権)者 |
| cc:attributionName | cc:Work | rdfs:Literal | 著作(権)者名 |
明確な「利用許諾(license)」がない場合,またはライセンスに対して付加情報(免責事項など)がある場合には cc:useGuidelines を使います。
また,ライセンスに対して追加の許諾がある場合(ライセンスとしては by-nc だけど条件によっては個別に商用利用も許可するなど)には cc:morePermissions を使います。
作品の著作権は著作者に自動的に付与されますが,権利自体は譲渡可能なため(譲渡できない権利もあります),著作者と著作権者が異なる場合があります。
その場合は cc:attributionURL や cc:attributionName で権利の帰属先を明示します。
著作者と著作権者が同一であるなら foaf:maker 等で置き換えることもできます3。
RDFa であれば主語を明示することでページ内のテキスト,映像,音声等に対して個別に権利表示を行うことができます。 たとえば先程の「dcterms: の述語一覧」の表は「DCプロパティと定義域、値域一覧」のものを流用していますが,以下のように記述しています。
<figure id='dct-list' about='#dct-list' typeof='dc:Text'>
<table>
[...]
</table>
<figcaption><span property='dc:title'>dcterms: の述語一覧</span>(via <q><a href="http://www.kanzaki.com/docs/sw/dc-domain-range.html" rel='dc:source'><span property='dc:title'>DCプロパティと定義域、値域一覧</span></a></q> <span about="http://www.kanzaki.com/docs/sw/dc-domain-range.html"><a href="http://www.kanzaki.com/info/ccl#NoOnlineDistribution" rel='cc:license'>licensed</a> (and <a href="http://www.kanzaki.com/info/disclaimer" rel='cc:useGuidelines'>guideline</a>) by <a href="http://www.kanzaki.com/info/who" rel='foaf:maker' typeof='foaf:Person'><span property='foaf:name'>KANZAKI, Masahide</span></a>, <span property='dc:dateCopyrighted' datatype='xsd:date'>2008</span>-<span property='dc:modified' datatype='xsd:date'>2010</span></span>)</figcaption>
</figure>
これを RDF Graph にすると以下のようになり,元になった Web ページを指し示しているのがわかると思います。 (図のクリックで拡大されます)
Creative Commons License では提示される内容が「コモンズ証(Commons Deed)」「法的条項(Legal Code)」「メタデータ(Metadata)」の3つのレイヤに分かれていて,そのうちメタデータのレイヤを RDF で実装しています。 たとえば「表示-継承(by-sa)」ライセンスの場合は各レイヤの URI は以下のようになっています。
- コモンズ証: http://creativecommons.org/licenses/by-sa/4.0/
- 法的条項: http://creativecommons.org/licenses/by-sa/4.0/legalcode
- メタデータ: http://creativecommons.org/licenses/by-sa/4.0/rdf
実際にはコモンズ証にも RDFa 付与がされていますが,明示的にメタデータへ誘導するのなら,このページのフッタ部のように記述するのがいいかもしれません。
Licensed under <a href='http://creativecommons.org/licenses/by/4.0/' rel='cc:license' typeof='cc:License'><span resource='http://creativecommons.org/licenses/by/4.0/rdf' rel='dc:relation'><img src='/images/cc/by.s.png' alt='Attribution License' height='12'></span></a>
Creative Commons License について詳しくは「CC Licenses について」を参照して下さい4。
付録: Open Graph
Open Graph Protocol はもともと Facebook で提案されたもので, RFDa のような体裁をとっていますが(Validator でチェックしてもエラーにはなりません),似て非なるものです。 Open Graph は以下のような関係を想定しています。
- The actor : 行動をおこすユーザ
- The app : 行動をおこすためのアプリケーション
- The action : 行動
- The object : 行動の対象となる「もの」
つまり Open Graph の記述は The App からみれば制御情報に過ぎず, Open Graph 自体は意味を構成していません。 そして,当然ながら Facebook 以外のサービスには使いづらいため Twitter Card の登場に加え mixi や GREE も OGP に独自の仕様を混ぜています。 もはやこれは「濫用」と呼ぶべき状況かもしれません。
Open Graph が RDFa と異なる点は以下のとおりです。
<head>要素内の<meta>要素にしか記述できない。他は全て無視される- したがってページ全体に関する記述しかできず,ページ内の構造を記述できない。また他の語彙とも組み合わせられない
- 記述を
<meta>要素に限定しているためリテラル・データしか扱えない - リテラル・データの
datatypeは Open Graph で用意されているものを使わなければならない
Open Graph を設置する際は以上の点に気をつけて下さい。 具体的な設定方法については割愛します(SEO 関連のサイトを探せば大抵設定方法が載っています)。
ブックマーク
- メタ情報とセマンティック・ウェブ(私は最初にここで RDF を勉強しました)
- RDFa 入門(Introduction to RDFa)(ちょっと古いですが RDFa の記述方法について包括的に書かれていて参考になります)
- The W3C Markup Validation Service(記述が正しいか常にチェックしましょう)
- RDFa 1.1 Validator(記述が正しいか常にチェックしましょう)
- MicroformatsとRDFaのhReviewを比較 | kots blog
- First steps in RDFa: Creating a FOAF profile
- CC REL - CC Wiki
- RDFa関連の3仕様が勧告に!その時Microdataは……? | HTML5Experts.jp
参考図書
- セマンティック HTML/XHTML
- 神崎 正英
- 毎日コミュニケーションズ 2009-05-28
- Book 単行本(ソフトカバー)
- ASIN: 483993195X, EAN: 9784839931957
- 評価
残念ながら紙の本は実質的に絶版なんですよねぇ。是非デジタル化を希望します。
reviewed by Spiegel on 2014-08-17 (powered by amazon-item 0.2.1)
- HTML5 スタンダード・デザインガイド~Webサイト制作者のためのビジュアル・リファレンス&セマンティクスによるコンテンツデザインガイド~ [リフロー版]
- エ・ビスコム・テック・ラボ
- マイナビ出版 2013-02-14 (Release 2013-02-14)
- eBooks Kindle版
- ASIN: B00CZ711QS
- 評価
最初に HTML5 の基礎的な知識を仕入れるにはちょうどよかったが,今では古い内容。
reviewed by Spiegel on 2014-08-17 (powered by amazon-item 0.2.1)
-
Dublin Core の名前は1995年3月に米国オハイオ州のダブリン(Dublin)で開催された OCLC/NCSA Metadata Workshop での討議結果を “Dublin Core Metadata” と呼んだところに由来しているそうです。 ↩︎
-
最近は後者の利用が多いような気がします。後述する Open Graph なんかよりこちらのほうが断然 COOL なのですが(Open Graph より FoaF のほうが先なんですよ),サポートするサービス・プロバイダが皆無なため SEO(Search Engine Optimization)的には不利と言えます。 ↩︎
-
「製作委員会」方式などで権利を集約している場合や(独占契約を結ぶ代わりに)出版社および権利管理団体に権利を譲渡する場合は権利の帰属先が変わります。著作権ライセンスの場合は「誰が作ったか」よりも「誰に権利があるか」のほうが重要なので権利の帰属先を明記することは重要です。もちろん(たとえ著作者であっても)権利のない人が勝手にライセンスを設定することはできません。 ↩︎
-
Creative Commons License のメタデータはかなり不遇な経緯をたどっています。というより, RDF 自体が不遇なのかもしれませんが。最初の Creative Commons License が登場した2002年当時は RDF をまともに解釈できる parser がありませんでした。その後, Creative Commons License については mozCC のようなツールも登場しますが, mozCC はどういうわけかコメントアウトされた RDF 情報しか読まず,他のツールも似たり寄ったりの状況です。さらに Microformats の rel-license も登場しますが,これも URL からあらかじめ持ってる知識でライセンスの種類を推測するだけの実装がほとんどで「意味を理解する」という RDF の目標からは遠いものです。近年 RDFa やその語彙である ccREL が整備されてきましたが,果たしてどうなるでしょうか。 ↩︎

