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 정의를 삭제

댓글

이 블로그의 인기 게시물

[DevTip] Windows에서 tail 쓰기...

환경개선부담금

Electropermanent Magnets: Programmable Magnets with Zero Static Power Consumption Enable Smallest Modular Robots Yet