我有一个使用Protégé3.4设计的简单本体。我已经介绍了一些“必要且充足”的条件,比如Table类的定义:
http://postimage.org/image/f37xliqad/
忘掉两个第一个条件,第三个条件更容易理解:)
生成的OWL代码是:
<?xml version="1.0"?>
<rdf:RDF
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:protege="http://protege.stanford.edu/plugins/owl/protege#"
xmlns:xsp="http://www.owl-ontologies.com/2005/08/07/xsp.owl#"
xmlns:assert="http://www.owl-ontologies.com/assert.owl#"
xmlns:owl="http://www.w3.org/2002/07/owl#"
xmlns:sqwrl="http://sqwrl.stanford.edu/ontologies/built-ins/3.4/sqwrl.owl#"
xmlns:xsd="http://www.w3.org/2001/XMLSchema#"
xmlns:swrl="http://www.w3.org/2003/11/swrl#"
xmlns:swrlb="http://www.w3.org/2003/11/swrlb#"
xmlns="http://www.owl-ontologies.com/Ontology1317586695.owl#"
xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#"
xmlns:swrla="http://swrl.stanford.edu/ontologies/3.3/swrla.owl#"
xml:base="http://www.owl-ontologies.com/Ontology1317586695.owl">
<owl:Ontology rdf:about="">
<owl:imports rdf:resource="http://swrl.stanford.edu/ontologies/3.3/swrla.owl"/>
<owl:imports rdf:resource="http://sqwrl.stanford.edu/ontologies/built-ins/3.4/sqwrl.owl"/>
</owl:Ontology>
...
<owl:Class rdf:ID="Table">
<owl:disjointWith>
<owl:Class rdf:ID="Chair"/>
</owl:disjointWith>
<owl:equivalentClass>
<owl:Class>
<owl:intersectionOf rdf:parseType="Resource">
<rdf:first>
<owl:Restriction>
<owl:onProperty>
<owl:ObjectProperty rdf:ID="has_coarseArea"/>
</owl:onProperty>
<owl:someValuesFrom>
<owl:Class>
<owl:unionOf rdf:parseType="Collection">
<owl:Class rdf:about="#MMAround09"/>
<owl:Class rdf:about="#MMAround1"/>
<owl:Class rdf:about="#MMAround12"/>
<owl:Class rdf:about="#MMAround15"/>
<owl:Class rdf:about="#MMAround2"/>
</owl:unionOf>
</owl:Class>
</owl:someValuesFrom>
</owl:Restriction>
</rdf:first>
<rdf:rest rdf:parseType="Resource">
<rdf:first>
<owl:Restriction>
<owl:someValuesFrom>
<owl:Class>
<owl:unionOf rdf:parseType="Collection">
<owl:Class rdf:about="#MMAround07"/>
<owl:Class rdf:about="#MMAround08"/>
</owl:unionOf>
</owl:Class>
</owl:someValuesFrom>
<owl:onProperty>
<owl:ObjectProperty rdf:ID="has_coarseCentroidHeight"/>
</owl:onProperty>
</owl:Restriction>
</rdf:first>
<rdf:rest>
<rdf:List>
<rdf:first>
<owl:Restriction>
<owl:someValuesFrom>
<owl:Class rdf:about="#Horizontal"/>
</owl:someValuesFrom>
<owl:onProperty>
<owl:ObjectProperty rdf:about="#has_orientation"/>
</owl:onProperty>
</owl:Restriction>
</rdf:first>
<rdf:rest rdf:resource="http://www.w3.org/1999/02/22-rdf-syntax-ns#nil"/>
</rdf:List>
</rdf:rest>
</rdf:rest>
</owl:intersectionOf>
</owl:Class>
</owl:equivalentClass>
<rdfs:subClassOf>
<owl:Class rdf:ID="Furniture"/>
</rdfs:subClassOf>
</owl:Class>
如果我理解得很好,这些条件被解释为限制,并作为Table类的超类进行管理。
所以,如果我用Jena加载我的本体和类表:
1. String NS = "http://www.owl-ontologies.com/Ontology1317586695.owl#";
2. OntModel model = ModelFactory.createOntologyModel(PelletReasonerFactory.THE_SPEC);
3. model.read(OWL_FILE_NAME);
4. OntClass Table = model.getOntClass( NS + "Table" );
由于正确加载了Table OntClass,因此NS变量具有正确的值。然后,在执行以下代码时,应该到达第10行,但不是:
5. for (Iterator<OntClass> supers = Table.listSuperClasses(true); supers.hasNext(); ) {
6. OntClass superClass = supers.next();
7.
8. if (superClass.isRestriction())
9. {
10. System.out.println("Restriction found");
11. }
12. }
我也尝试使用Table.listEquivalentClasses(),但没有成功。
关于我在路上失去什么的任何想法?
更新
测试由Ian很好地实现并在此处共享的代码:https://gist.github.com/4065533,它工作正常。但改变
OntModel m = ModelFactory.createOntologyModel( OntModelSpec.OWL_MEM_MICRO_RULE_INF );
通过
OntModel m = ModelFactory.createOntologyModel( PelletReasonerFactory.THE_SPEC );
它停止工作。似乎Pellet并不认为这些限制是班级的超级条款。
答案 0 :(得分:0)
此类问题的最常见原因是URI与完全匹配。如果您已经包含了实际数据的片段,如Turtle或RDF XML,并且如果您已经说明NS
的值是什么,那么可以明确地将其排除在外。
一般来说,发布编辑工具用户界面的屏幕抓文对于那些希望帮助您发布源代码本身的人来说并不是那么有用。
<强>更新强>
嗯,这对我有用。我把我的(提示:runnable)代码放在gist https://gist.github.com/4065533
中。我可以在我的代码和你的代码之间发现的唯一区别是OWL_FILE_NAME
var(可能你已经检查过你正在加载正确的输入源?),以及我目前没有的Pellet的使用。您可以通过交换到Jena规则推理器来检查问题的根源是否不是Pellet,但我强烈怀疑Pellet将是一个因素。
请尝试我的gist代码,看看是否有助于解决问题。如果仍然无法使代码正常工作,请发布一个可运行的最小测试用例。它应该是可以运行的,而不必猜测或填写任何遗漏的信息。
答案 1 :(得分:0)
我自己回答:
最后,我发现此链接如何解释为什么限制未被列为超类:http://clarkparsia.com/pellet/faq/different-results/