如何使用Pellet查找具有逻辑等效概念的组?

时间:2014-06-05 10:09:08

标签: java owl ontology owl-api pellet

事实上,我使用带有OWL API的java prgramation在OWL2语言上定义了一个本体。我在项目中集成了所需的jar来使用推理引擎Pellet。我的问题是我如何在我的本体组中发现逻辑上等同的概念? 这里是我使用Pellet的代码。

 import java.io.File;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.semanticweb.owlapi.apibinding.OWLManager;
import org.semanticweb.owlapi.io.StreamDocumentTarget;
import org.semanticweb.owlapi.model.IRI;
import org.semanticweb.owlapi.model.OWLAxiom;
import org.semanticweb.owlapi.model.OWLClass;
import org.semanticweb.owlapi.model.OWLDataFactory;
import org.semanticweb.owlapi.model.OWLNamedIndividual;
import org.semanticweb.owlapi.model.OWLObjectProperty;
import org.semanticweb.owlapi.model.OWLOntology;
import org.semanticweb.owlapi.model.OWLOntologyChange;
import org.semanticweb.owlapi.model.OWLOntologyCreationException;
import org.semanticweb.owlapi.model.OWLOntologyManager;
import org.semanticweb.owlapi.model.OWLOntologyStorageException;
import com.clarkparsia.pellet.owlapiv3.PelletReasoner;
import com.clarkparsia.pellet.owlapiv3.PelletReasonerFactory;
import org.mindswap.pellet.KnowledgeBase;







/**
 *
 * @author hela
 */
public class Owl {

