我在使用 Pellet 推断传递对象属性 Similarto 时遇到问题。我有个人 A 类似于 B 和个人 B 类似于 C。我想在 OWL API 中使用 Pellet 或使用耶拿来获取单个组 A、B、C,但我无法弄清楚在 OWL API 中进行推理的代码。
我已经在OWL API中加载了本体,是否有一个示例代码来推断一组与同一传递属性相关的个体?
这个答案来自伊格纳齐奥·帕米萨诺:
如果颗粒没有当前的解决方案,我们可以编写自己的解决方案。
- 选择您的起点,即您的第一个人传递链
- 检索您所追求的属性的所有填充物
- 对于每个填充物,如上一步所示检索所有填充物
- 注意避免周期
(同时拥有集合和列表的原因是能够迭代添加元素时以可预测的方式,并保持快速遏制检查 - 以一点内存为代价)
OWLDataFactory factory = manager.getOWLDataFactory();
Set<OWLNamedIndividual> found= new HashSet<>();
List<OWLNamedIndividual> list= new ArrayList<>();
List<OWLNamedIndividual> SeaIcelist= new ArrayList<>();
PrefixManager pm = new DefaultPrefixManager("http://www.semanticweb.org/SeaIceOntology#");
OWLNamedIndividual root = factory.getOWLNamedIndividual(":thickness", pm);
OWLObjectProperty p = factory.getOWLObjectProperty(IRI
.create("http://www.semanticweb.org/SeaIceOntology#similarTo"));
OWLReasoner r= new StructuralReasonerFactory().createNonBufferingReasoner(loadMODIS);
found.add(root);
list.add(root);
while(i < list.size()){
for(Node<OWLNamedIndividual> ind:r.getObjectPropertyValues
(list.get(i), (OWLObjectPropertyExpression)p)){
for(OWLNamedIndividual nind:ind){
if(found.add(nind)){
list.add(nind);
/* select specific individuals to the SeaIcelist */
for(OWLClassExpression ex : nind.getTypes(loadMODIS)) {
while(ex.asOWLClass().getSuperClasses(loadMODIS).iterator().hasNext()){
for(OWLClassExpression cl:ex.asOWLClass().getSuperClasses(loadMODIS)) {
if (cl.equals(factory.getOWLClass
(IRI.create("http://www.semanticweb.org/SeaIceOntology#EarthScienceProperty"))) ){
SeaIcelist.add(nind);
break;
}
}
ex = ex.asOWLClass().getSuperClasses(loadMODIS).iterator().next();
}
}
/* select specific individuals to the SeaIcelist */
}
}
}
i ++;
}
for (int j = 1; j < i; j ++){
System.out.println("These are all the terms which has similar meanings." + list.get(j).toStringID());
}
int size = SeaIcelist.size();
for (int j = 0; j < size; j ++){
System.out.println("These are all the standard terms which has similar meanings." + SeaIcelist.get(j).toStringID());
}