我正在研究将JSON-LD和Hydra用作API有效负载。看起来非常有前途,但是我正在努力解决一件事-如何扩展预定义类型。
例如,我有用户。将它们建模为"@type": "http://schema.org/Person"
似乎是合理的-因为用户就是人。但我也想让我的用户拥有一些未在该类型上定义的属性-例如用户帐户信息。
我知道我可以给资源提供多种类型,因此我可以定义自己的词汇表,该词汇表定义具有此信息的“用户”类型,但这是正确的实现方式吗?还是有使用JSON-LD达到此目标的更好方法?
答案 0 :(得分:1)
通常,有四种方法可以解决该问题:
schema:Person
是虚构的,您可以向该实体添加ex:FictionalThing
类型。schema:Person
是虚构的,可以将ex:FictionalPerson
定义为{{1}的sub-type },只有¹使用schema:Person
。ex:FictionalPerson
提供昵称,您可以添加schema:Person
属性。²ex:nickname
定义为ex:nickname
的{{3}},并且只能¹使用schema:additionalName
。² 重复使用sub-property是一个好习惯。如果没有合适的术语/词汇,请existing RDF types/properties。
在您的特定情况下,在我看来,您需要一种表示用户帐户的类型,因为ex:nickname
可以有多个帐户,并且可能没有适用于以下所有用户帐户的用户数据那人。因此,您可能要考虑使用一个实体来表示一个用户帐户,并使用一个属性将这样的帐户与schema:Person
连接起来。
例如,您可以使用属性define your own将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"
}
}
旁边添加其他类型,因为您可以自由地混合使用来自不同词汇表的类型和属性。还要注意,您可以定义属性的schema:Person
和domain,这使您可以“隐式”向引用/被引用实体添加类型。在上面的示例中,知道FOAF词汇表的消费者会将类型schema:Person
添加到类型为foaf:Agent
的实体中,因为它是属性schema:Person
的域。