  public  void createNewOnto(List<String[][]> cps, LinkedList<Map<String, String>> rel, String uri ) throws OWLOntologyCreationException,
        OWLOntologyStorageException {
     OWLOntologyManager manager = OWLManager.createOWLOntologyManager();
        OWLDataFactory factory = manager.getOWLDataFactory();
        IRI iri = IRI.create("http://www.co-ode.org/ontologies/Annot2Onto.owl");
        OWLOntology ontology = manager.createOntology(iri); 

OWLObjectProperty subTopicOf =factory.getOWLObjectProperty(IRI.create(iri+"/#sub-topicOf"));
OWLObjectProperty kindOf =factory.getOWLObjectProperty(IRI.create(iri+"/#kindOf"));
OWLClass thing = factory.getOWLClass(IRI.create(iri+"/#OWLThing"));
  manager.addAxiom(ontology, factory.getOWLDeclarationAxiom(thing));
 Set<OWLAxiom> genders = new HashSet<OWLAxiom>();
 for(Map<String, String> rmp : rel){
     Set<OWLNamedIndividual> classes =ontology.getIndividualsInSignature();
  List< OWLNamedIndividual> listc = new ArrayList(classes);
   IRI ir = IRI.create(iri+"/#"+rmp.get("concept1"));
    OWLNamedIndividual c1=null;

 if(ontology.containsClassInSignature(ir)){
     int i=0;

     while(i<listc.size()&& c1==null){
         if(listc.get(i).toString().compareTo("<"+ir.toString()+">")==0){
             c1=listc.get(i);

              manager.addAxiom(ontology, factory.getOWLDeclarationAxiom(c1));
             manager.addAxiom(ontology, factory.getOWLClassAssertionAxiom(thing, c1));
         }


         i++;
     }
 }

 else {
      c1 = factory.getOWLNamedIndividual(IRI.create(iri+"/#"+rmp.get("concept1")));

        //manager.addAxiom(ontology, factory.getOWLDeclarationAxiom(c1));
        manager.addAxiom(ontology, factory.getOWLClassAssertionAxiom(thing, c1));
 }

 IRI ir2 = IRI.create(iri+"/#"+rmp.get("concept2"));
    OWLNamedIndividual c2=null;
 if(ontology.containsIndividualInSignature(ir2)){
     int i=0;

     while(i<listc.size()&& c2==null){

         if(listc.get(i).toString().compareTo("<"+ir2.toString()+">")==0){
             c2=listc.get(i);
              System.out.println("concept2 = "+c2.toString());
             manager.addAxiom(ontology, factory.getOWLDeclarationAxiom(c2));
               manager.addAxiom(ontology, factory.getOWLClassAssertionAxiom(thing, c2));
         }
         i++;
     }
 }

 else{ 
      c2 = factory.getOWLNamedIndividual(IRI.create(iri+"/#"+rmp.get("concept2")));

       //manager.addAxiom(ontology, factory.getOWLDeclarationAxiom(c2));
        manager.addAxiom(ontology, factory.getOWLClassAssertionAxiom(thing, c2));
 }

if(rmp.get("relation").compareTo("kind of")==0){
//domainAxiom = factory.getOWLObjectPropertyDomainAxiom(sorteDe,c1);
//rangeAxiom = factory.getOWLObjectPropertyRangeAxiom(sorteDe,c2);

genders.add(factory.getOWLObjectPropertyAssertionAxiom(kindOf, c1,
                c2));
}

else{

  genders.add(factory.getOWLObjectPropertyAssertionAxiom(subTopicOf, c1,c2));


}

    String[][] cp1 = this.getConcept(cps,rmp.get("concept1"));
    String[][] cp2 = this.getConcept(cps,rmp.get("concept2") );
    cps.remove(cp2);
    cps.remove(cp1);
    // Now we apply the change using the manager.
    //manager.applyChange(addAxiom1);
 }
    List<OWLOntologyChange> la=manager.addAxioms(ontology, genders);
    manager.applyChanges(la);

for(String[][] ct: cps){
    OWLNamedIndividual res=factory.getOWLNamedIndividual(IRI.create(iri+"/#"+ct[0][0]));
       manager.addAxiom(ontology, factory.getOWLDeclarationAxiom(res));
      manager.addAxiom(ontology, factory.getOWLClassAssertionAxiom(thing, res));

}

File file = new File(uri+"/Annot2Onto.owl");
PelletReasoner reasoner = PelletReasonerFactory.getInstance().createNonBufferingReasoner( ontology );
      manager.addOntologyChangeListener( reasoner );
reasoner.flush();
System.out.println(reasoner.isConsistent());
KnowledgeBase kb = reasoner.getKB();
kb.get
    manager.saveOntology(ontology, IRI.create(file.toURI()));
    manager.saveOntology(ontology, new StreamDocumentTarget(System.out));

}
  public String[][] getConcept(List<String[][]> cps, String s){
      String[][] cp =null;
      int i=0;
      while((i<cps.size()) && (cp==null) ){
          if(cps.get(i)[0][0].compareTo(s)==0)
              cp=cps.get(i);
      i++;
      }
      return cp;
  }

我需要Pellet的java代码,它允许检测组逻辑等效的概念。我将非常感谢你的帮助。提前致谢

2 个答案:

答案 0 :(得分:1)

注意:这个答案中的方法没问题,但它是基于使用Jena API的错误假设(问题的原始版本中没有显示太多代码)。 < / p>

这实际上是关于如何使用Jena API处理模型的问题,因为Pellet可以与其他API(例如OWLAPI)一起使用,在这些情况下,如何检索这些信息会有所不同。但是,到目前为止,您显示的代码似乎正在使用Jena。这里要考虑的主要方法是:

