比萨本体的SPARQL查询

时间:2017-07-17 21:00:33

标签: sparql

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

}

但是,它返回一个空结果。为什么我的查询错了?

提前感谢您的帮助。

3 个答案:

答案 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 .

}