将自定义属性添加到JSON-LD中的现有类型

时间:2018-11-10 21:00:02

标签: rdf ontology json-ld structured-data vocabulary

我正在研究将JSON-LD和Hydra用作API有效负载。看起来非常有前途,但是我正在努力解决一件事-如何扩展预定义类型。

例如,我有用户。将它们建模为"@type": "http://schema.org/Person"似乎是合理的-因为用户就是人。但我也想让我的用户拥有一些未在该类型上定义的属性-例如用户帐户信息。

我知道我可以给资源提供多种类型,因此我可以定义自己的词汇表,该词汇表定义具有此信息的“用户”类型,但这是正确的实现方式吗?还是有使用JSON-LD达到此目标的更好方法?

1 个答案:

答案 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 ownfoaf: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:Persondomain,这使您可以“隐式”向引用/被引用实体添加类型。在上面的示例中,知道FOAF词汇表的消费者会将类型schema:Person添加到类型为foaf:Agent的实体中,因为它是属性schema:Person的域。