Как получить класс персонажа в OWL API

Как привести класс индивидуума в сову с мыслителем

        OWLOntologyManager manager = OWLManager.createOWLOntologyManager();
        OWLOntology ontology = manager.loadOntologyFromOntologyDocument(new StringDocumentSource(KOALA));


        IRI ontologyIRI = IRI.create("http://www.semanticweb.org/xxxxx/ontologies/2017/10/ontology");

        OWLDataFactory factory = manager.getOWLDataFactory();

        OWLIndividual john = factory.getOWLNamedIndividual(IRI.create(ontologyIRI + "#John"));

        OWLDataPropertyExpression hasConnexion= factory.getOWLDataProperty(IRI.create(ontologyIRI + "#hasConnexion"));

        OWLDataPropertyAssertionAxiom axiom = factory.getOWLDataPropertyAssertionAxiom(hasConnexion, john, 3);

        AddAxiom addAxiom = new AddAxiom(ontology, axiom);

        manager.applyChange(addAxiom);

        manager.saveOntology(ontology, new StreamDocumentTarget(System.out));


        //reasoner
        OWLReasonerFactory reasonerFactory = new StructuralReasonerFactory();
        OWLReasoner reasoner = reasonerFactory.createReasoner(ontology);


        OWLClass myClass= fac.getOWLClass(IRI.create("http://www.semanticweb.org/xxxxx/ontologies/2017/10/ontology#hasConnexion"));


        NodeSet<OWLNamedIndividual> individuals = reasoner.getInstances(myClass,
                false);
         for (Node<OWLNamedIndividual> i : individuals)
         {
             System.out.println(i.getClass());
         }

Я ожидаю, что результатом будет класс каждого человека, но мыслитель не дает результата. В протеже это работает хорошо, но когда я беру свою онтологию и пытаюсь сделать это с совой API, я не получаю никакого результата

2 ответа

Основываясь на Примерах OWL Api, вот два примера:

Получить подклассы стиля OWLClass:

OWLOntologyManager owlManager OWLManager.createOWLOntologyManager();

IRI iri = IRI.create("http://www.semanticweb.org/music-ontology#Style");

OWLClass style = owlManager.getOWLDataFactory().getOWLClass(iri);

OWLReasonerFactory reasonerFactory = new StructuralReasonerFactory();
OWLReasoner reasoner = reasonerFactory.createReasoner(ontologia);

NodeSet<OWLClass> subClasses = reasoner.getSubClasses(style, true);
Set<OWLClass> clses = subClasses.getFlattened();

Log.d(TAG, "Subclasses of Style: ");

for (OWLClass cls : clses) {
    String s = cls.toString();
    Log.d(TAG, s.substring(s.indexOf("#") + 1, s.length() -1));
}

Получить лиц OWLClass Rock:

OWLOntologyManager owlManager OWLManager.createOWLOntologyManager();

IRI iri = IRI.create("http://www.semanticweb.org/music-ontology#Rock");

OWLClass rock = owlManager.getOWLDataFactory().getOWLClass(iri);

OWLReasonerFactory reasonerFactory = new StructuralReasonerFactory();
OWLReasoner reasoner = reasonerFactory.createReasoner(ontologia);

NodeSet<OWLNamedIndividual> individualsNodeSet = reasoner.getInstances(rock, true);
Set<OWLNamedIndividual> individuals = individualsNodeSet.getFlattened();

Log.d(TAG, "Instances of Rock: ");

for (OWLNamedIndividual ind : individuals) {
    String s = ind.toString();
    Log.d(TAG, s.substring(s.indexOf("#") + 1, s.length() -1));
}

Да, это не сработает. i.getClass() даст вам класс Java, а не утвержденные типы личности. Чтобы получить заявленные типы лиц, вам нужно будет позвонить ontology.axioms(i).collect(Collectors.toSet()), Это вернет только те утверждения, которые были добавлены в онтологию.

Чтобы получить предполагаемые типы, вам нужно позвонить reasoner.types(i).collect(Collectors.toSet()),

Меня беспокоит то, что вы говорите, что не получили результатов. Я ожидаю, что вы должны получить много неправильных результатов (то есть классов Java, а не классов OWL). Итак, вы создаете онтологию во фрагменте кода. Причина, по которой вы не получаете никаких результатов, заключается в том, что вы не добавили аксиому утверждения класса для john, Вам нужно добавить factory.getOWLClassAssertionAxiom(owlClassExpression, john) где owlClassExpression представляет класс в вашей онтологии, как Person,

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