Java에서 온톨로지 가져 오기 도구를 작성하여 RDF 형식의 .owl 파일을 JSON 형식의 문자열로 구문 분석했습니다. 보다 구체적으로, 정적 메소드 parseOntologyObjectHierarchy
은 온톨로지에 정의 된 클래스 계층 구조를 JSON으로 구문 분석합니다. JUnit 테스트에서 메소드를 호출하거나 클래스의 main
메소드 (JUnit 및 클래스 main은 IntelliJ IDEA Professional 2017에서 호출 됨)를 호출하면 모든 것이 잘 작동합니다. 그러나, 클래스를 모든 종속성을 포함하는 gradle을 사용하는 jar로 패키징하면 org.semanticweb.owlapi.io.UnparsableOntologyException
이됩니다. 항아리에는 실제로 필요한 RDFXMLParser
이 들어 있습니다. 항아리에있는 classpath가 제대로 설정되지 않았습니까? 여기 OWLAPI : Jar에서 실행할 경우 파서를 찾을 수 없습니다.
그리고 여기에 상응하는 최소한의 항아리입니다 : 여기
public static String parseOntologyObjectHierarchy(String filename) throws OWLException {
System.out.println("OWL file: " + filename);
OWLOntology ontology = loadOntology(filename);
OWLDataFactory df = OWLManager.getOWLDataFactory();
return json = hierarchyToString(ontology, df.getOWLThing());
}
public static OWLOntology loadOntology(String filename) throws OWLOntologyCreationException {
File ontologyFile = new File(filename);
if (!ontologyFile.exists() || !ontologyFile.isFile()) {
throw new IllegalArgumentException("OWL file is not a file");
}
OWLOntologyManager ontologyManager = OWLManager.createOWLOntologyManager();
OWLOntologyDocumentSource source = new FileDocumentSource(new File(filename), new RDFXMLDocumentFormat());
return ontologyManager.loadOntologyFromOntologyDocument(source);
}
내 build.gradle입니다 : 여기
https://drive.google.com/open?id=0B10MbhsMWfrybjJIcDNWd0JFMUk 코드입니다 :
group 'com.example'
version '0.1.0-SNAPSHOT'
apply plugin: 'java'
sourceCompatibility = 1.8
repositories {
mavenCentral()
}
dependencies {
compile group: 'net.sourceforge.owlapi', name: 'owlapi-osgidistribution', version: '5.1.0'
compile group: 'net.sourceforge.owlapi', name: 'owlapi-apibinding', version: '5.1.0'
compile group: 'net.sourceforge.owlapi', name: 'owlapi-parsers', version: '5.1.0'
compile group: 'net.sourceforge.owlapi', name: 'owlapi-impl', version: '5.1.0'
compile 'com.google.code.gson:gson:2.8.0'
compile 'net.sourceforge.owlapi:org.semanticweb.hermit:1.3.8.510'
compile group: 'org.glassfish', name: 'javax.json', version: '1.0.4'
testCompile group: 'junit', name: 'junit', version: '4.12'
}
task fatJar(type: Jar) {
manifest {
attributes 'Implementation-Title': 'ExampleCom Ontology Importer',
'Implementation-Version': version,
'Main-Class': 'com.example.ontology.OntologyImporter'
}
baseName = project.name + '-all'
from { configurations.compile.collect { it.isDirectory() ? it : zipTree(it) } }
with jar
}
여기에 exc eption 텍스트 : 당신의 최소한의 항아리에
$ java -jar am-ontology_importer-all-0.1.0-SNAPSHOT.jar
OWL file: C:/Users/me/Desktop/Projects/example/example-0.1.0.owl
SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further detail
s.
Exception in thread "main" org.semanticweb.owlapi.io.UnparsableOntologyException
: Problem parsing file:/C:/Users/me/Desktop/Projects/example/example-0.1.0.owl
Could not parse ontology. Either a suitable parser could not be found, or parsi
ng failed. See parser logs below for explanation.
The following parsers were tried:
1) [email protected]
Detailed logs:
--------------------------------------------------------------------------------
Parser: [email protected]
Stack trace:
Lexical error at line 1, column 22. Encountered: "\n" (10), after : "" o
rg.coode.owlapi.obo12.parser.OBOParserTokenManager.getNextToken(OBOParserTokenMa
nager.java:1059)
org.coode.owlapi.obo12.parser.OBOParser.jj_ntk_f(OBOParser.java:296)
org.coode.owlapi.obo12.parser.OBOParser.TagValuePair(OBOParser.java:147)
org.coode.owlapi.obo12.parser.OBOParser.Header(OBOParser.java:110)
org.coode.owlapi.obo12.parser.OBOParser.parse(OBOParser.java:80)
org.coode.owlapi.obo12.parser.OWLOBO12Parser.parse(OWLOBO12Parser.java:1
09)
uk.ac.manchester.cs.owl.owlapi.OWLOntologyFactoryImpl.loadOWLOntology(OW
LOntologyFactoryImpl.java:188)
uk.ac.manchester.cs.owl.owlapi.OWLOntologyManagerImpl.load(OWLOntologyMa
nagerImpl.java:1072)
uk.ac.manchester.cs.owl.owlapi.OWLOntologyManagerImpl.loadOntology(OWLOn
tologyManagerImpl.java:1033)
uk.ac.manchester.cs.owl.owlapi.OWLOntologyManagerImpl.loadOntologyFromOn
tologyDocument(OWLOntologyManagerImpl.java:982)
at uk.ac.manchester.cs.owl.owlapi.OWLOntologyFactoryImpl.loadOWLOntology
(OWLOntologyFactoryImpl.java:229)
at uk.ac.manchester.cs.owl.owlapi.OWLOntologyManagerImpl.load(OWLOntolog
yManagerImpl.java:1072)
at uk.ac.manchester.cs.owl.owlapi.OWLOntologyManagerImpl.loadOntology(OW
LOntologyManagerImpl.java:1033)
at uk.ac.manchester.cs.owl.owlapi.OWLOntologyManagerImpl.loadOntologyFro
mOntologyDocument(OWLOntologyManagerImpl.java:982)
at com.example.ontology.OntologyImporter.loadOntology(OntologyImpo
rter.java:52)
at com.example.ontology.OntologyImporter.parseOntologyObjectHierar
chy(OntologyImporter.java:64)
at com.example.ontology.OntologyImporter.main(OntologyImporter.jav
a:142)
파서는 어떻게로드/발견됩니까? 그것은 파서 (OWLOBO12)를 발견 한 것으로 보입니다. 그러나 그것은 당신이 원하는 파서가 아닙니다. 그 맞습니까? 단위 테스트와 메인을 어떻게 실행하는지 볼 수 있습니다. 즉, IDE 또는 명령 줄을 사용하고 있습니까? 이것은 클래스 경로 문제를 디버그하는 데 도움이 될 수 있습니다. – cmonkey
@ cmonkey, 설명을 편집했습니다. IntelliJ IDEA에서 클래스 기본 및 JUnit 테스트를 시작합니다. 항아리의 경우 명령 줄에서 실행하는지 또는 IntelliJ에서 실행하는지에 관계없이 동일한 예외가 발생합니다. 어떤 파서가 사용되는지는 신경 쓰지 않고, RDF XML을 구문 분석 할 수있는 구문 분석기가 필요하다. – balt
@ cmonkey, 필자는 또한 최소한의 IntelliJ IDEA 프로젝트와 IDEA의 프로젝트로 구축 한 jar 파일에 대한 링크를 추가했습니다. – balt