GOGuide GENOS

From Big Data Analytics Lab

Project GO Guide GENOS Download Publication




GENOS

1. GENOS 개요

GENOS는 OWL 데이터로 표현된 Gene Ontology를 효과적으로 처리하기 위한 시스템으로, GO Guide의 하부 구조로서 저장 부분을 지원한다. OWL 데이터의 저장을 위하여 RDF 저장소를 사용하였으며, 그 위에 OWL 질의 처리를 효과적이고 손쉽게 할 수 있도록 래퍼를 구현하였다.


2. 구조

GENOS에서는 OWL 데이터를 저장하기 위한 저장소로 Sesame를 사용하였으며 하부 RDBMS로는 MySQL을 사용하였다. 전체적인 구조는 그림 1과 같다.

Genos image001.gif
그림 1 GENOS 구조


Gene Ontology 데이터의 저장은 OWL 형식으로 변환하여 RDF 저장소를 이용하여 저장하는 방식으로 이루어진다. OWL 표준 자체가 RDF를 기반으로 하고 있기 때문에 RDF 저장소를 이용하여 OWL 데이터를 저장하는 데에는 별다른 문제는 없다. 하지만 질의 수행에 있어서 RDF 저장소가 제공하는 질의 처리 능력만으로는 OWL 시멘틱 질의를 처리하는 것이 어렵기 때문에 RDF 저장소 위에 OWL 질의 처리를 위한 래퍼를 구현하였다. 이 래퍼는 GENOS를 사용하는 어플리케이션이 직접 RDF 질의문을 사용하지 않고도 간편하게 OWL 데이터에 대한 질의를 할 수 있도록 한다.

Sesame는 하부 저장소에 대한 처리를 담당하는 인터페이스로 SAIL을 제공한다. 이 SAIL을 통해 여러 하부 저장방식을 유연하게 적용할 수 있는 확장성을 제공한다. GENOS는 성능 개선을 위해 Sesame에서 기본적으로 제공하는 RDFSchemaSAIL을 확장, 개선하여 사용한다. 더 깊은 내용은 관련 논문에 자세히 나와 있다.


3. 설치 방법

GENOS를 구성하는 요소로는 MySQL과 Sesame가 있으며, JSP와 Servlet을 이용하는 GO Guide와의 연동을 통해 서비스를 제공하기 위하여 Jakarta Tomcat이 필요하다. MySQL과 Sesame, TomCat은 모두 소스가 공개되어 있으며, GPL 라이센스를 따르기 때문에 상업적으로 사용하지 않는 이상 자유롭게 사용이 가능하다. 주의할 점은 GENOS를 사용하기 위해서는 적합한 버전의 프로그램을 사용해야 한다는 점이다. 버전이 맞지 않을 경우, GENOS가 올바르게 동작하지 않을 수 있다.


- Requirements

MySQL 4.0 이상

Jakarta Tomcat


MySQL과 Tomcat은 각각 설치하면 되며, Sesame는 이를 개선, 확장한 GENOS SAIL을 포함하여 약간의 수정을 가한 다음의 파일을 설치하도록 한다. 수정한 Sesame의 버전은 1.1.3이다.


MySQL 설치 후에는 GENOS에서 사용할 DB를 생성해 주어야 한다.

> create database DB명;


그리고 이 DB를 사용하도록 Sesame의 설정 파일을 수정하여야 하는데, 기본 데이터베이스명은 “goguide“ 으로 되어 있다. 되도록이면 이 DB명을 사용하기를 권한다. (다른 DB명을 사용할 경우 Sesame의 WEB-INF 디렉토리에 있는 system.conf 안의 DB명을 수정하여야 한다 .)


데이터베이스의 테이블 구조는 Sesame에서 사용하는 테이블 구조와 동일하다. 다음의 링크를 참조하기 바란다.


4. 데이터 로딩

GENOS를 설치한 후에는 Gene Ontology의 데이터를 데이터베이스에 넣는다. 로딩할 Gene Ontology 데이터는 Gene Ontology Consortium에서 제공하는 RDF 형식의 데이터를 다음의 프로그램을 통해 OWL 형식으로 변환한 데이터를 사용한다.


Gene Ontology 데이터의 다운로드와 변환 및 로딩은 Download 부분을 참조하기 바란다.


5. GENOS의 성능 개선 사항

1) Oracle 사용시의 저장 속도 개선

