2016-10-11 115 views
1

我想弄清楚用JSON-LD建模屬性/類關係的最佳方法。我試圖支持能夠共享屬性的類。json-LD類屬性關係建模

第一個示例使用我認爲是實現此目的的常用方法(儘管schema.org使用名爲http://schema.org/domainIncludes而不是rdfs:domain的託管屬性)。

但是我覺得我的使用情況將被指向從類屬性來更好地描述爲示例2

例1)查看RDFS:在性能域。例如:

{ 
    "@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" } 
     ] 
    } 
    ] 
} 

例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中的屬性確實有意義。

回答

2

大多數使用RDFS/OWL詞彙表的人都傾向於使用Turtle或RDF/XML進行建模,但JSON-LD是一種很好的方法。

rdfs:domain(和rdfs:range)經常不被理解的是,如果使用了兩個或更多的類,那麼實際上是創建一個交集,而不是聯合;這是RDFS的兩個推斷性質。當您有一個使用propertyOne的實例時,它會自動推斷該實例是其所有域的子類(並且該值是所有範圍的子類)。這就是schema:domainIncludes創建的原因,但它沒有正式的推理規則。

另一種建模方法是使用owl:unionOf,這樣就可以說該域是一個類的子類,它是兩個或更多其他類的聯合,但這相當複雜,這也是爲什麼schema.org決定採取不同的方向。

在示例二中,您似乎提出了一種描述詞彙的不同方式。請注意,rdfs:isDefinedBy也有一個特定的含義,我之前沒有看到它用於描述屬性關係。當然,在結構上,您可以使用@reverse在ClassOne和ClassTwo下包含屬性定義。關鍵是看它創建的三元組,這就是爲什麼龜通常更適合於詞彙建模或目標構建Protégé。一旦完成,你可以序列化爲JSON-LD,可能使用一些幀來創建你感興趣的結構。

+0

好吧我會想更多關於這個,我不相信我有資格'建議用我目前的知識來描述詞彙的不同方式,所以我會在進行更多的研究之後添加一個更新。 – TheBigC