2013-07-30 22 views
1

我有两个本体,photo1和索引。 Photo1包含ABox断言,并且索引包含Tbox断言。Reasoner不返回任何owl实例:事情,但Abox包含实例

OWLOntologyManager manager = OWLManager.createOWLOntologyManager(); 
OWLOntology photo1 = manager.loadOntologyFromOntologyDocument(new File("files/ontologies/OBMA2/photo1.owl")); 
OWLDataFactory factory = manager.getOWLDataFactory(); 
reasoner = new FaCTPlusPlusReasonerFactory().createReasoner(photo1); 
reasoner = (FaCTPlusPlusReasoner) reasoner; 
System.out.println(reasoner.getInstances(factory.getOWLThing(), false)); 

上面打印:

Nodeset[ 
    Node(<http://www.semanticweb.org/noor/ontologies/2013/6/photo1.owl#photo1>), 
    Node(<http://www.semanticweb.org/noor/ontologies/2013/6/photo1.owl#photo1-tiger2>), 
    Node(<http://www.semanticweb.org/noor/ontologies/2013/6/photo1.owl#photo1-tiger1>) 
] 

但是,现在,我加载TBOX和增加从照片1所有ABox中的公理,然后得到的owl:Thing情况如下:

OWLOntologyManager managerTbox = OWLManager.createOWLOntologyManager(); 
OWLOntology Tbox = manager.loadOntologyFromOntologyDocument(new File("files/ontologies/index.owl")); 
OWLDataFactory factoryTbox = manager.getOWLDataFactory(); 
OWLReasoner reasonerTbox = new FaCTPlusPlusReasonerFactory().createReasoner(Tbox); 

//adding the axioms from the photo1 abox to Tbox's abox 
managerTbox.addAxioms(Tbox, photo1.getABoxAxioms(true)); 
reasonerTbox = (FaCTPlusPlusReasoner) reasonerTbox; 
System.out.println(reasonerTbox.getInstances(factoryTbox.getOWLThing(), false)); 

现在,即使我已经将Photo1的ABox的所有公理添加到TBox的ABox中,但我没有输出:

Nodeset[] 

回答

0

我没有太多的OWL API的用户,但我怀疑发生的事情是,你包括在第二种情况下,ABox中公理不包括个人的公理的个人声明谈论,结果,ABox公理被忽略。

从OWLAPI来源,ABoxAxiomTypes被定义为:

public static final Set<AxiomType<?>> ABoxAxiomTypes = new HashSet<AxiomType<?>>(
     Arrays.asList(CLASS_ASSERTION, SAME_INDIVIDUAL, 
       DIFFERENT_INDIVIDUALS, OBJECT_PROPERTY_ASSERTION, 
       NEGATIVE_OBJECT_PROPERTY_ASSERTION, 
       DATA_PROPERTY_ASSERTION, NEGATIVE_DATA_PROPERTY_ASSERTION, 
       DATATYPE_DEFINITION)); 

我预计,如果你添加照片1的OWLDeclarationAxiom首(它看起来像你检索使用getAxioms(AxiomType<Declaration>),然后添加其ABoxAxioms,您可能会得到您期望的结果

1

您正在创建一个缓冲推理器,并首次调用推理工厂;然后您将正确的公理添加到本体中,但推理器不会看到更新,直到你致电reasoner.flush()

您可以使用同一工厂创建非缓冲推理器(请参阅OWLReasonerFactory.createNonBufferingReasoner()),但这可能会产生性能影响,因为每次更改都可能会发生重新分类。

相关问题