json LD类属性关系建模
我试图找出用JSON-LD建模属性/类关系的最佳方法。我试图支持类能够共享属性json LD类属性关系建模,json,rdf,json-ld,rdfs,Json,Rdf,Json Ld,Rdfs,我试图找出用JSON-LD建模属性/类关系的最佳方法。我试图支持类能够共享属性 { "@context": { "rdf": "http://www.w3.org/1999/02/22-rdf-syntax-ns#", "rdfs": "http://www.w3.org/2000/01/rdf-schema#", "xsd": "http://www.w3.org/2001/XMLSchema#", "project": "http://wwww.hello
{
"@context": {
"rdf": "http://www.w3.org/1999/02/22-rdf-syntax-ns#",
"rdfs": "http://www.w3.org/2000/01/rdf-schema#",
"xsd": "http://www.w3.org/2001/XMLSchema#",
"project": "http://wwww.hello.com#"
},
"@graph": [
{
"@id": "project:ClassOne",
"@type": "rdfs:Class",
"rdfs:label": "ClassOne"
},
{
"@id": "project:ClassTwo",
"@type": "rdfs:Class",
"rdfs:label": "ClassOne"
},
{
"@id": "project:propertyOne",
"@type": "rdf:Property",
"rdfs:label": "propertyOne",
"rdfs:range": "xsd:string",
"rdfs:domain": [
{ "@id":"project:ClassOne" },
{ "@id":"project:ClassTwo" },
]
},
{
"@id": "project:PropertyTwo",
"@type": "rdf:Property",
"rdfs:label": "PropertyTwo",
"rdfs:range": "xsd:string",
"rdfs:domain": [
{ "@id":"project:ClassOne" }
]
}
]
}
第一个示例使用了我认为是实现这一点的常用方法(尽管schema.org使用了一个名为而不是rdfs:domain的托管属性)
然而,我认为通过指向类中的属性来更好地描述我的用例,如示例2所示
ex1)请参见属性中的rdfs:domain
{
"@context": {
"rdf": "http://www.w3.org/1999/02/22-rdf-syntax-ns#",
"rdfs": "http://www.w3.org/2000/01/rdf-schema#",
"xsd": "http://www.w3.org/2001/XMLSchema#",
"project": "http://wwww.hello.com#"
},
"@graph": [
{
"@id": "project:ClassOne",
"@type": "rdfs:Class",
"rdfs:label": "ClassOne"
},
{
"@id": "project:ClassTwo",
"@type": "rdfs:Class",
"rdfs:label": "ClassOne"
},
{
"@id": "project:propertyOne",
"@type": "rdf:Property",
"rdfs:label": "propertyOne",
"rdfs:range": "xsd:string",
"rdfs:domain": [
{ "@id":"project:ClassOne" },
{ "@id":"project:ClassTwo" },
]
},
{
"@id": "project:PropertyTwo",
"@type": "rdf:Property",
"rdfs:label": "PropertyTwo",
"rdfs:range": "xsd:string",
"rdfs:domain": [
{ "@id":"project:ClassOne" }
]
}
]
}
Ex 2)不要在属性上使用域,而是指向类中的属性。使用ref:isDefinedBy或project:custom/propertyList作为两种可能的方法。我会用其中一个,而不是两个
{
"@context": {
"rdf": "http://www.w3.org/1999/02/22-rdf-syntax-ns#",
"rdfs": "http://www.w3.org/2000/01/rdf-schema#",
"xsd": "http://www.w3.org/2001/XMLSchema#",
"project": "http://wwww.hello.com#"
},
"@graph": [
{
"@id": "project:ClassOne",
"@type": "rdfs:Class",
"rdfs:label": "ClassOne",
"rdfs:isDefinedBy": [
{ "@id":"project:propertyOne" },
{ "@id":"project:propertyTwo" }
]
},
{
"@id": "project:ClassTwo",
"@type": "rdfs:Class",
"rdfs:label": "ClassOne",
"project:custom/propertyList": [
{ "@id":"project:propertyTwo" }
]
},
{
"@id": "project:propertyOne",
"@type": "rdf:Property",
"rdfs:label": "propertyOne",
"rdfs:range": "xsd:string"
},
{
"@id": "project:propertyTwo",
"@type": "rdf:Property",
"rdfs:label": "propertyTwo",
"rdfs:range": "xsd:string"
}
]
}
这有意义吗,或者说我从根本上遗漏了什么?我不想在属性上使用域的原因是,我试图构建一个框架,使来自不同“项目”的类能够共享属性,而project1中的属性在project2中具有类的域是没有意义的
然而,project1中的类在project2中使用属性是有意义的。大多数使用RDFS/OWL词汇表的人倾向于使用Turtle或RDF/XML建模,但JSON-LD是一种很好的方法 关于rdfs:domain(和rdfs:range)通常不被理解的是,如果使用两个或更多的类,那么实际上创建的是一个交集,而不是一个并集;这是RDFS推理本质的两个方面。当您有一个使用propertyOne的实例时,它会自动推断该实例是其所有域的子类(值是所有范围的子类)。这就是schema:domainIncludes被创建的原因,但它没有正式的推理规则 另一种建模方法是使用owl:unionOf,因此可以说域是一个类的子类,该类是两个或多个其他类的并集,但这相当复杂,这也是schema.org决定采用不同方向的原因
在示例2中,您似乎建议使用一种不同的方式来描述词汇表。请注意,rdfs:isDefinedBy还有一个特殊的含义,我以前从未见过它用于描述属性关系。当然,在结构上,您可以使用@reverse将属性定义包含在ClassOne和ClassTwo下。关键在于观察它创建的三元组,这就是为什么Turtle通常更适合词汇建模或专门构建Protégé的原因。完成后,您可以序列化为JSON-LD,可能会使用一些框架来创建您感兴趣的结构。好的,我会对此进行更多思考,我不认为我有资格以我现有的知识“建议一种不同的词汇描述方式”,所以我会在进一步研究后添加更新。