JSON-LD 上下文中的不同值前缀
Different value prefixes in JSON-LD context
所以我有一个预定义的 ontology 和一个现有的 JSON 服务(两次都读作 "can not change the existing content there")返回如下内容 JSON:
{
"propA": "someResource",
"propB": "otherResource"
}
我想通过添加(我不能更改现有属性,但可以添加新属性)上下文定义将该输出转换为 JSON-LD。在第一步中,我添加了一个默认上下文,如下所示:
"@context": {
"@vocab": "https://example.org/",
"propA": { "@type": "@vocab" },
"propB": { "@type": "@vocab" }
},
"@id": "https://example.org/blub",
这将两种资源都映射到 @vocab
(playground) 给定的命名空间。
<https://example.org/blub> <https://example.org/propA> <https://example.org/someResource> .
<https://example.org/blub> <https://example.org/propB> <https://example.org/otherResource> .
但是,两个引用的资源属于两个不同的命名空间。所以我需要一些上下文,映射到以下内容:
<https://example.org/blub> <https://example.org/propA> <https://foo.com/someResource> .
<https://example.org/blub> <https://example.org/propB> <https://bar.com/otherResource> .
我在某处找到了一个 hack using @base
,但如果您需要一个额外的命名空间而不是多个命名空间,这只能作为一种解决方法。
那么当我需要两个以上的属性时,如何为不同的属性定义单独的命名空间前缀?
这是一种方法:
{
"@context": {
"dcat": "http://www.w3.org/ns/dcat#",
"org": "http://www.w3.org/ns/org#",
"vcard": "http://www.w3.org/2006/vcard/ns#",
"foaf": "https://project-open-data.cio.gov/v1.1/schema#",
"dc": "http://purl.org/dc/terms/",
"pod": "https://project-open-data.cio.gov/v1.1/schema#",
"skos": "http://www.w3.org/2004/02/skos/core#",
}
}
那么您将使用 CURIE 格式 (https://en.wikipedia.org/wiki/CURIE) 来指定 key:value
对,其中 key
是 vocab
,value
是在 axiom/statement.
中使用 vocab term
经过一番折腾,我认为 JSON-LD 1.1 提供了一个答案:scoped contexts.
{
"@context": {
"@version": 1.1,
"@vocab": "https://example.org/",
"propA": { "@type": "@id", "@context": { "@base": "https://foo.com/"} },
"propB": { "@type": "@id", "@context": { "@base": "https://bar.com/"} }
},
"@id": "https://example.org/blub",
"propA": "someResource",
"propB": "otherResource"
}
有两点需要注意:
-
"@version": 1.1
的添加是至关重要的。这告诉合规处理器使用 JSON-LD 1.1 规则集。
- 然后我们可以将每个 属性 放在单独的上下文中,并在此处更改
@base
。
根据this (dev) playground example,这将导致以下 Turtle 表示:
<https://example.org/blub> <https://example.org/propA> <https://foo.com/someResource> .
<https://example.org/blub> <https://example.org/propB> <https://bar.com/otherResource> .
旁注:我们甚至可以通过将 @type
设置为 @vocab
并定义范围内的映射,以类似的方式定义可能值映射的枚举语境。请注意,这次我们必须在范围上下文中设置 @vocab
而不是 @base
:
{
"@context": {
"@version": 1.1,
"@vocab": "https://example.org/",
"propA": {
"@type": "@vocab",
"@context": {
"@vocab": "http://foo.com/",
"abc": "http://bar.com/abc",
"xyz": "http://baz.com/xyz"
}
}
},
"@id": "https://example.org/blub"
}
现在根据赋予 propA
的值使用不同的命名空间 (play with it):
"abc" -> <https://example.org/blub> <https://example.org/propA> <http://bar.com/abc> .
"xyz" -> <https://example.org/blub> <https://example.org/propA> <http://baz.com/xyz> .
"mnl" -> <https://example.org/blub> <https://example.org/propA> <http://foo.com/mnl> .
所以我有一个预定义的 ontology 和一个现有的 JSON 服务(两次都读作 "can not change the existing content there")返回如下内容 JSON:
{
"propA": "someResource",
"propB": "otherResource"
}
我想通过添加(我不能更改现有属性,但可以添加新属性)上下文定义将该输出转换为 JSON-LD。在第一步中,我添加了一个默认上下文,如下所示:
"@context": {
"@vocab": "https://example.org/",
"propA": { "@type": "@vocab" },
"propB": { "@type": "@vocab" }
},
"@id": "https://example.org/blub",
这将两种资源都映射到 @vocab
(playground) 给定的命名空间。
<https://example.org/blub> <https://example.org/propA> <https://example.org/someResource> .
<https://example.org/blub> <https://example.org/propB> <https://example.org/otherResource> .
但是,两个引用的资源属于两个不同的命名空间。所以我需要一些上下文,映射到以下内容:
<https://example.org/blub> <https://example.org/propA> <https://foo.com/someResource> .
<https://example.org/blub> <https://example.org/propB> <https://bar.com/otherResource> .
我在某处找到了一个 hack using @base
,但如果您需要一个额外的命名空间而不是多个命名空间,这只能作为一种解决方法。
那么当我需要两个以上的属性时,如何为不同的属性定义单独的命名空间前缀?
这是一种方法:
{
"@context": {
"dcat": "http://www.w3.org/ns/dcat#",
"org": "http://www.w3.org/ns/org#",
"vcard": "http://www.w3.org/2006/vcard/ns#",
"foaf": "https://project-open-data.cio.gov/v1.1/schema#",
"dc": "http://purl.org/dc/terms/",
"pod": "https://project-open-data.cio.gov/v1.1/schema#",
"skos": "http://www.w3.org/2004/02/skos/core#",
}
}
那么您将使用 CURIE 格式 (https://en.wikipedia.org/wiki/CURIE) 来指定 key:value
对,其中 key
是 vocab
,value
是在 axiom/statement.
vocab term
经过一番折腾,我认为 JSON-LD 1.1 提供了一个答案:scoped contexts.
{
"@context": {
"@version": 1.1,
"@vocab": "https://example.org/",
"propA": { "@type": "@id", "@context": { "@base": "https://foo.com/"} },
"propB": { "@type": "@id", "@context": { "@base": "https://bar.com/"} }
},
"@id": "https://example.org/blub",
"propA": "someResource",
"propB": "otherResource"
}
有两点需要注意:
-
"@version": 1.1
的添加是至关重要的。这告诉合规处理器使用 JSON-LD 1.1 规则集。 - 然后我们可以将每个 属性 放在单独的上下文中,并在此处更改
@base
。
根据this (dev) playground example,这将导致以下 Turtle 表示:
<https://example.org/blub> <https://example.org/propA> <https://foo.com/someResource> .
<https://example.org/blub> <https://example.org/propB> <https://bar.com/otherResource> .
旁注:我们甚至可以通过将 @type
设置为 @vocab
并定义范围内的映射,以类似的方式定义可能值映射的枚举语境。请注意,这次我们必须在范围上下文中设置 @vocab
而不是 @base
:
{
"@context": {
"@version": 1.1,
"@vocab": "https://example.org/",
"propA": {
"@type": "@vocab",
"@context": {
"@vocab": "http://foo.com/",
"abc": "http://bar.com/abc",
"xyz": "http://baz.com/xyz"
}
}
},
"@id": "https://example.org/blub"
}
现在根据赋予 propA
的值使用不同的命名空间 (play with it):
"abc" -> <https://example.org/blub> <https://example.org/propA> <http://bar.com/abc> .
"xyz" -> <https://example.org/blub> <https://example.org/propA> <http://baz.com/xyz> .
"mnl" -> <https://example.org/blub> <https://example.org/propA> <http://foo.com/mnl> .