  • 列出所有等效类对
  • 对于某个特定类,列出所有等效类

下面的代码显示了如何做到这两点。请注意,说明列出所有等效类并不完全正确,因为其中包含无限多个类。例如,

A≡A⊓⊓≡A⊔⊔≡A⊓A⊓⊓

严格地说,那些是类表达式,这就是可以有多个的表达式。一旦你确定了,例如A≡B,实际上只有一个,恰好有两个类表达式表示该类。这有点像问,“什么数字等于2?”答案是“只有2”,而对于“什么算术表达式具有值2?”的问题。答案是{2,1 + 1,2×1,4 / 2,...}。我只是指出这一点,因为我不确定Pellet会给你哪些结果,尽管我希望它只是寻找已经存在于你的本体中的类表达式。

import org.mindswap.pellet.jena.PelletReasonerFactory;

import com.hp.hpl.jena.ontology.OntClass;
import com.hp.hpl.jena.ontology.OntModel;
import com.hp.hpl.jena.rdf.model.ModelFactory;
import com.hp.hpl.jena.rdf.model.RDFNode;
import com.hp.hpl.jena.rdf.model.StmtIterator;
import com.hp.hpl.jena.util.iterator.ExtendedIterator;
import com.hp.hpl.jena.vocabulary.OWL;

public class GetEquivalentClassesExample {
    public static void main(String[] args) {
        /*
         * Create an OntModel with an attached Pellet reasoner.
         */
        OntModel model = ModelFactory.createOntologyModel( PelletReasonerFactory.THE_SPEC );

        /*
         * Load your data.
         */
        model.read( "..." );

        /*
         * To list all pairs of equivalent classes, you can just list
         * the statements with the property owl:equivalentClass
         */
        StmtIterator s = model.listStatements( null, OWL.equivalentClass, (RDFNode) null );
        while ( s.hasNext() ) { 
            System.out.println( s.next() );
        }

        /*
         * If you just want the classes that are equivalent to some particular
         * class, you can get a reference to that class, and then ask for its
         * equivalent classes.
         */
        OntClass klass = model.getOntClass( "..." );
        ExtendedIterator<OntClass> c = klass.listEquivalentClasses();
        while ( c.hasNext() ) {
            System.out.println( c.next() );
        }
    }
}

答案 1 :(得分:1)

在OWLAPI中,来自OWLReasoner NodeNodeSet的所有结果都包含等效实体集。

对于OWLNamedIndividualOWLReasoner::getSameIndividuals()会返回一个Node<OWLNamedIndividual>对象,其中包含推断为sameAs的所有个体。

也可以询问课程的实例: OWLReasoner::getInstances()将返回NodeSet<OWLIndividual>,这是Node个对象的集合,每个对象对应一组OWLNamedIndividual个对象,彼此也是sameAs。< / p>

这同样适用于子/超级/等效类和属性。

编辑以包含评论:

要获取本体中的所有命名个体,在等价类中按sameAs分组,一种方法是要求owl:Thing

的所有实例

NodeSet<OWLNamedIndividual> individuals = reasoner.getInstances(dataFactory.getOWLThing(), false);

NodeSet包含节点(没有特定的顺序);每个节点包含OWLNamedIndividual个对象,没有特定的顺序。同一节点中的所有个体彼此相同,即,每个个体可被视为其等价类的代表。没有规范代表的概念。

同样,要获得OWLClass

的所有等价类

NodeSet<OWLClass> classes = reasoner.getSubClasses(dataFactory.getOWLThing(), false);

这是Node<OWLClass>的集合,每个集合包含等效的类。在NodeSet中找到节点的顺序以及节点中OWLClasses的顺序没有任何作用,可能会从一个调用更改为下一个调用。

来自OWLReasoner javadoc

节点 推理器接口包含返回NodeSet个对象的方法。这些是Node个对象的集合。节点包含实体。 对于Node<OWLClass>类,节点中的每个类与根本体的导入闭包中的节点中的其他类等效。 对于Node<OWLObjectProperty>对象属性,Node中的每个对象属性都相当于节点中与根本体的import闭包相关的其他对象属性。 对于数据属性的节点,节点中的每个数据属性相当于节点中与根本体的导入闭包相关的其他数据属性。 对于命名个体的节点,节点中的每个个体与根本体的导入闭包中的节点中的其他个体相同。