JSON-LD不能在@context中定义多个节点类型

JSON-LD can't define multiple node types in @context

JSON-LD 类型的文档明确指出,您可以为一个节点定义多种类型。 https://www.w3.org/TR/json-ld11/#specifying-the-type 如果您在 JSON-LD playground 中打开上述 url 中的示例 #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 中定义多个节点类型吗?

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

正常启动。在 https://www.w3.org/TR/json-ld11/#context-definitions 中我们读到:

If the expanded term definition contains the @type keyword, its value MUST be an absolute IRI, a compact IRI, a term, null, or one of the keywords @id, @json, @none, or @vocab.

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

Typed values may be expressed in JSON-LD in three ways:

  1. By utilizing the @type keyword when defining a term within an @context section.

最后,让我们看看如果我们将您的示例更正为具有 @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