Jena - 无法将模型写入owl文件

时间:2014-03-25 18:18:16

标签: java rdf jena owl ontology

我创建了本体论文章。

现在我正在尝试阅读这个本体(owl)文件, 添加资源后,我想将其写回本地文件。

我写了这段代码。它正确加载本体并且还成功创建了资源,但它没有将模型写回owl文件。

有人可以指导我,代码有什么问题吗?

static final String inputFileName  = "./target/resources/myontology.owl";
static final String baseURI = "http://www.semanticweb.org/administrator/ontologies/2014/2/untitled-ontology-5";
....

public Resource createIndividual() 
{
    Model model = ModelFactory.createDefaultModel();

    InputStream in = FileManager.get().open(inputFileName);

     if (in == null) 
     {
         throw new IllegalArgumentException( "File: " + inputFileName + " not found");
     }       
     model.read(in, "");
     try {
        in.close();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

     Resource resource = model.createResource(baseURI+"#"+getRandomUUID());

     FileWriter out=null;
    try {
        out = new FileWriter( inputFileName );
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    try 
    {
        model.write( out, "RDF/XML-ABBREV" );
    }
    finally 
    {
       try 
       {
           out.close();
       }
       catch (IOException closeException) 
       {
           // ignore
       }
    }
    return resource;
}

运行时也会显示以下错误/警告消息。

SEVERE: Exception thrown: org.apache.jena.riot.RiotException: Premature end of file.
org.apache.jena.riot.system.ErrorHandlerFactory$ErrorHandlerStd.fatal(ErrorHandlerFactory.java:136)
org.apache.jena.riot.lang.LangRDFXML$ErrorHandlerBridge.fatalError(LangRDFXML.java:252)
com.hp.hpl.jena.rdf.arp.impl.ARPSaxErrorHandler.fatalError(ARPSaxErrorHandler.java:48)
com.hp.hpl.jena.rdf.arp.impl.XMLHandler.warning(XMLHandler.java:209)
com.hp.hpl.jena.rdf.arp.impl.XMLHandler.fatalError(XMLHandler.java:239)
org.apache.xerces.util.ErrorHandlerWrapper.fatalError(Unknown Source)
org.apache.xerces.impl.XMLErrorReporter.reportError(Unknown Source)
org.apache.xerces.impl.XMLErrorReporter.reportError(Unknown Source)
org.apache.xerces.impl.XMLErrorReporter.reportError(Unknown Source)
org.apache.xerces.impl.XMLScanner.reportFatalError(Unknown Source)
org.apache.xerces.impl.XMLDocumentScannerImpl$XMLDeclDispatcher.dispatch(Unknown Source)
org.apache.xerces.impl.XMLDocumentFragmentScannerImpl.scanDocument(Unknown Source)
org.apache.xerces.parsers.DTDConfiguration.parse(Unknown Source)
org.apache.xerces.parsers.DTDConfiguration.parse(Unknown Source)
org.apache.xerces.parsers.XMLParser.parse(Unknown Source)
org.apache.xerces.parsers.AbstractSAXParser.parse(Unknown Source)
com.hp.hpl.jena.rdf.arp.impl.RDFXMLParser.parse(RDFXMLParser.java:151)
com.hp.hpl.jena.rdf.arp.ARP.load(ARP.java:119)
org.apache.jena.riot.lang.LangRDFXML.parse(LangRDFXML.java:142)
org.apache.jena.riot.RDFParserRegistry$ReaderRIOTFactoryImpl$1.read(RDFParserRegistry.java:142)
org.apache.jena.riot.RDFDataMgr.process(RDFDataMgr.java:859)
org.apache.jena.riot.RDFDataMgr.read(RDFDataMgr.java:255)
org.apache.jena.riot.RDFDataMgr.read(RDFDataMgr.java:241)
org.apache.jena.riot.adapters.RDFReaderRIOT_Web.read(RDFReaderRIOT_Web.java:62)
com.hp.hpl.jena.rdf.model.impl.ModelCom.read(ModelCom.java:253)

2 个答案:

答案 0 :(得分:4)

Premature end of file.表示输入格式不正确,并且在某种程度上被截断,或者标签未正确关闭。

答案 1 :(得分:2)

AndyS在an answer中指出,文件的过早结束就是这样:输入文件格式不正确。但是,您遇到的另一个问题是您可能会感到困惑。您实际上并没有更改模型,因此当您将其写回来时,您将拥有与您首先阅读的相同的内容。您实际上并未使用语句

向模型添加任何内容
Resource resource = model.createResource(baseURI+"#"+getRandomUUID());

模型,无论是普通的RDF模型,还是基于OWL的OntModel,都是三元组的集合。虽然考虑与模型关联的资源(实际上,Jena 中的资源与模型相关联)通常很方便,但模型是一组三元组,而不是一组资源。使用Model的createResource方法创建资源时,您需要创建一个具有模型引用的资源,以便在执行

之类的操作时
resource.addProperty(property,object);

您正在添加三重

[resource property object]

到模特。对于任何资源,仅资源"存在"在模型中,如果有三个将资源作为主语,谓词或对象。如果您没有创建这样的三元组,那么您将无法在输出中看到对该资源的任何引用。毕竟,什么可以引用资源?

这就是为什么,例如,OntResource有一个remove方法,它删除涉及资源的所有三元组。来自JavaDoc:

  

除去

void remove()
     

从本体中删除此资源   删除任何引用它的声明,作为声明主题   或语句对象。如果此资源是属性,则此方法将为   不要删除其谓词是此属性的语句。

     

警告:Jena RDF模型包含语句,而不是资源本身   此方法通过删除所有对象来模拟对象的删除   将此资源作为主题或对象的语句,只有一个   例外。如果资源在RDF列表中引用,即作为   rdf的对象:列表单元格中的第一个语句,此引用不是   除去。从中间删除任意rdf:first语句   列表,没有做其他工作来修复列表,将留下一个   模型中的格式错误。因此,如果知道此资源   出现在模型中的某个列表中,它应该是单独的   在调用此删除方法之前从该列表中删除。

为了更清楚,请参阅以下示例,该示例显示创建资源不会向模型添加任何三元组:

import com.hp.hpl.jena.rdf.model.Model;
import com.hp.hpl.jena.rdf.model.ModelFactory;
import com.hp.hpl.jena.rdf.model.Resource;
import com.hp.hpl.jena.vocabulary.RDF;
import com.hp.hpl.jena.vocabulary.RDFS;

public class TriplesNotResourcesExample {
    public static void main(String[] args) {
        String NS = "https://stackoverflow.com/q/22643081/1281433/";
        Model model = ModelFactory.createDefaultModel();
        Resource resource = model.createResource( NS+"resource" );
        System.out.println( "<!-- BEFORE ADDING PROPERTY -->" );
        model.write( System.out );
        resource.addProperty( RDF.type, RDFS.Resource );
        System.out.println( "\n<!-- AFTER ADDING PROPERTY -->" );
        model.write( System.out );
    }
}
<!-- BEFORE ADDING PROPERTY -->
<rdf:RDF
    xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" > 
</rdf:RDF>

<!-- AFTER ADDING PROPERTY -->
<rdf:RDF
    xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
    xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#" > 
  <rdf:Description rdf:about="https://stackoverflow.com/q/22643081/1281433/resource">
    <rdf:type rdf:resource="http://www.w3.org/2000/01/rdf-schema#Resource"/>
  </rdf:Description>
</rdf:RDF>