代码之家  ›  专栏  ›  技术社区  ›  user2083529

使用OWLAPi和JFact推理器获取特定类的所有人

  •  3
  • user2083529  · 技术社区  · 10 年前

    有没有任何方法可以使用reasoner获取特定类别的所有人? 讲道理,因为我想得到那个班所有推断和评价的人。 我正在使用JFact推理器,我正在尝试循环和if语句。我想找到班级里的人,比如“人”。但我看不到这些人。对下面的代码有什么想法吗?或者有什么方法可以达到这个目的吗?

    for (OWLClass c : myPizza.getClassesInSignature()) {
            NodeSet<OWLNamedIndividual> instances = reasoner.getInstances(c, true);
            System.out.println(c.getIRI().getFragment());
            if (c.getIRI().getFragment().equals("Person")){
    
                for (OWLNamedIndividual i : instances.getFlattened()) {
                    System.out.println(i.getIRI().getFragment()); 
    
            }
        }
            else {
                continue;
            }
            break;
    
        }
    

    谢谢

    2 回复  |  直到 10 年前
        1
  •  6
  •   Ignazio    10 年前

    使命感 reasoner.getInstances(c, true); 将只向您提供c的/direct/实例;如果您要查找的个体是c的子类的实例,则将跳过它们。切换到 reasoner.getInstances(c, false); 以包括子类的实例。

    你也在打电话 break; 在第一次迭代之后。如果 person 不是签名中的第一类,您永远不会查找 .

    您可以稍微更改代码以减少推理工作:

    for (OWLClass c : myPizza.getClassesInSignature()) {
        if (c.getIRI().getFragment().equals("Person")){
            NodeSet<OWLNamedIndividual> instances = reasoner.getInstances(c, false);
            System.out.println(c.getIRI().getFragment());
            for (OWLNamedIndividual i : instances.getFlattened()) {
                System.out.println(i.getIRI().getFragment()); 
            }
        }
    }
    

    编辑:从评论中注意,如果您希望看到SWRL推断的个体,您需要使用支持SWRL的推理器,如Pellet或Hermitt。JFact不支持SWRL规则。

        2
  •  3
  •   Ignazio    9 年前

    试试这个方法。您可以使用下面的方法获取特定类的所有个人。

     private static void printIndividualsByclass(OWLOntology ontology, String owlClass){
        OWLReasonerFactory reasonerFactory = new PelletReasonerFactory();
        OWLReasoner reasoner = reasonerFactory.createNonBufferingReasoner(ontology);
        for (OWLClass c : ontology.getClassesInSignature()) {
            if (c.getIRI().getShortForm().equals(owlClass)){
                NodeSet<OWLNamedIndividual> instances = reasoner.getInstances(c, false);
                System.out.println("Class : "+ c.getIRI().getShortForm());
                for (OWLNamedIndividual i : instances.getFlattened()) {
                    System.out.println(i.getIRI().getShortForm()); 
                }
            }
        }
    }