基于Pizza本体的SPARQL查询

基于Pizza本体的SPARQL查询,sparql,Sparql,我是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#>

我是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 .

}
前缀rdf:
前缀比萨饼:
前缀rdfs:
前缀xsd:
前缀owl:
选择?目标披萨
在哪里{
?配料RDF:比萨子类:比萨配料。
?顶级RDF:子类?限制。
?限制猫头鹰:onProperty比萨饼:Hasspicness。
?限制猫头鹰:比萨饼的一些价值:热。
}
但是,它返回一个空结果。为什么我的问题是错误的


提前感谢您的帮助。

简短回答:没有与您的查询匹配的内容。通过运行

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

}
前缀比萨饼:
前缀rdf:
前缀rdfs:
前缀owl:
选择*WHERE{
?配料RDF:比萨子类:比萨配料。
?顶级RDF:子类?限制。
?限制rdf:类型owl:限制。
?限制?采购订单。
}
结果:

+--------------------+---------------------+---------------------+
|      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         |
+--------------------+---------------------+---------------------+
+------------------------------+
|              s               |
+------------------------------+
|  pizza:HotGreenPepperTopping |
|  pizza:JalapenoPepperTopping |
|  pizza:TobascoPepperSauce    |
|  pizza:CajunSpiceTopping     |
|  pizza:HotSpicedBeefTopping  |
+------------------------------+
+------------------------------+------------+
|              s               |    type    |
+------------------------------+------------+
|  pizza:HotGreenPepperTopping |  owl:Class |
|  pizza:JalapenoPepperTopping |  owl:Class |
|  pizza:TobascoPepperSauce    |  owl:Class |
|  pizza:CajunSpiceTopping     |  owl:Class |
|  pizza:HotSpicedBeefTopping  |  owl:Class |
+------------------------------+------------+
那么这里有什么问题?下一步是反过来,即我们检查所有与辣味相关的东西:

前缀比萨饼:
前缀rdfs:
前缀owl:
选择不同的位置{
?s rdfs:子类?限制。
?限制猫头鹰:onProperty比萨饼:Hasspicness。
?限制猫头鹰:比萨饼的一些价值:热。
}
结果:

+--------------------+---------------------+---------------------+
|      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         |
+--------------------+---------------------+---------------------+
+------------------------------+
|              s               |
+------------------------------+
|  pizza:HotGreenPepperTopping |
|  pizza:JalapenoPepperTopping |
|  pizza:TobascoPepperSauce    |
|  pizza:CajunSpiceTopping     |
|  pizza:HotSpicedBeefTopping  |
+------------------------------+
+------------------------------+------------+
|              s               |    type    |
+------------------------------+------------+
|  pizza:HotGreenPepperTopping |  owl:Class |
|  pizza:JalapenoPepperTopping |  owl:Class |
|  pizza:TobascoPepperSauce    |  owl:Class |
|  pizza:CajunSpiceTopping     |  owl:Class |
|  pizza:HotSpicedBeefTopping  |  owl:Class |
+------------------------------+------------+
那么,这怎么可能呢?简单的回答是,没有一种辣味配料被定义为类
pizza:PizzaTopping
的实例,您可以使用额外的可选三重模式来验证这一点

前缀rdf:
前缀比萨饼:
前缀rdfs:
前缀owl:
选择不同的s类型,其中{
?s rdfs:子类?限制。
?限制猫头鹰:onProperty比萨饼:Hasspicness。
?限制猫头鹰:比萨饼的一些价值:热。
可选{s rdf:type?type}
}
结果:

+--------------------+---------------------+---------------------+
|      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         |
+--------------------+---------------------+---------------------+
+------------------------------+
|              s               |
+------------------------------+
|  pizza:HotGreenPepperTopping |
|  pizza:JalapenoPepperTopping |
|  pizza:TobascoPepperSauce    |
|  pizza:CajunSpiceTopping     |
|  pizza:HotSpicedBeefTopping  |
+------------------------------+
+------------------------------+------------+
|              s               |    type    |
+------------------------------+------------+
|  pizza:HotGreenPepperTopping |  owl:Class |
|  pizza:JalapenoPepperTopping |  owl:Class |
|  pizza:TobascoPepperSauce    |  owl:Class |
|  pizza:CajunSpiceTopping     |  owl:Class |
|  pizza:HotSpicedBeefTopping  |  owl:Class |
+------------------------------+------------+

我认为您只需选择Pizza Topping的所有子类,那么您的查询应该可以正常工作:

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

}

为什么选择
?targetPizza
而不是
?topping
变量?我认为变量的选择没有多大区别。难道不应该退回所有有热馅的比萨饼吗?但即使我把它改为topping,它仍然是一个空结果。“变量的选择没有什么区别”?选择未在查询中绑定的变量
?targetPizza
。为什么你认为这无关紧要?之前我试着用蔬菜浇头替换比萨浇头,我用淡的而不是热的,这样做很有效。但我不知道它是否适用于所有情况。请看下面我的答案,它解释了为什么它不适用于辣味配料-原因是,比萨饼本体数据是异构建模,即使是配料。谢谢您,先生,非常感谢您的回答。