我如何压缩 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
,包括 EN
和 FR
作为 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/sources
到 sources
.
但我找不到一种方法似乎对这些值做同样的事情,所以它们变成了 EN
和 FR
而不是 ex:vocab/countries/EN
和 ex: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"
]
}
给定原始的 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
,包括 EN
和 FR
作为 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/sources
到 sources
.
但我找不到一种方法似乎对这些值做同样的事情,所以它们变成了 EN
和 FR
而不是 ex:vocab/countries/EN
和 ex: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"
]
}