3

有没有办法使用推理器来获取特定类别的所有个人?推理者,因为我想得到该类的所有推断和断言的个人。我正在使用 JFact 推理器,并且正在尝试 for 循环和 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;

    }

谢谢

4

2 回答 2

6

调用reasoner.getInstances(c, true);只会给你 /direct/ c 的实例;如果您所追求的个人是 c 的子类的实例,它们将被跳过。切换到reasoner.getInstances(c, false);包含子类的实例。

您也在break;第一次迭代后调用。如果person不是签名中的第一个类,您将永远不会寻找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 或 HermiT。JFact 不支持 SWRL 规则。

于 2015-01-22T07:48:18.400 回答
2

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

 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()); 
            }
        }
    }
}
于 2015-11-04T16:36:51.200 回答