在Protege 4.3中查询Pizza.owl属性时返回空结果的问题
问题分析与解决
你的第一个SPARQL查询返回空结果的核心原因是:Pizza.owl本体中只定义了类、属性和类级别的约束,没有任何实际的个体(Instance)数据。
具体拆解问题:
你的第一个查询在寻找三类资源:
?pizzaClass:NamedPizza的子类(这部分是存在的,比如MargheritaPizza、PepperoniPizza等)?pizzaInstance:属于这些披萨类的个体实例(但Pizza.owl里根本没创建这类个体,比如没有一个叫myFavoriteMargherita的实体被声明为rdf:type :MargheritaPizza)?toppingInstance:被披萨实例通过hasTopping关联的配料个体(同样,本体里只有配料类,没有配料实例)
对比你能正常运行的第二个查询:
注意它的变量名?pizzaInstance其实起错了——这个查询实际返回的是Pizza的子类(也就是各种披萨类),而不是实例。把变量名改成?pizzaClass会更准确,它能得到结果是因为本体里确实存在大量Pizza的子类定义。
如果你想查询类层面的配料约束(而非实例)
如果你的目标是找出每种披萨类要求的配料,可以改写查询,针对类的rdfs:subClassOf里的属性限制来查询,示例如下:
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> PREFIX owl: <http://www.w3.org/2002/07/owl#> PREFIX xsd: <http://www.w3.org/2001/XMLSchema#> PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#> PREFIX : <http://www.co-ode.org/ontologies/pizza/pizza.owl#> SELECT ?pizzaClass ?toppingClass WHERE { ?pizzaClass rdfs:subClassOf :NamedPizza . ?pizzaClass rdfs:subClassOf [ rdf:type owl:Restriction ; owl:onProperty :hasTopping ; owl:someValuesFrom ?toppingClass ] . }
这个查询会返回每个NamedPizza子类对应的配料类(比如MargheritaPizza对应MozzarellaTopping和TomatoTopping)。
如果你想得到实例层面的结果
那你需要手动在Protege中创建披萨和配料的个体,比如:
- 创建个体
margherita1,设置它的类型为MargheritaPizza - 创建个体
mozzarella1,设置它的类型为MozzarellaTopping - 给
margherita1添加hasTopping属性值为mozzarella1
之后再运行你原来的第一个查询,就能得到结果了。
内容的提问来源于stack exchange,提问作者Hello Lili
相关产品推荐
相关产品推荐

