1. ikeyasu

    No comment

    ikeyasu
Changes in body
Source | HTML | Preview

本当は、"JSON-LDとXML"というタイトルにしようと思ったが、XMLは語るにはあまりに広い世界で恐ろしいし、詳しい先生方が多い領域なので、JSON-LD だけを書くことにした、そんなエントリーです。
(もっとも、Linked Data 初心者であることは確かですので、誤りが有れば、ご指摘下さい)

追記 2014/08/27:
メトロのオープンデータ活用コンテストが、JSON-LDなのに気をよくして、配列について追記しました。

みんな大好きJSON ですが、JSONでは、複雑なデータを記述できません。端的に言うと、XMLのように、XML Namespaceを使って、スキーマを使った意味づけができません。これでは、意味づけが曖昧になって、利用に制限が生じるので、何とかしよう、というのが JSON-LD です。

http://json-ld.org

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 を使って定義しました。
urlimageで、@idを使っているのは、この値がIRI(Internationalized Resource Identifier。IRIは、URLを拡張したもので、リソースを一意に示す識別子。) であるためです。

Context

そろそろ旧約聖書ネタは止めますが、上の例だと、機械には分かりやすいですが、人間には書きにくい/分かりにくいですよね。
そこで、JSON-LD では、Context というものを定義できます。

Context は、JSON-LD のデータ自身に埋め込むこともできますし、別に書くこともできます。

別に描く場合、まず、以下のようなファイルを書きます。

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

そうすると、以下のように書けます。

{
  "@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"
    }
  ]
}

ですが、以下のように、children の項目無しに、配列を書くことはできません。

{
  "@context": {
    "name": "http://example.com/vocab#name",
  },
  [
    {
      "@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の仕様書などで、目にすることも増えると思われます。