В чем различия NGSI-LD и JSON-LD?

#fiware

Вопрос:

В учебниках по программному обеспечению я читал, что NGSI-LD не является на 100% JSON-LD. Можете ли вы объяснить мне, в чем заключаются различия?

Ответ №1:

JSON-LD-это расширение для обозначения объектов JavaScript, которое позволяет выражать концепции связанных данных в формате JSON и обеспечивает формат, понятный как для человека, так и для компьютера. Это JSON-LD:

JSON-LD

 {
  "@context": "https://json-ld.org/contexts/person.jsonld",
  "@id": "http://dbpedia.org/resource/John_Lennon",
  "name": "John Lennon",
  "born": "1940-10-09",
  "spouse": "http://dbpedia.org/resource/Cynthia_Lennon"
}
 

NGSI-LD-это API, который использует несколько форматов полезной нагрузки, но вот сущность Джона Леннона, выраженная с использованием «нормализованного» NGSI — LD-одного из нескольких форматов, которые должны поддерживать все контекстные брокеры NGSI (они также охватывают простые значения ключа JSON и GeoJSON, например — см. Ниже).

«нормализованный» NGSI-LD

ПОЛУЧИТЬ ../ngsi-ld/v1/entities/John_Lennon Тип содержимого: application/ld json
 {
   "@context":  [
     "https://json-ld.org/contexts/person.jsonld",
     "https://uri.etsi.org/ngsi-ld/v1/ngsi-ld-core-context.jsonld"
  ],
   "id": "http://dbpedia.org/resource/John_Lennon",
   "type": "Person",
   "name": {"type": "Property", "value": "John Lennon"},
   "born": {"type": "Property", "value": "1940-10-09"},
   "spouse": {
      "type": "Relationship", "object": 
      "http://dbpedia.org/resource/Cynthia_Lennon"
   }
}
 

Каждая полезная нагрузка NSGI-LD является допустимой JSON-LD. Однако этот «нормализованный» формат NGSI-LD имеет дополнительные правила и ограничения (например, все атрибуты должны иметь type значение Property или Relationship ), поэтому не все фрагменты JSON-LD являются допустимыми «нормализованными» NGSI-LD.

Подобно тому, как JSON-LD-это концепции связанных данных JSON плюс, NGSI-LD-это концепции связанных данных NGSI-v2 плюс.

Спецификация NGSI-LD описывает, как отправлять запросы контекстному брокеру и ожидаемый формат ответов. В NGSI существует 27 четко определенных операций. Кроме того, NGSI-LD определяет строгие определения таких терминов, как Подписка и Регистрация , Собственность и отношения, как временные метки должны храниться только в observedAt , географическое положение должно быть найдено в location атрибуте как GeoJSON Point и так далее.

Сущности, свойства и отношения NGSI-LD

JSON-LD-это только представление данных, оно не делает никаких предположений о том, как будет осуществляться доступ к полезной нагрузке или как она будет структурирована, помимо наличия атрибутов в формате JSON и @context атрибута.

Операции контекстного брокера с Контекстным брокером в «нормализованном» NGSI-LD могут предполагать, что основной контекст https://uri.etsi.org/ngsi-ld/v1/ngsi-ld-core-context.jsonld считается частью запроса и обрабатывается последним и, следовательно, всегда переопределяет другие @context элементы. @context элемент также может быть представлен с помощью заголовка ссылки

Представления JSON-LD всегда должны содержать @context атрибут (в конце концов, именно это делает их application/ld json более простыми application/json ), и @context они обрабатываются в соответствии с порядком найденного массива элементов.

Поскольку NGSI-LD определяется как API, ответы на запросы NGSI-LD также могут быть возвращены в формате JSON application/json и application/geo json GeoJSON или как «нормализованные» или в виде пар ключ-значение с @context аннотациями и или без Properties них. Например, формат значений ключей вернет сущность John_Lennon следующим образом:

«ключевые ценности» NGSI-LD

ПОЛУЧИТЬ ../ngsi-ld/v1/entities/John_Lennon?options=keyValues Тип содержимого: application/ld json
 {
  "@context": "https://json-ld.org/contexts/person.jsonld",
  "name": "John Lennon",
  "born": "1940-10-09",
  "spouse": "http://dbpedia.org/resource/Cynthia_Lennon"
}
 

что совпадает с исходным примером JSON-LD. И также можно вернуть как обычный JSON или GeoJSON, изменив тип содержимого.

ПОЛУЧИТЬ ../ngsi-ld/v1/entities/John_Lennon?options=keyValues Тип содержимого: application/json
 {
  "name": "John Lennon",
  "born": "1940-10-09",
  "spouse": "http://dbpedia.org/resource/Cynthia_Lennon"
}
 
ПОЛУЧИТЬ ../ngsi-ld/v1/entities/John_Lennon?options=keyValues Тип содержимого: application/geo json
 {
  "type": "Feature",
  "geometry": {
    "type": "Point",
    "coordinates": [-73.975, 40.775556]
  },
  "properties": {
    "name": "John Lennon",
    "born": "1940-10-09",
    "spouse": "http://dbpedia.org/resource/Cynthia_Lennon"
  }
}
 

«нормализованный» обычно используется для обмена данными между брокерами. «Ключевые значения», скорее всего, будут использоваться разработчиком приложений. Действительно, когда вы получаете данные обратно в виде JSON, все атрибуты были очищены с помощью операции расширения/уплотнения, что означает, что вы можете получать данные из нескольких источников, используя разные имена атрибутов, для возврата с использованием одного общего короткого имени для согласованной IRIs — это цель API обмена данными для взаимодействия.

Таким образом, в целом «нормализованный» формат NGSI-LD является расширенным подмножеством JSON-LD. Сам API NGSI-LD является более гибким API, который выводит различные форматы JSON и JSON-LD и используется для обмена данными.