2017-06-12 6 views
1

OLS APIを使用して、xlsファイルからRDFトリプルをOWL RDF/XMLオントロジーに追加したいと思います。私はこのtopicに従い、OWL API v 3.4でそれを行うことができますが、私はv4.3(そして私のプログラムの残りの部分はv4.3を使用しています)ではできません。ここでRDF-tripleをowlオントロジーに追加する(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を処理しません。 誰かがこの例を実行して2つのリレーション(OWLObjectProperty/OWLDataproperty)を印刷するとnice =)になります。私の依存:

<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の関係であるかどうかを事前に知らないことです。 OWLType(OWLEntity)とOWL関係を定義することなく、OWLDataFactoryインスタンスを使用することは可能ですか? 私は、すべての関係が内部で定義されたターゲットオントロジにトリプルを配置したいと考えています。 –

+0

これを回避するためにパーサを使用するとうまく動作しません。それはすでにオントロジにあるものだけで動作します。プロパティiriを知っていて、それがオブジェクトかデータプロパティかどうかを知る必要がある場合の回避策は、owlontologyメソッドを使用してチェックすることです - オントロジーシグネチャをチェックするメソッドがあります。また、オブジェクトが実体であるかリテラルであるかを知る必要があります – Ignazio

+0

「これはすでにオントロジーに含まれているものでしか動かすことができません」というのは、私がParserを考えた理由、新しいDataPropertyやObjectProperty、Classを作成しない私のRDF-triple;ターゲットオントロジーに存在するクラスのインスタンスと新しいインスタンス間の関係(既存の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; 
} 
} 
関連する問題