OwlAPI and HermiT on Android
[Implementation Issues on Using Ontology]
OWL API로 온톨로지를 모델링하고 HermiT로 추론하는 작업을 구현할 때 발생하는 문제들과 해결 방안을 정리해 본다.
1. Java (for test)
- 필요한 환경은 Maven의 dependency를 이용하면 간단하게 구성할 수 있고,
API를 이용한 프로그래밍에 주력하면 됨. - Java 호환성 1.8 명시
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>
- Maven 프로젝트용 pom.xml에 dependency 추가
<dependency>
<groupId>net.sourceforge.owlapi</groupId>
<artifactId>owlapi-distribution</artifactId>
<version>5.0.5</version>
/dependency>
<dependency>
<groupId>net.sourceforge.owlapi</groupId>
<artifactId>org.semanticweb.hermit</artifactId>
<version>1.3.8.500</version>
</dependency>
- [팁] 추후 JAR 생성 시, 필요한 lib들을 모두 한 폴더(예: target/lib)에 몰아 넣을 수 있도록 Maven plugin 추가
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<executions>
<execution>
<id>copy-dependencies</id>
<phase>prepare-package</phase>
<goals>
<goal>copy-dependencies</goal>
</goals>
<configuration>
<outputDirectory>${project.build.directory}/lib</outputDirectory>
<overWriteReleases>false</overWriteReleases>
<overWriteSnapshots>false</overWriteSnapshots>
<overWriteIfNewer>true</overWriteIfNewer>
</configuration>
</execution>
</executions>
</plugin>
2. Android
- Maven 대신 Gradle을 이용해 dependency 해소
- 이런저런 충돌, 오류가 엄청 많이 발생함
-> 수작업으로 해소시켜야 하고, Reasoner (HermiT)은 소스 직접 수정해야 함 - PC 상의 Java에서와는 다르게, Parser가 .owl 파일의 일부 namespace 정의(버전?)를 제대로 처리하지 못해 오류를 뿜어낼 수 있음.
- rdf:RDF 태그 내에, xmlns:1.0="http://site/sub/1.0#"와 같은 라인이 있었다면 삭제해야 할 수 있음.
- 조치 1: build.gradle에 Java 호환성 명시
compileOptions{
sourceCompatibilityJavaVersion.VERSION_1_8
targetCompatibilityJavaVersion.VERSION_1_8
}
- 조치 2: build.gradle에 OWL API dependency 추가
repositories{
mavenCentral()
}
implementation('net.sourceforge.owlapi:owlapi-distribution:5.1.7'){
//transitive=false
excludegroup:'net.sourceforge.owlapi',module:'owlapi-compatibility'
//excludegroup:'org.apache.httpcomponents'
excludegroup:'org.apache.httpcomponents',module:'httpclient-osgi'
excludegroup:'org.apache.httpcomponents',module:'httpcore-osgi'
}
- 조치 3: HermiT dependency 추가
- Reasoner 소스 추가 & 수정
- Maven repository에서 1.4.3.517의 소스 JAR 다운로드
- org.semanticweb.HermiT과 rationals 패키지 복사
- debugger 디렉토리 삭제 (java.awt 이용)
- Reasoner.java에서 Debugger 인스턴스 생성하는 부분 comment 처리
- ProtegeReasonerFactory.java 삭제
- rationals/Transition.java에서 java.awt.Point를 android.graphics.Point로 대체
- build.gradle에 dependency 추가
implementation 'net.sf.trove4j:trove4j:3.0.3'
implementation 'gnu.getopt:java-getopt:1.0.13'
implementation 'dk.brics.automaton:automaton:1.11-8'
implementation ('org.apache.ws.commons.axiom:axiom-api:1.2.22') { transitive = false }
implementation ('org.apache.ws.commons.axiom:axiom-c14n:1.2.22') { transitive = false }
implementation ('org.apache.ws.commons.axiom:axiom-impl:1.2.22') { transitive = false }
- 조치 4: build.gradle에 기타 dependency 추가
implementation 'javax.inject:javax.inject:1'
implementation('xerces:xercesImpl:2.12.0') {
// exclude group: 'xml-apis', module: 'xml-apis'
}
// implementation 'xml-apis:xml-apis:1.4.01'
- 조치 5: build.gradle에 패키지 중복 파일 예외 처리
packagingOptions {
exclude 'META-INF/axiom.xml'
exclude 'META-INF/DEPENDENCIES'
exclude 'mozilla/public-suffix-list.txt'
exclude 'org/apache/commons/codec/language/bm/*.txt'
exclude 'org/apache/commons/codec/language/dmrules.txt'
exclude 'org/apache/http/version.properties'
exclude 'org/apache/http/entity/mime/version.properties'
exclude 'org/apache/http/nio/version.properties'
exclude 'org/apache/http/client/version.properties'
}
- 조치 6: OWL Schema, Rule 파일에서 버전을 지정하는 namespace 정의를 삭제
댓글
댓글 쓰기