2017-06-12 121 views
1

我想使用OWL API将xls文件中的RDF三元组添加到OWL RDF/XML本体中。我遵循这个topic并设法使用OWL API v 3.4来做到这点,但是我无法用v4.3来做到这一点(并且我所有的程序都使用了v4.3)。在OWL API中添加RDF三元组(OWL API 4.3.0)

这里是话题上面的3.4版本使用的代码:

import java.io.Reader; 

import org.coode.owlapi.rdfxml.parser.OWLRDFConsumer; 
import org.semanticweb.owlapi.apibinding.OWLManager; 
import org.semanticweb.owlapi.model.IRI; 
import org.semanticweb.owlapi.model.OWLDataFactory; 
import org.semanticweb.owlapi.model.OWLDataProperty; 
import org.semanticweb.owlapi.model.OWLEntity; 
import org.semanticweb.owlapi.model.OWLNamedIndividual; 
import org.semanticweb.owlapi.model.OWLObjectProperty; 
import org.semanticweb.owlapi.model.OWLOntology; 
import org.semanticweb.owlapi.model.OWLOntologyCreationException; 
import org.semanticweb.owlapi.model.OWLOntologyLoaderConfiguration; 
import org.semanticweb.owlapi.model.OWLOntologyManager; 
import org.semanticweb.owlapi.model.OWLOntologyStorageException; 

import uk.ac.manchester.cs.owl.owlapi.turtle.parser.TurtleParser; 


public class ExampleOWLRDFConsumer { 
public static void main(String[] args) throws OWLOntologyCreationException, OWLOntologyStorageException { 
    // Create an ontology. 
    OWLOntologyManager manager = OWLManager.createOWLOntologyManager(); 
    OWLDataFactory factory = manager.getOWLDataFactory(); 
    OWLOntology ontology = manager.createOntology(); 

    // Create some named individuals and an object property. 
    String ns = "http://example.org/"; 
    OWLNamedIndividual tom = factory.getOWLNamedIndividual(IRI.create(ns + "Tom")); 
    OWLObjectProperty likes = factory.getOWLObjectProperty(IRI.create(ns + "likes")); 
    OWLDataProperty age = factory.getOWLDataProperty(IRI.create(ns + "age")); 
    OWLNamedIndividual anna = factory.getOWLNamedIndividual(IRI.create(ns + "Anna")); 

    // Add the declarations axioms to the ontology so that the triples involving 
    // these are understood (otherwise the triples will be ignored). 
    for (OWLEntity entity : new OWLEntity[] {tom, likes, age, anna}) { 
     manager.addAxiom(ontology, factory.getOWLDeclarationAxiom(entity)); 
    } 

    // Print the the ontology to see that the entities are declared. 
    // The important result is 
    // <NamedIndividual rdf:about="http://example.org/Tom"/> 
    // with no properties 
    manager.saveOntology(ontology, System.out); 

    // Create an OWLRDFConsumer for the ontology. 
    OWLRDFConsumer consumer = new OWLRDFConsumer(ontology, new TurtleParser((Reader) null), new OWLOntologyLoaderConfiguration()); 

    // The consumer handles (IRI,IRI,IRI) and (IRI,IRI,OWLLiteral) triples. 
    consumer.handle(tom.getIRI(), likes.getIRI(), anna.getIRI()); 
    consumer.handle(tom.getIRI(), age.getIRI(), factory.getOWLLiteral(35)); 

    // Print the ontology to see the new object and data property assertions. The import contents is 
    // still Tom: 
    // <NamedIndividual rdf:about="http://example.org/Tom"> 
    //  <example:age rdf:datatype="http://www.w3.org/2001/XMLSchema#integer">35</example:age> 
    //  <example:likes rdf:resource="http://example.org/Anna"/> 
    // </NamedIndividual> 
    manager.saveOntology(ontology, System.out); 
    } 
} 

我知道有些Packages changed from v3.X to 4.X,并似乎TurtleParser是不再一个AnonymousNodeChecker?在这个例子中,消费者不会处理v4.3中的2 RDF-Triple。 如果有人设法运行这个例子并打印这两个关系(OWLObjectProperty/OWLDataproperty),那很好=)。我的依赖:

<parent> 
    <artifactId>owlapi-parent</artifactId> 
    <groupId>net.sourceforge.owlapi</groupId> 
    <version>4.3.0</version> 
</parent> 

<dependency> 
    <groupId>net.sourceforge.owlapi</groupId> 
    <artifactId>owlapi-compatibility</artifactId> 
    <version>4.3.0</version> 
