Как стать автором
Обновить

JSON-LD cвязываем наши данные


Недавно обновилась спецификация по JSON Linked Data. Я думаю что все знаю что такое JSON, но если вы хотите узнать что же за новое расширение придумали для JSON в W3C то добро пожаловать под кат.

Что же такое LD(Linked Data)


Согласно википедии авторитетным источникам Linked Data это коллекция взаимосвязанных наборов данных во Всемирной паутине. Тим Бернерс-Ли в своей статье выделяет 4 базовых принципа Linked Data:
  1. Использовать URIs для именования сущностей.
  2. Использовать HTTP URIs так чтобы люди могли находить эти сущности.
  3. Когда кто-то ищет URI, предоставлять полезную информацию используя стандарты (RDF*, SPARQL)
  4. Включать ссылки на остальные URIs чтобы они могли открывать больше сущностей.

Формат JSON-LD используется для семантического представления связанных данных.

Визуальное представление Linked Data это граф


Хороший пример реализации Linked Data это DBPedia
Также GMail уже поддерживает формат в разметке почты.

Отличия от JSON синтаксиса

JSON-LD по основному синтаксису идентичен JSON, и он будет всегда проходить JSON валидацию, основное отличие это зарезервированные ключи в JSON объекте для семантического разбора данных.

Примеры


Пример из спецификации, создаем структуру представляемых данных через ключ context, и вводим наши данные.

{
  "@context": {
    "name": "http://xmlns.com/foaf/0.1/name",
    "homepage": {
      "@id": "http://xmlns.com/foaf/0.1/homepage",
      "@type": "@id"
    }
  },
  "name": "John Doe",
  "homepage": "http://example.org/"
}


Контекст можно задавать через ссылку на файл с контекстом.

{
  "@context": "http://json-ld.org/contexts/person.jsonld",
  "name": "John Doe",
  "homepage": "http://example.org/"
}


После раскрытия URI с контекстом данные будут выглядеть так:

[{
  "http://xmlns.com/foaf/0.1/homepage": [
  {
    "@id": "http://example.org/"
  }],
  "http://xmlns.com/foaf/0.1/name": [
  {
    "@value": "John Doe"
  }]
}]


Так же на сайте сообщества есть небольшой playground с примерами.

Зарезервированные ключи


  • context
    Определяет структуру предоставляемых данных, а именно ключи и типы значений к ключам(IRI).
    Все типы IRIs можно посмотреть тут.

  • id
    Используется для определения уникального имени для сущности. В структуре данных сущность это узел графа.

  • value
    Используется для определения данных для введенных ключей.

  • language
    Определяет язык предоставленных данных.
    {
      "@context":
      {
        ...
        "@language": "ru"
      },
      "name": "Джон До",
      "occupation": "Разработчик"
    }
    


  • type
    Определяет тип узла или типизированного значения.

  • container
    Выставляем тип контейнера для нашего ключа.
    {
      "@context":
      {
        ...
        "nick":
        {
          "@id": "http://xmlns.com/foaf/0.1/nick",
          "@container": "@list"
        }
      },
    ...
      "@id": "http://example.org/people#joebob",
      "nick": [ "joe", "bob", "jaybee" ],
    ...
    }
    


  • list
    Контейнер данных, в JSON представлен массивом.
     ["obj1","obj2","obj3"]
    


  • set
    Контейнер данных, в JSON представлен как объект ключ значение.
    { "@id": "data" }
    


  • reverse
    Добавляет общий ключ для узлов графа, этот ключ будет родительским для узлов которые вписаны внутри reverse.
    Пример добавление ключа без reverse
    [
      {
        "@id": "#homer",
        "http://example.com/vocab#name": "Homer"
      },
      {
        "@id": "#bart",
        "http://example.com/vocab#name": "Bart",
        "http://example.com/vocab#parent": { "@id": "#homer" }
      },
      {
        "@id": "#lisa",
        "http://example.com/vocab#name": "Lisa",
        "http://example.com/vocab#parent": { "@id": "#homer" }
      }
    ]
    


    В случае если использовать reverse то мы получим более удобную структуру.
    {
      "@id": "#homer",
      "http://example.com/vocab#name": "Homer",
      "@reverse": {
        "http://example.com/vocab#parent": [
          {
            "@id": "#bart",
            "http://example.com/vocab#name": "Bart"
          },
          {
            "@id": "#lisa",
            "http://example.com/vocab#name": "Lisa"
          }
        ]
      }
    }
    


  • index
    Вид контейнера который представлен как произвольные структуры ключ значение. Тут используется прямой доступ к данным без определения структуры в контексте.
    {
      "@context":
      {
         "schema": "http://schema.org/",
         "name": "schema:name",
         "body": "schema:articleBody",
         "words": "schema:wordCount",
         "post": {
           "@id": "schema:blogPost",
           "@container": "@index"
         }
      },
      "@id": "http://example.com/",
      "@type": "schema:Blog",
      "name": "World Financial News",
      "post": {
         "en": {
           "@id": "http://example.com/posts/1/en",
           "body": "World commodities were up today with heavy trading of crude oil...",
           "words": 1539
         },
         "de": {
           "@id": "http://example.com/posts/1/de",
           "body": "Die Werte an Warenbörsen stiegen im Sog eines starken Handels von Rohöl...",
           "words": 1204
         }
      }
    }
    


  • base
    Определяет основной URL для IRI с относительными путями.

  • vocab
    Определяет словарь который расширяет типы для ключа type.
    {
      "@context": {
        "@vocab": "http://schema.org/"
      }
      "@id": "http://example.org/places#BrewEats",
      "@type": "Restaurant",
      "name": "Brew Eats"
      ...
    }
    


  • graph
    Иногда нужно присоединить не узел а полный граф как объект и для этого используется данный ключ. Тут граф передается как группа узлов.
    {
      "@context": {
        "generatedAt": {
          "@id": "http://www.w3.org/ns/prov#generatedAtTime",
          "@type": "http://www.w3.org/2001/XMLSchema#date"
        },
        "Person": "http://xmlns.com/foaf/0.1/Person",
        "name": "http://xmlns.com/foaf/0.1/name",
        "knows": "http://xmlns.com/foaf/0.1/knows"
      },
      "@id": "http://example.org/graphs/73",
      "generatedAt": "2012-04-09",
      "@graph":
      [
        {
          "@id": "http://manu.sporny.org/about#manu",
          "@type": "Person",
          "name": "Manu Sporny",
          "knows": "http://greggkellogg.net/foaf#me"
        },
        {
          "@id": "http://greggkellogg.net/foaf#me",
          "@type": "Person",
          "name": "Gregg Kellogg",
          "knows": "http://manu.sporny.org/about#manu"
        }
      ]
    }
    




P.S.


Формат данных очень интересен, и нужно еще много изучить в его структуре и принципах раскрытия и записи данных, будем надеяться что браузеры сделают более плотную интеграцию с JSON-LD в будущем.

Дополнительные материалы по JSON-LD


JSON-LD Community
JSON-LD API
JSON-LD Syntax
JSON-LD Framing
JSON-LD Normalization
Небольшая презентация от одного из авторов спецификации
JSON-LD на github
Теги:
Хабы:
Данная статья не подлежит комментированию, поскольку её автор ещё не является полноправным участником сообщества. Вы сможете связаться с автором только после того, как он получит приглашение от кого-либо из участников сообщества. До этого момента его username будет скрыт псевдонимом.