Шаблон посетителей OWLApi: получить аксиому суперкласса - PullRequest
0 голосов
/ 29 января 2020

Предположим, у нас есть эта онтология:

Class A:
     equivalentTo: hasRel D

Class B:
     equivalentTo: A and hasRel C

Class C
Class D

ObjectProperty: hasRel

Используя шаблон посетителя, получить hasRel C аксиому (как OWLObjectSomeValuesFrom):

 OWLEquivalentClassesAxiom equivalentAxiom = owlOnt.equivalentClassesAxioms(B);

OWLObjectVisitor v = new OWLObjectVisitor() {

            public void visit(OWLEquivalentClassesAxiom ax) {
                ax.classExpressions().forEach(c -> c.accept(this));
            }

            public void visit(OWLObjectSomeValuesFrom ce) {
                String property = ce.getProperty().toString();
                String filler = ce.getFiller().toString();

                System.out.println(property);
                System.out.println(filler);

            }
        };

equivalentAxiom.accept(v);

, но этот код не имеет правильной visit метод для прохождения класса A.
мне нужно иметь что-то вроде этого в качестве вывода:

hasRel D 
hasRel C

1 Ответ

0 голосов
/ 30 января 2020

Глядя на ваш код, посетитель выглядит правильно и должен вывести то, что вам нужно. Однако вы применяете его только к аксиомам, которые содержат B. Примените его ко всем эквивалентным аксиомам классов и посмотрите, приведет ли он к ожидаемому результату.

Редактировать: посетитель не может получить доступ к другим аксиомам в онтологии, если для него не доступна онтология - это потому, что A не делает ссылка на аксиомы, которые его используют; это отношение содержится в индексах онтологии.

Таким образом, посетителю необходимо получить доступ к онтологии и найти эквивалентные аксиомы, которые содержат именованные классы, включенные в вашу root аксиому. .equivalentClassesAxioms (B);

OWLObjectVisitor v = новый OWLObjectVisitor () {

        public void visit(OWLEquivalentClassesAxiom ax) {
            ax.classExpressions().forEach(c -> c.accept(this));
            ax.getNamedClasses().forEach(c -> owlOnt.equivalentClassesAxioms(c).forEach(q->q.accept(this)));
        }

        public void visit(OWLObjectSomeValuesFrom ce) {
            String property = ce.getProperty().toString();
            String filler = ce.getFiller().toString();

            System.out.println(property);
            System.out.println(filler);

        }
    };

эквивалентный Axiom.accept (v);

...