NGSI-LD 和 JSON-LD 有哪些区别?

Apo*_*dis 3 fiware

在 Fiware 教程中,我读到 NGSI-LD 不是 100% JSON-LD。你能解释一下有哪些区别吗?

Jas*_*Fox 8

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"
}
Run Code Online (Sandbox Code Playgroud)

NGSI-LD 是一个使用多种有效负载格式的 API,但这里是使用“规范化”NGSI-LD 表示的John Lennon实体 - 所有 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"
   }
}
Run Code Online (Sandbox Code Playgroud)

每个 NSGI-LD 有效负载都是一个有效的 JSON-LD 文档。然而,这种“标准化”NGSI-LD 格式具有额外的规则和限制(例如,所有属性必须具有 oftypePropertyRelationship,因此并非所有 JSON-LD 片段都是有效的“标准化”NGSI-LD。

就像 JSON-LD 是JSON 加链接数据概念一样,NGSI-LD 是NGSI-v2 加链接数据概念

NGSI -LD 规范描述了如何向上下文代理发出请求以及响应的预期格式。NGSI 中有 27 个定义明确的操作。此外,NGSI-LD 定义了严格的术语定义,例如订阅注册属性关系、时间戳只能保存在GeoJSON 属性中observedAt、地理位置必须在属性中找到等。locationPoint

NGSI-LD 实体、属性和关系

JSON-LD 只是一种数据表示形式,除了具有 JSON 格式的属性和属性之外,它不假设如何访问有效负载或如何构造有效负载@context

“标准化”NGSI-LD 中的 Context-Broker 到 Context-Broker 操作可以假设核心上下文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 请求的响应也可以以 JSONapplication/json和 GeoJSON格式返回,或者作为“标准化”或带或不带注释application/geo+json的键值对返回。例如,键值格式将返回John_Lennon实体,如下所示:@contextProperties

“键值”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"
}
Run Code Online (Sandbox Code Playgroud)

这与原始 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"
}
Run Code Online (Sandbox Code Playgroud)
获取../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"
  }
}
Run Code Online (Sandbox Code Playgroud)

“标准化”通常用于经纪商之间的数据交换。“keyValues”更有可能被应用程序开发人员使用。事实上,当您以 JSON 形式返回数据时,所有属性都已使用扩展/压缩操作进行了清洗,这意味着您可以使用不同的属性名称从多个源获取数据,并使用商定的IRI的单个通用短名称返回- 这是数据互操作性交换 API 的目标。

总之,“标准化”NGSI-LD 格式是 JSON-LD 的扩展子集。NGSI -LD API本身是一个更灵活的API,可以输出各种JSON和JSON-LD格式并用于数据交换。

如果您需要更多信息, FIWARE 基金会最近的视频演示中还对 NGSI-LD 数据格式(包括新的“简洁”数据格式)进行了更广泛的审查。