Pull to refresh

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
Tags:
Hubs:
You can’t comment this publication because its author is not yet a full member of the community. You will be able to contact the author only after he or she has been invited by someone in the community. Until then, author’s username will be hidden by an alias.