JSON-LD上下文中的不同值前缀

时间:2018-09-01 09:25:32

标签: namespaces json-ld

所以我有一个预定义的本体和一个现有的JSON服务(两次都读为“无法在此处更改现有内容”),返回的内容类似于以下JSON:

{
  "propA": "someResource",
  "propB": "otherResource"
}

我想通过添加(我不能更改现有属性,但可以添加新属性)上下文定义将输出转换为JSON-LD。第一步,我添加了如下默认上下文:

  "@context": {
    "@vocab": "https://example.org/",

    "propA": { "@type": "@vocab" },
    "propB": { "@type": "@vocab" }
  },
  "@id": "https://example.org/blub",

这会将这两种资源都映射到@vocabplayground)给定的名称空间。

<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,但是如果您需要一个额外的命名空间而不是多个,则这只能作为一种解决方法。

当我需要两个以上的属性时,该如何为不同的属性定义单独的命名空间前缀?

2 个答案:

答案 0 :(得分:2)

这是一种方法:

{
  "@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对,其中keyvocab,而value是{ {1}}用于公理/陈述。

答案 1 :(得分:2)

经过一些摆弄之后,我认为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> .