2017-04-26 15 views
0

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에서 실행할 경우 파서를 찾을 수 없습니다.

는 최소한의 예를하게 IntelliJ IDEA 프로젝트입니다 : https://drive.google.com/open?id=0B10MbhsMWfrydVNKZVJ0QVg1NlE

그리고 여기에 상응하는 최소한의 항아리입니다 : 여기

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) 
+0

파서는 어떻게로드/발견됩니까? 그것은 파서 (OWLOBO12)를 발견 한 것으로 보입니다. 그러나 그것은 당신이 원하는 파서가 아닙니다. 그 맞습니까? 단위 테스트와 메인을 어떻게 실행하는지 볼 수 있습니다. 즉, IDE 또는 명령 줄을 사용하고 있습니까? 이것은 클래스 경로 문제를 디버그하는 데 도움이 될 수 있습니다. – cmonkey

+0

@ cmonkey, 설명을 편집했습니다. IntelliJ IDEA에서 클래스 기본 및 JUnit 테스트를 시작합니다. 항아리의 경우 명령 줄에서 실행하는지 또는 IntelliJ에서 실행하는지에 관계없이 동일한 예외가 발생합니다. 어떤 파서가 사용되는지는 신경 쓰지 않고, RDF XML을 구문 분석 할 수있는 구문 분석기가 필요하다. – balt

+0

@ cmonkey, 필자는 또한 최소한의 IntelliJ IDEA 프로젝트와 IDEA의 프로젝트로 구축 한 jar 파일에 대한 링크를 추가했습니다. – balt

답변

1

META-INF/services 폴더 org.semanticweb.owlapi.io.OWLParserFactory의 여러 복사본을 포함 - 이러한 가능성 OWLAPI 종속성의 당신의 병합에서오고있다.

각 모듈은이 파일에서 모듈에서 어떤 파서를 찾을 수 있는지 선언합니다 (인스턴스를 제공하기 위해 ServiceLoader로 해석됩니다). owlapi-distribution에는 OWLAPI 모듈에서 제공하는 모든 파일의 병합 복사본이 포함되어 있습니다. 단지에 포함 된 유일한 파일인지 확인해야합니다.

이 폴더에있는 다른 파일들도 마찬가지입니다.

+0

[메일 링리스트의 응답] (https://sourceforge.net/p/owlapi/mailman/message/35809232/) 덕분에, 일단 owlapi-distribution 대신에'owlapi-osgidistribution'을 사용했다는 것을 알았습니다 ', 그것은 작동합니다 (MWE 용). MWE를 만들기 전에 저의 실수는 Gradle 의존성으로서 ** owlapi-distribution과 owlapi-osgidistribution을 가지고 있었지만, owlapi-osgidistribution만을 필요로했을 뿐이 었습니다. – balt