JSON-LD

本当は、"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"
    }
  ]
}
```

無名の項目が必要な場合、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の仕様書などで、目にすることも増えると思われます。