本当は、"JSON-LDとXML"というタイトルにしようと思ったが、XMLは語るにはあまりに広い世界で恐ろしいし、詳しい先生方が多い領域なので、JSON-LD だけを書くことにした、そんなエントリーです。
(もっとも、Linked Data 初心者であることは確かですので、誤りが有れば、ご指摘下さい)
追記 2014/08/27:
メトロのオープンデータ活用コンテストが、JSON-LDなのに気をよくして、配列について追記しました。
みんな大好きJSON ですが、JSONでは、複雑なデータを記述できません。端的に言うと、XMLのように、XML Namespaceを使って、スキーマを使った意味づけができません。これでは、意味づけが曖昧になって、利用に制限が生じるので、何とかしよう、というのが JSON-LD です。
W3C の仕様
http://www.w3.org/TR/json-ld/
W3C の仕様のサンプルがすばらしいので、こちらをベースに紹介します
(以下のサンプルは、W3Cのサイトからの転載です。)
初めに、神はJSONを創造された。
{
"name": "Manu Sporny",
"homepage": "http://manu.sporny.org/",
"image": "http://manu.sporny.org/images/manu.png"
}
普通ですね。でも、それぞれの項目の意味は、感覚的です。人間には分かりますが、機械は、その意味を、曖昧さを排除して理解することはできません。 (つまり、Machine readable ではありません。)
また、全ての項目が文字列になっていますが、URL なのか、文字列なのかは、明確に区別されるべきです。
神は言われた。「Linked Data たれ。」こうして、JSON-LDがあった。
{
"http://schema.org/name": "Manu Sporny",
"http://schema.org/url": { "@id": "http://manu.sporny.org/" }, // <=@id は、IRI(URL)だから必要
"http://schema.org/image": { "@id": "http://manu.sporny.org/images/manu.png" }
}
この例では、全ての項目を schema.org を使って定義しました。
url
とimage
で、@id
を使っているのは、この値がIRI(Internationalized Resource Identifier。IRIは、URLを拡張したもので、リソースを一意に示す識別子。) であるためです。
Context
そろそろ旧約聖書ネタは止めますが、上の例だと、機械には分かりやすいですが、人間には書きにくい/分かりにくいですよね。
そこで、JSON-LD では、Context というものを定義できます。
Context は、JSON-LD のデータ自身に埋め込むこともできますし、別に書くこともできます。
別に描く場合、まず、以下のようなファイルを書きます。
{
"@context":
{
"name": "http://schema.org/name", // <= 'name' は、'http://schema.org/name' の略として定義
"image": {
"@id": "http://schema.org/image", // 'image' は 'http://schema.org/image' の略として定義
"@type": "@id" //型はIRIであるとして定義
},
"homepage": {
"@id": "http://schema.org/url",
"@type": "@id"
}
}
}
そして、これをどこかに置きます。例えば、 http://json-ld.org/contexts/person.jsonld
そうすると、以下のように書けます。
{
"@context": "http://json-ld.org/contexts/person.jsonld",
"name": "Manu Sporny",
"homepage": "http://manu.sporny.org/",
"image": "http://manu.sporny.org/images/manu.png"
}
同じく、以下のように、インラインにも書けます。
{
"@context":
{
"name": "http://schema.org/name",
"image": {
"@id": "http://schema.org/image",
"@type": "@id"
},
"homepage": {
"@id": "http://schema.org/url",
"@type": "@id"
}
},
"name": "Manu Sporny",
"homepage": "http://manu.sporny.org/",
"image": "http://manu.sporny.org/images/manu.png"
}
配列はどうやって書くのか?
普通に以下のように書けます。(children以下が配列です)
{
"@context": {
"name": "http://example.com/vocab#name",
"children": "http://example.com/vocab#children"
},
"@id": "#homer",
"name": "Homer",
"children": [
{
"@id": "#bart",
"name": "Bart"
},
{
"@id": "#lisa",
"name": "Lisa"
}
]
}
無名の項目が必要な場合、Reserved Property を使えます。利点はよく分かっていないのですが、親となる項目が無い場合には、この方が良いかもしれません。
{
"@context": {
"name": "http://example.com/vocab#name",
"children": "http://example.com/vocab#children"
},
"@graph": [
{
"@id": "#bart",
"name": "Bart"
},
{
"@id": "#lisa",
"name": "Lisa"
}
]
}
まとめ?
いかがでしょうか。JSON-LD の利用例は、まだほとんどありませんが、今後、国際標準化で活発に使われることが予想されます。そのため、しばらくすると、W3Cの仕様書などで、目にすることも増えると思われます。