假设我们有这个本体:

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

最佳答案

查看您的代码,访问者看起来正确,应该输出您需要的内容。但是,您仅将其应用于包含B的公理。将其应用于所有等效的类公理,并查看其是否产生预期的结果。

编辑:在没有本体可用的情况下,访问者无法访问本体中的其他公理-这是因为A不会链接到使用它的公理。该关系保存在本体索引中。

因此,访问者需要访问本体并查找等效的公理,这些公理包含根公理中涉及的命名类。

OWLEquivalentClassesAxiom equivalentAxiom = owlOnt.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);

08-25 14:17