1

给定一个像这个例子这样的原始 JSON-LD 文档,它定义了sourcesfor some thing1

[
  {
  
    "@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包括ENFRas Concepts

我想把它折叠成近似于我用更普通的 JSON 来表达的东西:

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

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

{
  "@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"将源定义从(一个列表)对象折叠成键/值对,并且封闭的上下文术语映射https://example.com/sourcessources.

但我找不到一种似乎对价值观做同样的事情的方法,这样它们就变成了ENandFR而不是ex:vocab/countries/ENand ex:vocab/countries/FR。我在上下文中添加@base@vocab属性的实验似乎不像我预期的那样工作。

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

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

JSON-LD Playground 链接在这里

4

1 回答 1

1

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

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

(游乐场链接)。

这表示将 的值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"
  ]
}
于 2021-06-16T20:36:58.237 回答