JSON-LD无法在@context中定义多个节点类型

时间:2019-07-05 08:57:28

标签: json-ld

JSON-LD类型的文档明确指出可以为节点定义多种类型。 https://www.w3.org/TR/json-ld11/#specifying-the-type 如果您从JSON-LD playground中的上述网址打开示例#14,您将看到它是有效的语法。

{
    "@id": "http://me.markus-lanthaler.com/",
    "@type": [
      "http://schema.org/Person",
      "http://xmlns.com/foaf/0.1/Person"
    ]
}

但是,如果尝试将此定义移至@context并将其应用于特定属性,则会从解析器中获取错误。选中here

{
  "@context": {
    "some_property": {
      "@id": "http://me.markus-lanthaler.com/",
      "@type": [
        "http://schema.org/Person",
        "http://xmlns.com/foaf/0.1/Person"
      ]
    }
  },
  "some_property": "value"
}

显示的错误是: jsonld.SyntaxError:无效的JSON-LD语法; @context @type值必须是字符串。

我仔细阅读了文档,并说可以为节点类型定义多个类型,但不能为值对象定义多个类型。 documentation明确表示,在同一词典中使用@value和@type时,@ type关键字表示值类型。否则,@type关键字表示节点类型。 但是here是另一个例子,表明可能并非如此。

有人知道如何在@context中定义多个节点类型吗?

1 个答案:

答案 0 :(得分:1)

您不能,因为您根本无法在上下文中定义节点类型。

从规范开始。在https://www.w3.org/TR/json-ld11/#context-definitions中,我们读到:

  

如果扩展的术语定义包含@type关键字,则其值必须为绝对IRI,紧凑型IRI,term,null或关键字@ id,@ json,@ none或@vocab中的一个。 / p>

此处不允许使用数组。因为上下文中扩展术语定义中的@type用于指定所定义属性的值的类型。如提到的。在https://www.w3.org/TR/json-ld11/#typed-values中:

  

可以使用三种方式在JSON-LD中表示类型化的值:

     
      
  1. 在@context部分中定义术语时,使用@type关键字。
  2.   

最后,让我们看看如果我们将示例更正为具有@type的字符串值,示例将扩展为什么。

{
  "@context": {
    "some_property": {
      "@id": "http://me.markus-lanthaler.com/",
      "@type": "http://schema.org/Person"
    }
  },
  "some_property": "value"
}

扩展到

[
  {
    "http://me.markus-lanthaler.com/": [
      {
        "@type": "http://schema.org/Person",
        "@value": "value"
      }
    ]
  }
]

如您所见,您确实确实拥有@value@type