我创建了本体论文章。
现在我正在尝试阅读这个本体(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)
答案 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>