[英]Problems to read a owl ontology using Jena
我正在嘗試使用耶拿(Jena)閱讀貓頭鷹本體。 本體是在Protégé中創建的。
這是我的原始.owl文件的一部分(某些術語用葡萄牙語):
<?xml version="1.0"?>
<!DOCTYPE Ontology [
<!ENTITY xsd "http://www.w3.org/2001/XMLSchema#" >
<!ENTITY xml "http://www.w3.org/XML/1998/namespace" >
<!ENTITY rdfs "http://www.w3.org/2000/01/rdf-schema#" >
<!ENTITY rdf "http://www.w3.org/1999/02/22-rdf-syntax-ns#" >
]>
<Ontology xmlns="http://www.w3.org/2002/07/owl#"
xml:base="http://james.miranda.br/Onto"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:xml="http://www.w3.org/XML/1998/namespace"
xmlns:xsd="http://www.w3.org/2001/XMLSchema#"
xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#"
ontologyIRI="http://james.miranda.br/Onto"
versionIRI="http://james.miranda.br/Onto/1.0.0">
<Prefix name="" IRI="http://www.w3.org/2002/07/owl#"/>
<Prefix name="owl" IRI="http://www.w3.org/2002/07/owl#"/>
<Prefix name="rdf" IRI="http://www.w3.org/1999/02/22-rdf-syntax-ns#"/>
<Prefix name="xsd" IRI="http://www.w3.org/2001/XMLSchema#"/>
<Prefix name="rdfs" IRI="http://www.w3.org/2000/01/rdf-schema#"/>
<Annotation>
<AnnotationProperty abbreviatedIRI="rdfs:comment"/>
<Literal xml:lang="en" datatypeIRI="&rdf;PlainLiteral">Ontology for the decision process</Literal>
</Annotation>
<Annotation>
<AnnotationProperty abbreviatedIRI="rdfs:comment"/>
<Literal xml:lang="pt" datatypeIRI="&rdf;PlainLiteral">Ontologia para o processo de tomada de decisões.</Literal>
</Annotation>
<Declaration>
<Class IRI="#AcaoDesign"/>
</Declaration>
<Declaration>
<Class IRI="#Alternativa"/>
</Declaration>
PasteBin中的完整文件
這是我的課:
public class ReadOntology {
public static void run(String ontologyInFile) {
OntModel model = ModelFactory.createOntologyModel(OntModelSpec.OWL_DL_MEM_RULE_INF, null);
InputStream ontologyIn = FileManager.get().open(ontologyInFile);
loadModel(model, ontologyIn);
}
/**
* @param m
* @param ontologyIn */
protected static void loadModel(OntModel m, InputStream ontologyIn) {
try {
m.read(ontologyIn, "RDF/XML");
//also tried m.read(ontologyIn, "OWL/XML");
} catch (Exception e) {
System.out.println(e.getMessage());
}
}
}
我在HTTP Servlet類中使用此類,如下所示:
ServletContext context = this.getServletContext();
String fullPath = context.getRealPath("/WEB-INF/ontology/Onto.owl");
ReadOntology.run(fullPath);
並且我收到以下錯誤:
log4j:WARN No appenders could be found for logger (org.apache.jena.riot.system.stream.JenaIOEnvironment).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
Error [line: 27, col: 64] {E201} Multiple children of property element
我以為問題是log4j,但是此問題中的評論將我帶到了另一個方向。
經過一番研究和關注,我在Ontology API文檔中看到Jena沒有完全支持OWL2,顯然,這就是問題所在。 對於另一個問題的答案表明,解決方案可以在.owl文件中。
最后,我將其保存在RDF / XML中(文件擴展名仍然是.owl),結果是:
<?xml version="1.0"?>
<!DOCTYPE rdf:RDF [
<!ENTITY owl "http://www.w3.org/2002/07/owl#" >
<!ENTITY xsd "http://www.w3.org/2001/XMLSchema#" >
<!ENTITY rdfs "http://www.w3.org/2000/01/rdf-schema#" >
<!ENTITY rdf "http://www.w3.org/1999/02/22-rdf-syntax-ns#" >
]>
<rdf:RDF xmlns="http://www.w3.org/2002/07/owl#"
xml:base="http://www.w3.org/2002/07/owl"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:owl="http://www.w3.org/2002/07/owl#"
xmlns:xsd="http://www.w3.org/2001/XMLSchema#"
xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#">
<Ontology rdf:about="http://james.miranda.br/Onto">
<rdfs:comment xml:lang="en">Ontology for the decision making process</rdfs:comment>
<rdfs:comment xml:lang="pt">Ontologia para o processo de tomada de decisões.</rdfs:comment>
<versionIRI rdf:resource="http://james.miranda.br/Onto/1.0.0"/>
</Ontology>
<!--
///////////////////////////////////////////////////////////////////////////////////////
//
// Object Properties
//
///////////////////////////////////////////////////////////////////////////////////////
-->
<!-- http://james.miranda.br/Onto#atende -->
<ObjectProperty rdf:about="http://james.miranda.br/Onto#atende">
<rdf:type rdf:resource="&owl;InverseFunctionalProperty"/>
</ObjectProperty>
<!-- http://james.miranda.br/Onto#compoe -->
<ObjectProperty rdf:about="http://james.miranda.br/Onto#compoe">
<rdfs:subPropertyOf rdf:resource="http://james.miranda.br/Onto#ehParteDe"/>
</ObjectProperty>
<!-- http://james.miranda.br/Onto#conflitaCom -->
<ObjectProperty rdf:about="http://james.miranda.br/Onto#conflitaCom">
<rdf:type rdf:resource="&owl;ReflexiveProperty"/>
</ObjectProperty>
PasteBin中的完整文件。
但是同樣的錯誤仍然存在。 我發現其他 問題有類似的問題,但解決方案並不能幫助我。
我現在不知道該怎么辦。 我做錯了什么?
信息:
只是為了告知遇到與我的問題類似的任何人(或任何想使用Jena來閱讀Protégé本體論的人),以下是我用來實現此問題的過程和代碼:
1-在Protégé中,將文件另存為RDF / XML;
2-將文件復制到您的WEB-INF目錄(如果需要,可以在任何子目錄下);
3-創建一個類來閱讀您的本體。 例如:
import java.io.InputStream;
import org.apache.jena.ontology.*;
import org.apache.jena.rdf.model.ModelFactory;
import org.apache.jena.util.FileManager;
public class ReadOntology {
public OntModel model;
public static void run(String ontologyInFile) {
model = ModelFactory.createOntologyModel(OntModelSpec.OWL_DL_MEM_RULE_INF, null);
InputStream ontologyIn = FileManager.get().open(ontologyInFile);
loadModel(model, ontologyIn);
}
/**
* @param m
* @param ontologyIn */
protected static void loadModel(OntModel m, InputStream ontologyIn) {
try {
m.read(ontologyIn, "RDF/XML");
} catch (Exception e) {
System.out.println(e.getMessage());
}
}
}
4-使用Servlet類(擴展HttpServlet),可以使用創建的類,如下所示:
ServletContext context = this.getServletContext();
String fullPath = context.getRealPath("/WEB-INF/yourOntologyName.owl");
ReadOntology.run(fullPath);
ExtendedIterator<OntClass> classIterator = ReadOntology.model.listClasses();
while (classIterator.hasNext()) {
OntClass ontClass = classIterator.next();
System.out.println(ontClass.toString());
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.