2017-06-22 39 views
0

我有OWL和SPARQL的問題,我無法解決。我已經定義了幾個類,但是對於有問題的問題,只有3個是重要的類:人,男性和女性;其定義是以下幾點:OWL中的類和子類用於推理的SPARQL查詢

<#People> a owl:Class ; 
    rdfs:label "People"@en . 

<#Men> a owl:Class ; 
    rdfs:subClassOf <#People> ; 
    rdfs:label "Men"@en . 

<#Women> a owl:Class ; 
    rdfs:subClassOf <#People> ; 
    rdfs:label "Women"@en . 

然後例如在RDF數據:

<rdf:Description rdf:about="Registration#1"> 
    <rdfs:label>ARCHEOLOGY GRADUATE</rdfs:label> 
    <ex:BranchKnowledge>ARTS AND HUMANITIES</ex:BranchKnowledge> 
    <ex:Degree>ARCHEOLOGY GRADUATE</ex:Degree> 
    <ex:Men rdf:datatype="http://www.w3.org/2001/XMLSchema#nonNegativeInteger">63</ex:Men> 
    <ex:Women rdf:datatype="http://www.w3.org/2001/XMLSchema#nonNegativeInteger">99</ex:Women> 
    <dcterms:coverage>2015/2016</dcterms:coverage> 
</rdf:Description> 

如果我想獲得號男士和每一個數據的婦女,我得到它用下面的查詢:

SELECT ?X ?degree ?branch ?men ?women 
WHERE { 
    ?X ex:Degree ?degree . 
    ?X ex:BranchKnowledge ?branch . 
    ?X ex:Men ?men . 
    ?X ex:Women ?women 
} 

如果我現在想男人和女人的總數推斷都是Peopl Ë,我想,既然都是人的子類,我可以做下面的查詢:

SELECT ?X ?degree ?branch ?people 
WHERE { 
    ?X ex:Degree ?degree . 
    ?X ex:BranchKnowledge ?branch . 
    ?X ex:People ?people 
} 

然而我沒有得到任何結果

我誤解了類和子類之間的關係,我想要做什麼或者會出現什麼問題? (我正在使用Virtuoso服務器)。

+0

您應該意識到您正在使用punning這一事實,即對於'Men'和'Women'使用與OWL類和OWL數據屬性相同的URI。我不明白你爲什麼這樣做。 – AKSW

+0

接下來,您使用'ex:People'作爲屬性,因此,您必須定義'ex:Men'和'ex:Women'是'ex:People'的子屬性。然後,如果支持,則必須在三重商店中啓用推理。 – AKSW

+0

但是,更重要的是,這隻會導致兩行,這意味着您必須使用'sum'函數在SPARQL查詢中進行聚合。 – AKSW

回答

2

您應該意識到使用雙擊的事實,即與MenWomen相同的URI作爲OWL類和OWL數據屬性。我不明白你爲什麼這樣做。你爲什麼不介紹numberOfMen,numberOfWomennumberOfPeople等房產?

接下來,你使用ex:People作爲一個屬性,因此,你必須定義ex:Menex:Womenex:People子屬性。

<#People> a owl:DatatypeProperty ; 
    rdfs:label "People"@en . 

<#Men> a owl:DatatypeProperty ; 
    rdfs:subPropertyOf <#People> ; 
    rdfs:label "Men"@en . 

<#Women> a owl:DatatypeProperty ; 
    rdfs:subPropertyOf <#People> ; 
    rdfs:label "Women"@en . 

然後,如果支持或使用SPARQL 1.1屬性路徑,則必須在三重存儲中啓用推理。

但是,更重要的是,這隻會導致兩列,這意味着你必須做的聚集在你的SPARQL查詢使用sum功能,如:

SELECT ?X ?degree ?branch (sum(?_people) as ?people) 
WHERE { 
    ?X ex:Degree ?degree . 
    ?X ex:BranchKnowledge ?branch . 
    ?p rdfs:subPropertyOf* ex:People . 
    ?X ?p ?_people 
} 
GROUP BY ?X ?degree ?branch 

注意,這個查詢只能作品如果只有一個單一的度和分支,否則它會求和重複值。

+0

由於本體並不十分複雜,我曾想過將所有類和數據類型放入同一個URI中,以單個地址爲基礎,並用#引用每個元素;這是我第一次完全建立一個本體論,就像我看到它在幾個地方完成了一樣。將它們定義爲一個類的想法是能夠引用DBpedia或Schema.org的等效類。我是否可能會採用錯誤的方法? – germaaan

+0

順便說一下,在將#People,#Men和#Women更改爲「owl:DatatypeProperty」之後,我在查詢中發現錯誤(''語法錯誤''''''''''之前) ,但#Men和#Women分別仍然給我正確的結果。有什麼我可以做錯了嗎? – germaaan

+0

有一個缺少'.'。我現在修復了它 – AKSW