我如何压缩 and/or 框架 json-ld 文档,以便 IRI 值和键一样简洁地表达?

How do I compact and/or frame a json-ld document so that IRI values are expressed succinctly as well as keys?

给定原始的 JSON-LD 文档,如本例,它为某些 thing1:

定义了 sources
[
  {
  
    "@id": "https://example.com/thing1",
    "https://example.com/sources": [
      {
        "@id": "https://example.com/vocab/countries/EN"
      },
      {
        "@id": "https://example.com/vocab/countries/FR"
      }
    ]
  }
]

(我正在简化很多 - 在我的实际用例中,它更大并且是从 RDF 数据生成的。ex:vocab/countries 是一个 SKOS ConceptScheme,包括 ENFR 作为 Concepts)

我想把它折叠成更接近于我用更正常的方式表达的东西 JSON:

{
   "@id": "https://example.com/thing1",
   "sources": ["EN", "FR"]
}

我发现我可以使用上下文折叠成 name/values 并缩短名称:

{
  "@context": {
    "@version": 1.1,
    "ex": "https://example.com/",
    "sources": {
      "@id": "ex:sources",
      "@type": "@id"
    }
  },
  "@id": "ex:thing1",
  "sources": [
    "ex:vocab/countries/EN",
    "ex:vocab/countries/FR"
  ]
}

一个重要的元素是 "@type": "@id",它将对象(列表)中的源定义折叠成 key/value 对,并且封闭的上下文术语映射 https://example.com/sourcessources.

但我找不到一种方法似乎对这些值做同样的事情,所以它们变成了 ENFR 而不是 ex:vocab/countries/ENex:vocab/countries/FR。我向上下文添加 @base@vocab 属性的实验似乎没有像我预期的那样工作。

我还需要在范围内执行此操作,以便可以定义 sources 之外的其他属性,这些属性引用不同的词汇表。例如,我可能想要包括 languages,它可能包括代表英语、法语、盖尔语、布列塔尼语等词汇表中的术语。换句话说,我不能只为整个文档设置一个全局词汇表或基础.

谁能告诉我这种变换是否可行,如果可行,如何实现?

JSON-LD游乐场linkhere

您可以将 sources 的预期值设置为 @vocab 而不是 @type,并使用范围上下文来设置要使用的 @vocab。例如:

{
  "@version": 1.1,
  "ex": "https://example.com/",
  "sources": {
    "@id": "ex:sources",
    "@type": "@vocab",
    "@context": {
      "@vocab": "https://example.com/vocab/countries/"
    }
  }
}

(操场link).

这表示将 playground 的值视为与词汇表相关的 IRI,并为这些值设置该词汇表的基础。您应该得到以下信息:

{
  "@context": {
    "@version": 1.1,
    "ex": "https://example.com/",
    "sources": {
      "@id": "ex:sources",
      "@type": "@vocab",
      "@context": {
        "@vocab": "https://example.com/vocab/countries/"
      }
    }
  },
  "@id": "ex:thing1",
  "sources": [
    "EN",
    "FR"
  ]
}