2017-07-17 28 views
0

我是SPARQL的初學者。我有pizza ontology,我試圖編寫一個列出所有熱澆頭的查詢。到目前爲止,我已經想出了這個:比薩本體上的SPARQL查詢

PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> 
PREFIX pizza: <http://www.co-ode.org/ontologies/pizza/pizza.owl#> 
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#> 
PREFIX xsd: <http://www.w3.org/2001/XMLSchema#> 
PREFIX owl: <http://www.w3.org/2002/07/owl#> 

SELECT ?targetPizza 
WHERE { 
?topping rdfs:subClassOf pizza:PizzaTopping . 
?topping rdfs:subClassOf ?restriction . 
?restriction owl:onProperty pizza:hasSpiciness . 
?restriction owl:someValuesFrom pizza:Hot . 

} 

但是,它返回一個空的結果。爲什麼我的查詢錯誤?

在此先感謝您的幫助。

+0

爲什麼選擇'?targetPizza'而不是'?topping'變量? – AKSW

+0

我認爲變量的選擇沒有太大的區別。不應該把所有比薩餅都用熱騰騰的麪包回來?但即使我把它改成一流,它仍然是一個空的結果。 – Nick

+0

「變量的選擇沒有什麼區別」?您選擇未在查詢中綁定的變量'?targetPizza'。你爲什麼認爲這並不重要? – AKSW

回答

1

簡答:沒有什麼與您的查詢匹配。你可以看到的一切,將通過運行

PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> 
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#> 
PREFIX owl: <http://www.w3.org/2002/07/owl#> 

SELECT * WHERE { 
    ?topping rdfs:subClassOf pizza:PizzaTopping . 
    ?topping rdfs:subClassOf ?restriction . 
    ?restriction rdf:type owl:Restriction . 
    ?restriction ?p ?o . 
} 

結果符合您查詢的結構沒有給出辣味值:

+--------------------+---------------------+---------------------+ 
|  topping  |   p   |   o   | 
+--------------------+---------------------+---------------------+ 
| pizza:FishTopping | rdf:type   | owl:Restriction | 
| pizza:FishTopping | owl:onProperty  | pizza:hasSpiciness | 
| pizza:FishTopping | owl:someValuesFrom | pizza:Mild   | 
| pizza:NutTopping | rdf:type   | owl:Restriction | 
| pizza:NutTopping | owl:onProperty  | pizza:hasSpiciness | 
| pizza:NutTopping | owl:someValuesFrom | pizza:Mild   | 
+--------------------+---------------------+---------------------+ 

所以這裏有什麼問題嗎?下一步將圍繞走另一條路,即我們檢查是與熱辛辣的一切:

PREFIX pizza: <http://www.co-ode.org/ontologies/pizza/pizza.owl#> 
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#> 
PREFIX owl: <http://www.w3.org/2002/07/owl#> 

SELECT DISTINCT ?s WHERE { 
    ?s rdfs:subClassOf ?restriction . 
    ?restriction owl:onProperty pizza:hasSpiciness . 
    ?restriction owl:someValuesFrom pizza:Hot . 
} 

結果:

+------------------------------+ 
|    s    | 
+------------------------------+ 
| pizza:HotGreenPepperTopping | 
| pizza:JalapenoPepperTopping | 
| pizza:TobascoPepperSauce | 
| pizza:CajunSpiceTopping  | 
| pizza:HotSpicedBeefTopping | 
+------------------------------+ 

那麼,怎麼會這樣?嗯,簡單的答案是,沒有辛辣配料被定義爲類pizza:PizzaTopping的情況下,你可以用一個額外的可選三合一模式驗證此

PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> 
PREFIX pizza: <http://www.co-ode.org/ontologies/pizza/pizza.owl#> 
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#> 
PREFIX owl: <http://www.w3.org/2002/07/owl#> 

SELECT distinct ?s ?type WHERE { 
    ?s rdfs:subClassOf ?restriction . 
    ?restriction owl:onProperty pizza:hasSpiciness . 
    ?restriction owl:someValuesFrom pizza:Hot . 
    OPTIONAL {?s rdf:type ?type } 
} 

結果:

+------------------------------+------------+ 
|    s    | type | 
+------------------------------+------------+ 
| pizza:HotGreenPepperTopping | owl:Class | 
| pizza:JalapenoPepperTopping | owl:Class | 
| pizza:TobascoPepperSauce | owl:Class | 
| pizza:CajunSpiceTopping  | owl:Class | 
| pizza:HotSpicedBeefTopping | owl:Class | 
+------------------------------+------------+ 
+0

謝謝先生,您的回答非常感謝。 – Nick

-1
SELECT ?targetPizza 
WHERE { 
?targetPizza rdfs:subClassOf pizza:PizzaTopping . 
?targetPizza rdfs:subClassOf ?restriction . 
?restriction owl:onProperty pizza:hasSpiciness . 
?restriction owl:someValuesFrom pizza:Hot . 

} 
+0

對不起,這不起作用。 – Nick

0

我想你只需要選擇比薩餅的子類,那麼你查詢應正常工作:

SELECT ?targetPizza 
WHERE { 
?targetPizza rdfs:subClassOf* pizza:PizzaTopping . 
?targetPizza rdfs:subClassOf ?restriction . 
?restriction owl:onProperty pizza:hasSpiciness . 
?restriction owl:someValuesFrom pizza:Hot . 

}