Sesame 1.1 버전은 Oracle 사용시 대용량 RDF 데이터 저장 속도가 느린 문제점이 있었다. 이 문제점을 개선 하기 위해 org.openrdf.sesame.sailimpl.dbms.Oracle 클래스를 수정하였다. 주요 수정 사항은 OptimizeTable 메소드에서 Analyze table 쿼리를 실행하게 하여 테이블의 통계 카탈로그 정보를 재계산 하도록 하였다. 이는 질의 최적화시에 올바른 카탈로그 정보를 사용하게 함으로써 저장시 사용되는 질의에 대한 효율적인 질의 처리 계획을 사용하는데 도움을 준다. 이로써 Oracle 사용시 저장 속도 개선을 할 수 있다. 이 수정사항은 Sesame 1.1.2 버전부터 반영되었다.

관련 논문 : Storage issues in GENOS

2) SeRQL 질의 처리 속도 개선

SeRQL 질의 처리시 질의에 대한 결과가 매우 많게 되면 질의 처리의 속도가 저하되는 문제점이 있다. 이는 질의 결과에 해당하는 각각의 RDF 리소스, 리터럴에 대해 SQL 질의를 수행하여 실제 내용을 얻는 과정이 있기 때문이다. Sesame 내부에서는 리소스, 리터럴은 정수값의 ID로 처리 되기 때문에 실제의 질의 결과를 만들기 위해서는 이런 과정이 필요하다. 그러나 질의 결과가 리터럴인 경우에는 이런 과정을 테이블의 조인 연산을 이용해 한번에 처리할 수 있다. SeRQL의 label() 연산자를 사용할 경우에는 이런 과정을 조인 연산으로 처리하도록 개선 하였다.

수정한 클래스는 다음과 같다

org.openrdf.sesame.query.serql.model.SfwQuery

org.openrdf.sesame.sailimpl.rdbms.RdbmsPathExpression

org.openrdf.sesame.sailimpl.rdbms.RdfSource

관련 논문 : Storage issues in GENOS

3) RDFS 추론 속도 개선

Sesame는 데이터 저장시 RDFS 추론 과정을 거친다. 질의 처리 속도를 향상시키고 질의 처리 구현을 간단히 하기 위해 저장시 추론 결과를 모두 저장한다. 그러나 대용량의 데이터 저장시에는 추론 과정의 시간이 많이 걸리는 단점이 있다. 이를 해결해기 위해 추론 속도 개선을 한 GENOSInferencer를 구현하였다. GENOSInferencer는 RDFS 규칙 적용순서를 규칙의 의미를 고려하여 정하였으며 이는 불필요한 규칙 적용을 줄이고 중복된 중간 결과 생성을 줄임으로써 추론 속도를 개선할 수 있다.

관련 논문 : RDFS 함의 규칙 적용 순서를 고려한 전방향 RDFS 추론 엔진의 최적화


6. 질의 처리

GO Guide에서는 데이터를 GENOS(Sesame)에 저장을 하기 때문에 이 저장된 데이터에 맞는 질의가 이루어져야 하며 이를 위해 SeRQL을 사용한다. Gene Ontology에서의 질의는 크게 3가지의 관계를 질의하는 것으로 구성된다. 바로 term과 term사이의 is-a 관계, part-of 관계 그리고 gene_product와 term사이의 관계이다.
Genos image002.png
우선 is-a 관계는 아래 그림에서와 같은 SeRQL로 표현된다. 즉, 이름이 molecular function이면서 그 term의 자식 관계에 있는 term을 찾는 질의가 된다. 이 질의의 결과는 그림에서 보듯이 GO:0016209가 된다. Serql:directSubClassOf는 자식 관계를 나타내주는 술어이며, rdfs:subClassOf의 술어는 자식이 아닌 모든 자손들을 다 나타내주는 술어이다.

Part-of 관계는 OWL에서 Restriction으로 묶여 있는 term을 찾는 관계가 된다. 아래그림은 이런 part-of 관계를 나타내어 준다. 이 그림은 GO:0003674의 term과 part-of 관계에 있는 term을 찾는 질의이다.
Genos image003.png Genos image004.png

gene_product와 term의 관계는 아래 그림과 같이 나타낼 수 있다. 즉, 그래프에서 자기 term에 속하는 여러 gene_product들을 찾는 질의이다. 여기서는 “4030414C22Rik”이라는 gene_product에 관계하는 term을 찾는 질의가 된다. Genos image005.png

Genos image006.png


