Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
json LD类属性关系建模_Json_Rdf_Json Ld_Rdfs - Fatal编程技术网

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

我试图找出用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.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,可能会使用一些框架来创建您感兴趣的结构。

好的,我会对此进行更多思考,我不认为我有资格以我现有的知识“建议一种不同的词汇描述方式”,所以我会在进一步研究后添加更新。