我试图获得以下关系: 狗主人有宠物狗 。我使用以下代码执行此操作:
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);
}
}
}
它有效,但我需要分别获取对象属性和类 dog :我的意思是 dog 作为一个类, has-pet 作为对象属性,而不是获取包含它们的整个表达式。 另一个问题:我的代码必须返回作为表达式一部分的本体的所有类,但是当我们通过 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>
感谢您的帮助
答案 0 :(得分: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
}
}
答案 1 :(得分: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);
}
}