GO Guide에서는 앞서 설명한 Gene Ontology의 관계를 처리하며 UI에서 입력한 질의 형태 즉, 트리플의 패턴을 SeRQL로 변환하여 처리한다. 이 때 UI에서 사용자가 입력하는 질의는 OWL-QL의 형태이다. 즉 트리플의 패턴이고 must-binding 변수를 포함시켜 사용자가 찾고자 하는 변수를 찾을 수 있게 해 준다. SeRQL 질의 변환은 아래 그림과 같은 과정으로 이루어 진다. 사용자가 UI에서 질의를 입력하면, 이렇게 입력된 트리플 패턴은 해당되는 술어에 해당되는 SeRQL로 변환된다. 예를 들면 part-of 관계이면 part-of 관계를 기술할 수 있게 미리 정의된 SeRQL을 사용한다. 이러한 패턴이 계속해서 입력이 되면 여러 가지 SeRQL로 표현이 된다. 여기서는 이러한 SeRQL을 하나로 통합해서 사용하도록 한다. 즉, SeRQL에서 must-binding 변수와 경로를 따로 분리해서 각각의 사용자 입력에 대해 맞는 패턴을 찾아서 계속해서 경로를 통합해서 하나의 경로로 만들어서 SeRQL에서 사용하게 된다. 이렇게 하나의 경로로 통합이 되면 SeRQL의 FROM 절 뒤에 이 경로를 써서 사용하게 된다. 따라서 사용자는 트리플로 구성된 질의를 주어도 GO Guide에서는 이 트리플 질의를 SeRQL로 바꾸어서 사용하게 되는 것이다. 이는 SeRQL이 가장 강력한 질의어로서 Sesame에서 제공해 주는 질의어를 사용하기 위해 이런 변환을 주는 것이다. 사용자에게는 트리플 패턴이 더 사용하기 쉽고 시스템적인 측면에서는 SeRQL로 처리하는 것이 효과적이다.

아래 그림은 이러한 변환을 사용해서 질의를 처리하는 과정을 나타내어 주고 있다. 사용자가 입력한 질의어를 각각의 패턴에 맞는 경로를 만들어서 그 각각의 경로를 합쳐서 하나의 SeRQL로 표현한다. 즉 is-a 관계, part-of 관계, annotated(term과 gene_product)의 관계를 그림 7에서는 하나의 질의어로 만들어서 사용한다. is-a 관계 일 때 사용되는 경로, part-of 관계일 때 사용되는 경로, annotated 관계일 때 사용되는 경로가 하나의 경로로 합쳐지고 사용자가 주는 must-binding 변수에 대해 질의 처리를 수행하게 된다.



위의 질의처리 과정은 “GO:0009987”의 “part-Of” 관계이면서 “GO:0043012”의 부모인 term에 해당하는 gene_product를 찾는 질의어이다. 3개의 트리플 입력이 하나의 SeRQL로 표현되는 과정을 나타내주고 있다. 즉 3개의 트리플 경로가 하나의 경로 표현으로 나타내어 지는 것이다.

지금까지 살펴본 바와 같이 GO Guide에서 사용자는 사용자 인터페이스를 통한 단순한 트리플 패턴만으로도 변환된 SeRQL을 손쉽게 사용할 수 있다. 그리고 이러한 변환을 위해 트리플 패턴 (P,S,O)로 이루어진 트리플 질의를 적용하였다.


7. 클래스 설명

Query_Proc Class


1) 역할 : 사용자 인터페이스에서 트리플 질의를 입력으로 주면 질의를 SeRQL로 변환하여 Gene Ontology에서의 결과를 생성한다. 즉 RDMS에 저장되어 있는 OWL Ontology를 Query(SeRQL, RQL, RDQL)로 질의할 수 있게 하는 한다. Go Guide에서는 SeRQL을 사용한다.


2) 주요 메서드

메서드 이름 매개변수 Return 값 내용
getRepository() Sesame의 Sail에 접속해서 Persistent 객체를 생성하여 전역 변수로 가지고 있게 한다.
input() Vector, String result_set Input_vector와 binding_val를 받아서 analysis_input 메서드로 보내서 result_set에 결과를 저장한다.
process_Query() String result_set 질의를 받아서 SeRQL로 질의를 해서 결과를 return한다.
analysis_input() Vector, String 입력된 vector를 분석하여 각각의 query를 SeRQL로 보내는 메서드
display_vector() 결과를 출력하는 메서드


  • input_vector(Vector type) : 사용자의 트리플 질의를 vector로 저장하여 가지고 있는다.
  • Binding_val(String type) : 사용자가 원하는 결과에 대한 변수 (Ex. ?x)