2014-01-14 43 views
2

我有一個複雜的OWL本體與許多類。我需要使用什麼SPARQL查詢來獲取一個OWL類(例如,Person類)的數據和對象屬性?如何使用SPARQL獲取OWL類的數據和對象屬性?

+0

類沒有對象和數據屬性。相反,個人具有對象和數據屬性的值。堆棧溢出問題需要比這個更具體一些;你能否舉一個你想要的數據類型的例子,以及你想要返回的結果? –

+0

我只是想要一個查詢來列出任何OWL本體中的一個OWL類的所有數據和對象屬性。下面的Jukka已經理解了我的問題並給出了一個解決方案。 – user1794211

+0

因爲OWL類沒有屬性,所以談論「自己的OWL類的數據和對象屬性」是不正確的。我在我的回答中已經解釋了更多關於此的內容,並且還提供了一個稍微修改的SPARQL查詢。 –

回答

7

除了Jukka Matilainen's answer,有一些應該加以考慮的幾點。 OWL不是面向對象的編程語言,類和屬性的概念與面向對象編程語言中的類和屬性不同。當我們斷言

p rdfs:domain C 

我們沒有做任何限制個人,p可以有一個值。也就是說,它是不相矛盾的,如果我們看到

x p something 

,我們不知道x是一個C。事實上,我們實際上是在說,當我們說p的域名C是,任何時候我們有一個三重的形式x p something,我們可以推斷x一個C。當與rdfs:subClassOf推理規則相結合

x p _  p rdfs:domain C 
------------------------- [1] 
     x rdf:type C 

這有一些潛在的令人吃驚的結果:我們可以將這個作爲三元組的推理規則。尤其要記住的是,當C rdfs:subClassOf D,這意味着任何時候我們有一個C的實例,我們可以推斷它也是D的一個實例。作爲推理規則:

x rdf:type C C rdfs:subClassOf D 
----------------------------------- [2] 
     x rdf:type D 

爲什麼這會導致令人驚訝的結果?那麼,這意味着如果p的域是C,並且CD的子類,那麼說D是的(或a)域也是合法的。爲什麼會這樣?那麼,假設x p _,那p rdfs:domain C,和那個C rdfs:subClassOf D。那麼,通過上面的規則[1],我們有那個x rdf:type C。但後來因爲CD的子類,我們也有x rdf:type D。由於x是任意的,因此我們只要有x p _,我們也有x rdf:type D,但這正是p rdfs:domain D的意思。

這意味着如果您嘗試檢索所有具有foaf:Person作爲域的屬性,則需要使用OWL推理器,而不僅僅是SPARQL查詢,如果您需要所有結果。只是要求聲明域名爲foaf:Person的內容不一定會找到所有結果。

有一個accepted answer用SPARQL查詢,但我還注意到,它可以通過使用values,而不是使用

{ ?property a owl:DatatypeProperty } UNION { ?property a owl:ObjectProperty } 

被清理了一下由於意圖是?property有兩個值之一作爲rdf:type,我們可以縮短查詢是:

PREFIX foaf: <http://xmlns.com/foaf/0.1/> 
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#> 
PREFIX owl: <http://www.w3.org/2002/07/owl#> 

SELECT ?property 
FROM <http://xmlns.com/foaf/spec/index.rdf> 
WHERE { 
    values ?propertyType { owl:DatatypeProperty owl:ObjectProperty } 
    ?property a ?propertyType ; 
      rdfs:domain foaf:Person . 
} 

如上所述,你可能要包括其聲明域是foaf:Person的子類的任何屬性,雖然我們無法使用SPARQL查詢計算整個OWL類層次結構,但我們至少可以使用屬性路徑:

PREFIX foaf: <http://xmlns.com/foaf/0.1/> 
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#> 
PREFIX owl: <http://www.w3.org/2002/07/owl#> 

SELECT ?property 
FROM <http://xmlns.com/foaf/spec/index.rdf> 
WHERE { 
    values ?propertyType { owl:DatatypeProperty owl:ObjectProperty } 
    ?property a ?propertyType ; 
      rdfs:domain/rdfs:subClassOf* foaf:Person . 
} 
2

如果您想查詢OWL本體(例如FOAF ontology)以找出具有聲明爲其域的給定類(例如foaf:Person)的數據類型屬性和對象屬性,則可以使用SPARQL查詢這樣的:

PREFIX foaf: <http://xmlns.com/foaf/0.1/> 
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#> 
PREFIX owl: <http://www.w3.org/2002/07/owl#> 

SELECT ?property 
FROM <http://xmlns.com/foaf/spec/index.rdf> 
WHERE { 
    { ?property a owl:DatatypeProperty } UNION { ?property a owl:ObjectProperty } 
    ?property rdfs:domain foaf:Person 
} 
+0

謝謝Jukka,這個查詢可以很好地工作並解決我的問題。 – user1794211

+0

請注意,您可以在這裏使用'values'而不是'union',如'select ... {values?propertyType {owl:DatatypeProperty owl:ObjectProperty}?property a?propertyType; rdfs:domain foaf:Person。 }'。 –

相關問題