有没有办法让使用推理器的特定班级的所有人? 推理因为我想获得该类的所有推断和认定的个体。 我正在使用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;
}
由于
答案 0 :(得分:6)
调用reasoner.getInstances(c, true);
只会为您提供c的/ direct /实例;如果你所追求的个体是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规则。
答案 1 :(得分: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());
}
}
}
}