OWLApi访问者模式:获取超类公理

问题描述 投票:0回答:1

假设我们有这个本体:

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
java owl ontology owl-api
1个回答
0
投票
查看您的代码,访问者看起来正确,应该输出您需要的内容。但是,您仅将其应用于包含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); } };

equivalentAxiom.accept(v);
© www.soinside.com 2019 - 2024. All rights reserved.