获取对象属性和类

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

我试图得到以下关系:狗主人有宠物狗enter image description here。我使用以下代码执行此操作:

   for(OWLClass clazzzz : ontology.getClassesInSignature()){

         if(clazzzz.getEquivalentClasses(ontology).size()!=0 ) { 

for(OWLClassExpression ax: clazzzz.getEquivalentClasses(ontology)) {

                OWLObjectVisitorAdapter visitor = new OWLObjectVisitorAdapter() {
                @Override
                public void visit(OWLObjectIntersectionOf ce) {
                    for (OWLClassExpression e : ce.getOperands()) {
                if ( e.getObjectPropertiesInSignature().size()==1  )
                            {
System.out.println(clazzzz.getIRI().getFragment()+" ---> "+e.getObjectPropertiesInSignature()+" ---> "+ e.getSignature() );

                        }

                    }

}
                };

                ax.accept(visitor);

            }
         }
     }

它可以工作,但我需要分别获取对象属性和类狗:我的意思是狗作为一个类,并且有宠物作为对象属性,而不是让整个表达式包含它们。另一个问题:我的代码必须返回作为表达式一部分的本体的所有类,但是当我们对complementOf有限制时跳过这种情况必须跳过这种情况,如果你有任何想法我怎么能将这个条件重新形成我的代码。例如,我的代码不应该考虑以下示例中的素食者:

<owl:Class rdf:about="http://owl.man.ac.uk/2005/07/sssw/peoplePrétraitée#vegetarian">
        <owl:equivalentClass>
            <owl:Class>
                <owl:intersectionOf rdf:parseType="Collection">
                    <rdf:Description rdf:about="http://owl.man.ac.uk/2005/07/sssw/peoplePrétraitée#animal"/>
                    <owl:Restriction>
                        <owl:onProperty rdf:resource="http://owl.man.ac.uk/2005/07/sssw/peoplePrétraitée#eats"/>
                        <owl:allValuesFrom>
                            <owl:Class>
                                <owl:complementOf rdf:resource="http://owl.man.ac.uk/2005/07/sssw/peoplePrétraitée#animal"/>
                            </owl:Class>
                        </owl:allValuesFrom>
                    </owl:Restriction>

谢谢你的帮忙

java owl ontology owl-api
2个回答
0
投票

正如@AKSW建议的那样,最好的方法是使用访问者,特别是OWLObjectVisitor。为方便起见,您可以扩展OWLObjectVisitorAdapter,因为您只需要对遇到的特定对象执行操作。

因此,访问您已经找到的表达式的部分:

final OWLObjectVisitor v =new OWLObjectVisitorAdapter(){
            @Override
            public void visit(OWLObjectIntersectionOf ce) {
                for (OWLClassExpression e : ce.getOperands()) {
                    e.accept(v);
                }
            }

            @Override
            public void visit(OWLClass c){
                System.out.println(c);
            }

            @Override
            public void visit(OWLObjectProperty p){
                System.out.println(p);
            }

            @Override
            public void visit(OWLObjectComplementOf e){
                // do nothing for complements
            }
}

0
投票

正如@AKSW建议我转换owlclassExpression并使用填充符。你可以找到更新的版本。但正如他所说,这不是一般的解决方案。任何让它变得通用的想法。我是否继续作为访问函数OWLObjectIntersectionOf的参数并独立处理每个案例?我的意思是OWLObjectAllValuesFrom和OWLObjectSomeValuesFrom ..无论如何,我需要测试其他本体以获取所有可能的情况。

 @Override
                        public void visit(OWLObjectIntersectionOf ce) {
                            for (OWLClassExpression e : ce.getOperands()) {
                                if ( reasoner.isSatisfiable(e) && e.getObjectPropertiesInSignature().size()==1  && e.getClassesInSignature().size()==1 )
                                 {      
                                        if(e.getClassExpressionType().equals(ClassExpressionType.OBJECT_ALL_VALUES_FROM) )
                                        {   System.out.println("---------------");
                                            OWLObjectAllValuesFrom all = (OWLObjectAllValuesFrom) e;
                                            all.getFiller();
                                            System.out.println(clazzzz.getIRI().getFragment()+" ---> "+ e.getObjectPropertiesInSignature().iterator().next().getIRI().getFragment()+" ---> "+all.getFiller());
                                            nbrRelations++;
                                        }   
                                        else 
                                        {System.out.println("---------------");
                                        System.out.println(clazzzz.getIRI().getFragment()+" ---> "+ e.getObjectPropertiesInSignature().iterator().next().getIRI().getFragment()+" ---> "+e.getClassesInSignature().iterator().next().getIRI().getFragment());
                                        nbrRelations++;
                                        }



                                }
                               // e.accept(this);     

                            }

                        }
© www.soinside.com 2019 - 2024. All rights reserved.