</dependency> 

非常感谢。

P.S. :我是法语的,对不起,如果我的语法不完美

+0

为了澄清我的问题,我希望把我的三倍,其中所有类和关系,定义了目标本体。此外,我不知道我想添加的三元组的类型(ClassAssertion,DataPropertyAxiom,ObjectPropertyAxiom)。这就是为什么我认为RDFConsumer和Parser可以帮助我。 –

回答

1

OWLAPI不是面向RDF的,因此RDF相关类仅用于其解析基础结构,而不是输入用途 - 这就是为什么接口和实现可以没有警告地改变。

在这种情况下,您只能通过使用api模块接口来解决问题。您要添加的三元组是对象和数据属性声明,可以通过OWLDataFactory实例创建。

manager.addAxiom(factory.getOWLObjectPropertyAssertionAxiom(likes, tom, anna); 
manager.addAxiom(factory.getOWLDataPropertyAssertionAxiom(age, tom, factory.getOWLLiteral(35)); 
+0

感谢您的回答。 我的问题是,在事先不知道如果我的三元组是object/dataProperty/ClassAssertion关系。是否可以使用OWLDataFactory实例来定义OWLType(OWLEntity)和OWL关系? 知道我想把三元组放在一个目标本体中,所有的关系都在里面定义。 –

+0

使用解析器来解决这个问题不会很好。它只能与已有的本体中的内容一起工作。一个解决方法,你知道属性iri并且需要知道它是否是对象或数据属性是使用owlontology方法来检查 - 有包含...方法来检查本体签名。此外,您需要知道该对象是实体还是文字 – Ignazio

+0

“它只能与本体中的内容一起工作”:这就是为什么我想到Parser,我没有创建任何新的DataProperty或ObjectProperty或Class我的RDF三元组;只是存在于目标本体中的类的实例以及新实例(使用现有的Object/DataProperty)之间的关系。 但我会尝试你的解决方案,因为你说我可以使用OWLDataFactory。 –

0

我用我的excel文件读取,产生三重并将其添加到我的目标本体代码:

import java.io.File; 
import java.io.FileInputStream; 
import java.io.Reader; 
import java.nio.file.Path; 
import java.nio.file.Paths; 

import org.apache.poi.hssf.usermodel.HSSFCell; 
import org.apache.poi.hssf.usermodel.HSSFRow; 
import org.apache.poi.hssf.usermodel.HSSFSheet; 
import org.apache.poi.hssf.usermodel.HSSFWorkbook; 
import org.apache.poi.poifs.filesystem.POIFSFileSystem; 
import org.coode.owlapi.rdfxml.parser.OWLRDFConsumer; 
import org.semanticweb.owlapi.apibinding.OWLManager; 
import org.semanticweb.owlapi.model.IRI; 
import org.semanticweb.owlapi.model.OWLDataFactory; 
import org.semanticweb.owlapi.model.OWLOntology; 
import org.semanticweb.owlapi.model.OWLOntologyFormat; 
import org.semanticweb.owlapi.model.OWLOntologyLoaderConfiguration; 
import org.semanticweb.owlapi.model.OWLOntologyManager; 

import uk.ac.manchester.cs.owl.owlapi.turtle.parser.TurtleParser; 

public class ReadExcelFile { 

public static void main(String[] args){ 
    try { 

     POIFSFileSystem fs = new POIFSFileSystem(new FileInputStream("./data/ReadExcelTest.xls")); 
     HSSFWorkbook wb = new HSSFWorkbook(fs); 
     HSSFSheet sheet = wb.getSheetAt(0); 
     HSSFRow row; 
     HSSFCell cell; 

     String object = null; 
     String predicat = null; 
     String subject = null; 
     String[] data = null; 

     Object objSubject = null; 
     Object objPredicat = null; 
     Object objObject = null; 

     OWLOntologyManager manager = OWLManager.createOWLOntologyManager(); 
     OWLDataFactory df = OWLManager.getOWLDataFactory(); 
     OWLOntology o = manager.loadOntologyFromOntologyDocument(new File("./targetOntology.owl")); 

     IRI targetOntologyIRI= IRI.create("http://targetOntology#"); 
     IRI cntroIRI = IRI.create("http://informatics.mayo.edu/CNTRO#"); 
     IRI rdfsIRI = IRI.create("http://www.w3.org/2000/01/rdf-schema#"); 
     IRI rdfIRI = IRI.create("http://www.w3.org/1999/02/22-rdf-syntax-ns#"); 
     IRI owlIRI = IRI.create("http://www.w3.org/2002/07/owl#"); 

     int rows = sheet.getPhysicalNumberOfRows(); 

     int cols = 3; 

     //Creation objet Triple 
     for(int r = 1; r < rows; r++) { 
      row = sheet.getRow(r); 
      if(row != null) { 
       Triple triple = new Triple(subject, predicat, object); 
       for(int c = 0; c < cols; c++) { 
        cell = row.getCell(c); 
        if(cell != null) { 
         if(c == 0) { 
          triple.setSubject(cell.getStringCellValue()); 
         }if(c == 1) { 
          triple.setPredicat(cell.getStringCellValue()); 
         }if(c == 2) { 
          triple.setObject(cell.getStringCellValue()); 
         } 
        } 
       } 


       objSubject = getIRIFromPrefixName(triple.getSubject()); 
       objPredicat = getIRIFromPrefixName(triple.getPredicat()); 
       objObject = getIRIFromPrefixName(triple.getObject()); 

       OWLRDFConsumer consumer = new OWLRDFConsumer(o, new TurtleParser((Reader) null), new OWLOntologyLoaderConfiguration()); 

       if (objObject.getClass() == String.class){ 
        consumer.handle((IRI) objSubject, (IRI) objPredicat, df.getOWLLiteral((String) objObject)); 
       } else { 
        consumer.handle((IRI) objSubject, (IRI) objPredicat, (IRI) objObject); 
       } 

       System.out.println(objSubject.toString() + " " + objPredicat.toString() + " " + objObject.toString()); 
       System.out.println(" " + consumer.getLastAddedAxiom()); 
      } 
     } 

     OWLOntologyFormat format = manager.getOntologyFormat(o); 
     Path path_instanced_ontology = Paths.get("./data/instanciedTargetOntology.owl"); 
     File instanced_ontology = new File(path_instanced_ontology.toString()); 
     manager.saveOntology(o, format, IRI.create(instanced_ontology.toURI())); 

    } catch(Exception ioe) { 
     ioe.printStackTrace(); 
    } 
} 

和系统,改变一个字符串转换为IRI,如果它有一个方法PREFIX进入。

static Object getIRIFromPrefixName(String attribute){ 

    IRI targetOntologyIRI= IRI.create("http://targetOntology#"); 
    IRI cntroIRI = IRI.create("http://informatics.mayo.edu/CNTRO#"); 
    IRI rdfsIRI = IRI.create("http://www.w3.org/2000/01/rdf-schema#"); 
    IRI rdfIRI = IRI.create("http://www.w3.org/1999/02/22-rdf-syntax-ns#"); 
    IRI owlIRI = IRI.create("http://www.w3.org/2002/07/owl#"); 

    String[] data; 
    IRI iriAttribute = null; 

    if (attribute.contains("CNTRO:")){ 
     data = attribute.split(":"); 
     iriAttribute = IRI.create(cntroIRI + data[1]); 
     return iriAttribute; 
    } else if (attribute.contains("MEO:")){ 
     data = attribute.split(":"); 
     iriAttribute = IRI.create(eventOntologyIRI + data[1]); 
     return iriAttribute; 
    } else if (attribute.contains("rdfs:")){ 
     data = attribute.split(":"); 
     iriAttribute = IRI.create(rdfsIRI + data[1]); 
     return iriAttribute; 
    } else if (attribute.contains("rdf:")){ 
     data = attribute.split(":"); 
     iriAttribute = IRI.create(rdfIRI + data[1]); 
     return iriAttribute; 
    } else if (attribute.contains("owl:")){ 
     data = attribute.split(":"); 
     iriAttribute = IRI.create(owlIRI + data[1]); 
     return iriAttribute; 
    } 
    return attribute; 
} 

与三类:

public class Triple { 

private String subject; 
private String predicat; 
private String object; 

public Triple(String subject, String predicat, String object) { 
    super(); 
    this.subject = subject; 
    this.predicat = predicat; 
    this.object = object; 
} 

public String getSubject() { 
    return subject; 
} 

public void setSubject(String subject) { 
    this.subject = subject; 
} 

public String getPredicat() { 
    return predicat; 
} 

public void setPredicat(String predicat) { 
    this.predicat = predicat; 
} 

public String getObject() { 
    return object; 
} 

public void setObject(String object) { 
    this.object = object; 
} 
}