我正在研究将 JSON-LD 和 Hydra 用作 API 负载的情况。这似乎很有前途,但我正在努力解决一件事 - 如何扩展预定义类型。
例如,我有用户。将它们建模为 "@type": "http://schema.org/Person"
似乎是合理的——因为用户就是人。但我也希望我的用户拥有一些未在该类型上定义的属性 - 例如用户帐户信息。
我知道我可以为资源提供多种类型,因此我可以定义自己的词汇表来定义具有此信息的“用户”类型,但这是实现此目的的正确方法吗?或者有没有更好的方法使用 JSON-LD 来实现这个目标?
最佳答案
一般来说,有四种方法可以处理它:
- 对于类型(又名类):
- 添加类型。为了表明
schema:Person
是虚构的,您可以向该实体添加ex:FictionalThing
类型。 - 改用子类型。要传达
schema:Person
是虚构的,您可以将ex:FictionalPerson
定义为sub-typeschema:Person
,并且仅使用ex:FictionalPerson
。
- 添加类型。为了表明
- 对于属性:
- 添加属性。要为
schema:Person
提供昵称,您可以添加ex:nickname
属性。²< - 改用子属性。您可以将
ex:nickname
定义为sub-property。schema:additionalName
,并且仅¹使用ex:nickname
.²
- 添加属性。要为
重用 existing RDF types/properties 是个好习惯.如果没有合适的术语/词汇,define your own .
在您的特定情况下,在我看来您需要一种类型来表示用户帐户,因为 schema:Person
可能有多个帐户,并且可能没有真实的用户数据该人的所有用户帐户。因此,您可能需要考虑使用实体来表示用户帐户,并使用属性将此类帐户与 schema:Person
连接起来。
例如,您可以使用属性 foaf:account
添加 foaf:OnlineAccount
到 schema:Person
:
{
"@context": "http://www.w3.org/2013/json-ld-context/rdfa11",
"@type": "schema:Person",
"schema:name": "Name of the person",
"foaf:account": {
"@type": "foaf:OnlineAccount",
"schema:name": "Name of the online account"
}
}
¹ 或者在 super 类型/ super 属性之外使用它,如果您想支持那些不首先阅读您自己的词汇表的消费者,这通常是个好主意。
² 为此,您不必在 schema:Person
旁边添加其他类型,因为您可以自由混合来自不同词汇表的类型和属性。另请注意,您可以定义 domain和 range的属性,它允许您“隐式地”将类型添加到引用/引用的实体。在上面的示例中,知道 FOAF 词汇表的消费者会将类型 foaf:Agent
添加到类型为 schema:Person
的实体中,因为它是属性的域foaf:account
.
关于rdf - 将自定义属性添加到 JSON-LD 中的现有类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53243358/