我正在使用Protege 5中的SPARQL Query选项卡来查询我一直在构建的OWL本体。我在许多类型的查询中都成功了,但是当我在相同的查询(显然是格式良好的)中使用我的本体的某些特定类时,它们不会返回任何结果。下面是两个有问题的查询——假设"Event"是本体的一个概念(http://www.semanticweb.org/ontologies/2014/5/MyOnto#Event):
)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 onto: <http://www.semanticweb.org/ontologies/2014/5/MyOnto#>
SELECT ?a WHERE { ?a rdfs:subClassOf onto:Event }
和,前缀相同
SELECT ?a WHERE { ?a rdfs:range onto:Event }
都不返回结果。但是,如果我将"onto:Event"替换为?b,则两者都会返回一长串结果—包括Event作为?b的匹配项。
是我误用或忘记的东西(尽管我在互联网上的几个链接中看到过这种模式,人们声称已经得到了结果),还是SPARQL的限制或Protege选项卡的一些问题?
问题是,事实上,尽管本体的URI是:
<http://www.semanticweb.org/ontologies/2014/5/MyOnto#>
在OWL文档中,类名之前使用的前缀是IRI:
<http://www.semanticweb.org/ontologies/2014/2/untitled-ontology-662#>
因此,用
替换旧的onto:
PREFIX onto: <http://www.semanticweb.org/ontologies/2014/2/untitled-ontology-662#>
解决了这个问题。
(感谢来自prot
注::值得注意的是,不能想当然地认为本体中的所有术语都是<current_ontology_URI#term>
,例如,如果在本体中包含了某些术语,然后更改了本体URI,则这些术语将被识别为<previous_ontology_URI#term>
,而新的术语将被识别为<current_ontology_URI#term>
(这正是上述问题的原因)。
我有同样的问题,每当使用特定于本体的类时,尽管应该有结果,但没有结果。我的本体(pizza.owl)是从本地文件加载的。我发现需要在PREFIX中添加文件名。
PREFIX : <http://www.co-ode.org/ontologies/pizza/pizza.owl#>
在那之后我得到了我所期望的信息