java - 在java中指定本体IRI

标签 java owl ontology owl-api iri

我正在尝试合并两个本体以创建一个新的单一本体。为此,我应该如何指定新本体的IRI?它应该是新文件的路径还是某个 url?

这是我的代码:

void createRepOntology(OWLOntology O1, OWLOntology O2) throws IOException, OWLOntologyCreationException, OWLOntologyStorageException
{
    OWLOntologyManager man = OWLManager.createOWLOntologyManager();
    OWLDataFactory fac =  man.getOWLDataFactory();
    OWLOntology ont;
    FileWriter writer = new FileWriter(new File(System.getProperty("user.dir") + "/repOnt.owl"));
    String url = "file://" + System.getProperty("user.dir") + "/repOnt.owl";

    IRI iri = IRI.create(url);

    ont = man.createOntology(iri);

            . . .

    OWLClass c = fac.getOWLClass(IRI.create(url1));
    OWLAxiom ax = fac.getOWLDeclarationAxiom(c);
    man.addAxiom(ont, ax);
    man.saveOntology(ont);

}

创建的本体如下所示:

<?xml version="1.0"?>
<rdf:RDF xmlns="file:///home/repOnt.owl#"
 xml:base="file:///home/repOnt.owl"
 xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#"
 xmlns:owl="http://www.w3.org/2002/07/owl#"
 xmlns:productCatalog="http://www.semanticweb.org/ontologies/2015/11/productCatalog#"
 xmlns:xsd="http://www.w3.org/2001/XMLSchema#"
 xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
 xmlns:ElectronicDevices="http://www.semanticweb.org/ontologies/2015/9/ElectronicDevices#"
 xmlns:Acer_Backpack_15="http://www.semanticweb.org/ontologies/2015/11/productCatalog#Acer_Backpack_15.6&#39;&#39;">
<owl:Ontology rdf:about="file:///home/repOnt.owl"/>

xmlns 的值是文件的路径。但是,当我指定一个 url 作为新本体的 IRI 时,例如:http://www.semanticweb.org/ontologies/2015/11/productCatalog#,它会给出以下异常:

Exception in thread "main" org.semanticweb.owlapi.model.OWLOntologyStorageException: java.net.ProtocolException: cannot write to a URLConnection if doOutput=false - call setDoOutput(true)
at org.semanticweb.owlapi.util.AbstractOWLOntologyStorer.storeOntology(AbstractOWLOntologyStorer.java:147)
at uk.ac.manchester.cs.owl.owlapi.OWLOntologyManagerImpl.saveOntology(OWLOntologyManagerImpl.java:841)
at uk.ac.manchester.cs.owl.owlapi.OWLOntologyManagerImpl.saveOntology(OWLOntologyManagerImpl.java:827)
at uk.ac.manchester.cs.owl.owlapi.OWLOntologyManagerImpl.saveOntology(OWLOntologyManagerImpl.java:821)
at ontomap.RepOnt.createRepOntology(RepOnt.java:112)
at ontomap.RepOnt.run(RepOnt.java:85)
at ontomap.RepOnt.main(RepOnt.java:49)
Caused by: java.net.ProtocolException: cannot write to a URLConnection if doOutput=false - call setDoOutput(true)
at sun.net.www.protocol.http.HttpURLConnection.getOutputStream(HttpURLConnection.java:1074)
at org.semanticweb.owlapi.util.AbstractOWLOntologyStorer.storeOntology(AbstractOWLOntologyStorer.java:105)
... 6 more
Java Result: 1

那么指定新本体的IRI的正确方法是什么?

最佳答案

Should it be the path to the new file or some url?

本体IRI应该是一个IRI。虽然存在“文件 IRI”(例如,file://something-here),但您通常希望本体 IRI 有用,并且如果您打算在线发布本体,那么它使本体 IRI 成为可以从中检索实际本体的 IRI 可能会有所帮助(但不是强制性的)。

让 OWL API 知道在哪里保存您创建的本体的问题实际上是一个不同的问题。 OWL API 文档中的示例包括一个名为 shouldSaveOntology 的测试用例。这表明有一个版本 OWLOntologyManager#saveOntology()它接受两个参数,本体和保存它的路径,并提供一个示例:

File file = folder.newFile("owlapiexamples_saving.owl");
manager.saveOntology(ontology, IRI.create(file.toURI()));

关于java - 在java中指定本体IRI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36202392/

相关文章:

java - OWLAPI 5 : how to iterate over the classes of my ontology to insert individuals?

java - Gradle Plugin 与 android 发布插件

java - JAX-RS( Jersey )-> 通过 REST 的 Angular.js

java - javafx/scenebuilder 文本字段或标签中的 mysql 数据

java - MVC 模式和 Swing

java - 使用 Protege API 编译代码时出错

rdf - 新网站的语义网络资源?

OWL:如何从父类(super class)中继承两个类之间的属性关系?

owl - 使用属性链获取OWL本体中的推断知识(Protege)

sparql - 从 sparql 中的日期时间中删除时间