2015-11-10 65 views
0

我有一个对象属性Car及其子属性作为法拉利。我想用owl api获得法拉利汽车的超级房产。我可以获得房产的子房产,但不是超级房产。有没有我缺少的API?在OWL Api中获取对象属性的超级属性4

+0

请记住,一个给定的属性可以有一个以上的超级属性(可能会或可能不会影响你的使用情况) 。 –

+0

[getSuperProperties](http://owlapi.sourceforge.net/javadoc/org/semanticweb/owlapi/model/OWLPropertyExpression.html#getSuperProperties%28org.semanticweb.owlapi.model.OWLOntology%29)是否有效? –

+0

你可以显示获取子属性的代码吗? – Ignazio

回答

2

如果直接声明子属性关系,则可以使用OWLOntology::getObjectSubPropertyAxiomsForSubProperty方法。

例子:

OWLOntology o = ... 
OWLObjectProperty p = ... 
o.getObjectSubPropertyAxiomsForSubProperty(p); 
+0

@Simon Sepro非常感谢......你的回答完全按照我想要的方式工作。 –

0

我能够做到这一点的方式如下: -

Set<OWLObjectProperty> props = ont.getObjectPropertiesInSignature(); 
      for (OWLObjectProperty p : props) { 
       HashSet<OWLSubObjectPropertyOfAxiom> subPropertySet = (HashSet)ont.getObjectSubPropertyAxiomsForSuperProperty(p); 
       for (OWLSubObjectPropertyOfAxiom subPropAxiom : subPropertySet) { 
        OWLObjectPropertyExpression subObjectProperty = subPropAxiom.getSubProperty(); 
        if (subObjectProperty.getNamedProperty().getIRI().equals(relationIRI)) { 
         d.setDerivedFrom(p.getIRI().getShortForm()); 

        } 
       } 
      } 

如果有更好的方式来做到这一点,请让我知道。

+0

Simon的答案利用了内部索引,所以它会更快。 – Ignazio

+0

@Ignazio我不是寻找属性的子属性...我要求超级属性给定的属性。 –

+0

是的 - 在Simon的回答中,方法引用是“bySubProperty”。由此产生的公理将输入属性作为子属性。为了获得超级属性,遍历公理并为每个公理收集超级属性。我会扩展这个例子。 – Ignazio

0
Iterator<OWLSubObjectPropertyOfAxiom> subItr = ont.getObjectSubPropertyAxiomsForSubProperty(factory.getOWLObjectProperty(relationIRI)).iterator(); 
      while (subItr.hasNext()) { 
       OWLSubObjectPropertyOfAxiom subPropAxiom = subItr.next(); 
       d.setDerivedFrom(subPropAxiom.getSuperProperty().getNamedProperty().getIRI().getShortForm()); 
      } 

只是增加了西蒙的答案...这工作正常,我....