我是SPARQL的初学者。我有pizza ontology,我正在尝试编写一个列出所有热配料的查询。到目前为止,我已经想出了这个:
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 :(得分:2)
简短回答:没有任何内容符合您的查询。通过运行
,您可以看到与查询结构匹配的所有内容,而没有给定的辛辣值PREFIX pizza: <http://www.co-ode.org/ontologies/pizza/pizza.owl#>
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 |
+------------------------------+------------+
答案 1 :(得分:0)
我认为您只需要选择Pizza Topping的所有子类,然后您的查询应该正常工作:
SELECT ?targetPizza
WHERE {
?targetPizza rdfs:subClassOf* pizza:PizzaTopping .
?targetPizza rdfs:subClassOf ?restriction .
?restriction owl:onProperty pizza:hasSpiciness .
?restriction owl:someValuesFrom pizza:Hot .
}
答案 2 :(得分:-1)
SELECT ?targetPizza
WHERE {
?targetPizza rdfs:subClassOf pizza:PizzaTopping .
?targetPizza rdfs:subClassOf ?restriction .
?restriction owl:onProperty pizza:hasSpiciness .
?restriction owl:someValuesFrom pizza:Hot .
}