如何压缩和/或构建 json-ld 文档,以便 IRI 值和键一样简洁地表达?

问题描述

给定一个像这个例子这样的原始 JSON-LD 文档,它为某些 sources 定义了 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包括 EN 和 {{1 }} 为 FR)

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

Concepts

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

{
   "@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/sources。>

但我找不到对值执行相同操作的方法,使它们变成 sourcesEN 而不是 FRex:vocab/countries/EN。我将 ex:vocab/countries/FR@base 属性添加到上下文的实验似乎没有像我预期的那样工作。

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

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

JSON-LD 游乐场链接 here

解决方法

您可以将 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,"sources": {
      "@id": "ex:sources","@context": {
        "@vocab": "https://example.com/vocab/countries/"
      }
    }
  },"@id": "ex:thing1","sources": [
    "EN","FR"
  ]
}

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...