SPARQL - 基于某些 属性 的查询

SPARQL - Query based on some property

我想获取所有有奶酪配料的披萨名称,但结果显示 (_:b0) 这是一种 owl 限制,下面是我的查询

PREFIX pizza: <http://www.co-ode.org/ontologies/pizza/pizza.owl#>
SELECT ?X WHERE {
    ?X rdfs:subClassOf* [
        owl:onProperty pizza:hasTopping ;
        owl:someValuesFrom pizza:CheeseTopping
    ]
}

使用来自斯坦福的披萨 ontology

该查询有效,但非常复杂并且可能不完整,因为一些比萨饼使用复杂的 OWL 结构:

PREFIX pizza: <http://www.co-ode.org/ontologies/pizza/pizza.owl#>
SELECT DISTINCT ?pizza WHERE {

  {
    ?pizza rdfs:subClassOf* pizza:Pizza .
    ?pizza owl:equivalentClass|rdfs:subClassOf [
      rdf:type owl:Restriction ;
      owl:onProperty pizza:hasTopping ;
               owl:someValuesFrom/rdfs:subClassOf* pizza:CheeseTopping 
      ]

   } UNION {
    ?pizza  owl:equivalentClass  _:b0 .
    _:b0    rdf:type             owl:Class ;
            owl:intersectionOf   _:b1 .
    _:b1 (rdf:rest)*/rdf:first ?otherClass.
     ?otherClass rdf:type owl:Restriction ;
               owl:onProperty pizza:hasTopping ;
               owl:someValuesFrom/rdfs:subClassOf* pizza:CheeseTopping 


   }
}

这有效(没有启用推理)

 PREFIX pizza: <http://www.co-ode.org/ontologies/pizza/pizza.owl#>
 SELECT ?X ?topping WHERE {
     ?X rdfs:subClassOf ?Y .  
     ?Y owl:someValuesFrom ?topping .
     ?topping rdfs:subClassOf* pizza:CheeseTopping
 } 
 ORDER BY ?X

有些被列出不止一次,因为它们可能包含不止一种 CheeseTopping。要删除重复项:

 PREFIX pizza: <http://www.co-ode.org/ontologies/pizza/pizza.owl#>
 SELECT DISTINCT ?X WHERE {
        ?X rdfs:subClassOf ?Y .  
        ?Y owl:someValuesFrom ?topping .
        ?topping rdfs:subClassOf* pizza:CheeseTopping
 }
 ORDER BY ?X

如果您启用推理器,这将起作用:

PREFIX pizza: <http://www.co-ode.org/ontologies/pizza/pizza.owl#>
SELECT DISTINCT ?X WHERE {
    ?X rdfs:subClassOf pizza:CheeseyPizza
}

参考: 使用这里的披萨 ontology:http://protege.stanford.edu/ontologies/pizza/pizza.owl