【问题标题】:Add RDF-triple into owl ontology (OWL API 4.3.0)将 RDF-triple 添加到 owl 本体 (OWL API 4.3.0)
【发布时间】:2017-11-14 07:11:23
【问题描述】:

我想使用 OWL API 将 xls 文件中的一些 RDF 三元组添加到 OWL RDF/XML 本体中。我遵循topic 并设法使用 OWL API v 3.4 来实现,但我无法使用 v4.3 来实现(我的程序的所有其余部分都使用 v4.3)。

这是上面主题的代码,适用于 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>

非常感谢。

附: : 我是法国人,如果我的语法不完美,请见谅

【问题讨论】:

  • 为了澄清我的问题,我想将我的三元组放在一个目标本体中,其中定义了所有类和关系。此外,我事先不知道要添加的三元组的类型(ClassAssertion、DataPropertyAxiom、ObjectPropertyAxiom)。这就是为什么我认为 RDFConsumer 和 Parser 可以帮助我。

标签: java rdf owl ontology owl-api


【解决方案1】:

OWLAPI 不是面向 RDF,因此与 RDF 相关的类仅用于其解析基础架构,而不是用于输入用途 - 这就是接口和实现可以在没有警告的情况下更改的原因。

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

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

【讨论】:

  • 感谢您的回答。我的问题是事先不知道我的三元组是否是对象/数据属性/类断言关系。是否可以在不定义 OWLType (OWLEntity) 和 OWL Relation 的情况下使用 OWLDataFactory 实例?知道我想把三元组放在一个目标本体中,里面定义了所有的关系。
  • 使用解析器来解决这个问题不会很好。它只能与本体中已经存在的东西一起工作。您知道属性 iri 并且需要知道它是对象还是数据属性的解决方法是使用 owlontology 方法来检查 - 有 contains... 方法来检查本体签名。此外,您需要知道对象是实体还是文字
  • “它只能与本体中已有的东西一起工作”:这就是我想到 Parser 的原因,我没有在我的 RDF 三元组中创建任何新的 DataProperty 或 ObjectProperty 或 Class;只是目标本体中存在的类实例和新实例之间的关系(使用现有的 Object / DataProperty)。但我会尝试你的解决方案,因为你说我可以使用 OWLDataFactory。
【解决方案2】:

我用来读取我的 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();
    }
}

如果String有PREFIX into,则将其转换为IRI的方法。

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;
}

还有 Triple 类:

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;
}
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-05-22
    • 1970-01-01
    • 2020-12-21
    • 2018-03-18
    • 2015-05-29
    • 2013-05-12
    • 2011-12-12
    • 1970-01-01
    相关资源
    最近更新 更多