1. ikeyasu

    No comment

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