0

我在推断传递对象属性 Similarto 时使用 Pellet 时遇到问题。我有个人 A Similarto B 和个人 B Similarto C。我想在 OWL API 中使用 Pellet 或使用 Jena 来获取个人组 A、B、C,但我无法弄清楚在 OWL API 中进行推理的代码。

我已经在 OWL API 中加载了本体,是否有一个示例代码可以推断一组具有相同传递属性的个体?

4

1 回答 1

0

这个答案是从 Ignazio Palmisano 那里得到的:

如果颗粒没有当前的解决方案,我们可以编写自己的解决方案。

  • 选择您的起点,即传递链中的第一个个体
  • 检索您所追求的财产的所有填充物
  • 对于每个填充物,像上一步一样检索所有填充物
  • 注意避免循环

(同时拥有一个集合和一个列表的原因是能够在添加元素时以可预测的方式进行迭代,并保持快速的包含检查 - 以一点内存为代价)

 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());
            }
于 2016-02-19T09:02:26.410 回答