Reasoner не возвращает экземпляры owl:Thing, но Abox содержит экземпляры

У меня есть две онтологии, photo1 и index. Фото1 содержит утверждения ABox, а индекс содержит утверждения Tbox.

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 и добавляю все аксиомы ABox из photo1, а затем получаю экземпляры 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));

Теперь, несмотря на то, что я добавил все аксиомы из ABox для Photo1 в ABox для TBox, я не получаю вывод:

Nodeset[]

2 ответа

Вы создаете буферный доводчик с первым вызовом фабрики рассуждений; тогда вы правильно добавляете аксиомы в онтологию, но рассудитель не увидит обновления, пока вы не позвоните reasoner.flush(),

Вы можете создать не буферизирующий модуль с той же фабрикой (см. OWLReasonerFactory.createNonBufferingReasoner()), но это может повлиять на производительность, поскольку при каждом изменении может быть произведена реклассификация.

Я не большой пользователь 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, вы можете получить ожидаемые результаты.

Другие вопросы по тегам