Jena SDB란?
SDB는 다양한 관계형 데이터베이스를 백엔드로 하는 Non-Native 방식의 레파지토리로 Jena의 다양한 제품군 중 하나이다. Jena는 HP Lab에서 개발한 시맨틱웹 어플리케이션 구축을 위한 자바 프레임워크로 RDFS, OWL과 SPARQL을 위한 프로그램 환경을 제공할 뿐만 아니라 규칙 기반의 추론엔진을 포함하고 있다.
Jena를 구성하는 프로그래밍을 위한 다양한 API와 SPARQL 쿼리 엔진 외에 중요한 제품으로 레파지토리가 있는데, Jena API를 통한 In-Memory 방식 뿐만 아니라 영속 스토리지 방식의 Non-Native 및 Native 방식의 트리플 레파지토리 모두를 지원한다.
Non-Native 방식의 스토리지가 SDB로 Jena API를 통해 여러 관계형 데이터베이스로의 접속을 제공하며, SPARQL 서버인 ‘Fuseki’와 연동하여 SPARQL 쿼리를 처리한다.
아래부터는 Eclipse에서 SDB를 사용하는 방법이다.
1. Jena SDB를 Maven을 통해 받는다.
<dependency>
<groupId>org.apache.jena</groupId>
<artifactId>jena-sdb</artifactId>
<version>3.1.0</version>
</dependency>
Java Project에 Maven을 컨버트(설치)해서 SDB를 받는다.
Maven 설치 방법은 아래 링크를 참고.
2. Jena SDB 활용을 위한 테이블 구성
Jena는 RDF 기반이기 때문에 RDF 형식의 스키마 구성이 되어 있어야지 SDB 활용이 가능하다.
위와 같은 형태로 테이블을 구성해주길 바란다.
3. Jena SDB 활용 소스
package com.kepco.sc.sdb;
import java.io.InputStream;
import java.io.OutputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import org.apache.jena.rdf.model.Model;
import org.apache.jena.sdb.SDBFactory;
import org.apache.jena.sdb.Store;
import org.apache.jena.sdb.StoreDesc;
import org.apache.jena.sdb.sql.SDBConnection;
import org.apache.jena.sdb.store.DatabaseType;
import org.apache.jena.sdb.store.LayoutType;
import org.apache.jena.sdb.store.StoreFactory;
import org.apache.jena.util.FileManager;
import com.hp.hpl.jena.tdb.TDBFactory;
public class SDBUtils extends Throwable {
/**
* MariaDB
*/
/* private static final long serialVersionUID = 8802308515054175253L;
private static final String JDBC_DRIVER_CLASSNAME = "org.mariadb.jdbc.Driver";
private static final String DB_HOST = "jdbc:mariadb://localhost:3306";
private static final String DB_ID = "root";
private static final String DB_PWD = "123qwe";
private static final String DB_NAME = "testrioplestore";
private static final String DB_URL = String.format("%s/%s", DB_HOST, DB_NAME);*/
/* MSSQL DB */
private static final String JDBC_DRIVER_CLASSNAME = "com.microsoft.sqlserver.jdbc.SQLServerDriver";
private static final String CONNECTION_URL = "jdbc:sqlserver://localhost:64000;database=rdftest;integratedSecurity=true";
// private static final String DB_ID = "hr";
// private static final String DB_PWD = "hr";
private static final String SID = "xe";
// private static final String DB_URL = String.format("%s:%s", DB_HOST, SID);
private static StoreDesc storeDesc = null;
private static Store store = null;
private static SDBConnection sdbConn;
private static Connection jdbcConn = null;
static{
try{
Class.forName(JDBC_DRIVER_CLASSNAME);
}catch(Exception e){
e.printStackTrace();
}
}
// RDF 파일을 읽어서 데이터베이스에 Insert
public static void setOntologyToDB(String filePath, String ns, String prefix){
try{
// 레이아웃 타입을 Triple Hash로, 데이터베이스는 SQLServer=MSSQL로
storeDesc = new StoreDesc(LayoutType.LayoutTripleNodesHash, DatabaseType.SQLServer);
// 데이터베이스 연결
jdbcConn = getConnection();
if(jdbcConn == null){
throw new Exception("jdbcConn is null");
}
// 연결된 데이터베이스로 SDBConnection을 초기화
sdbConn = new SDBConnection(jdbcConn);
store = StoreFactory.create(storeDesc, sdbConn); // SDB와 Store로 StoreFactory 생성
InputStream is =FileManager.get().open(filePath); // RDF 파일 가져오기
Model model = SDBFactory.connectDefaultModel(store); // SDB와 Store로 모델 초기화
// String ns = "cim";
// String prefix = "http://iec.ch/TC57/2013/CIM-schema-cim16#";
// String filePath = "D:\\130604_NL_EQ111.xml";
model.setNsPrefix(ns, prefix); // ns, prefix, filePath의 값은 위와 같다.
model.read(is, null); // 모델을 읽는다.
jdbcConn.close();
sdbConn.close();
store.close();
}catch(Exception e){
e.printStackTrace();
}
}
// DB에 등록된 RDF 형식으로 저장된 테이블을 읽어오기
public static void getOntologyto(){
try{
storeDesc = new StoreDesc(LayoutType.LayoutTripleNodesHash, DatabaseType.SQLServer);
jdbcConn = getConnection();
sdbConn = new SDBConnection(jdbcConn);
store = StoreFactory.create(storeDesc, sdbConn);
Model baseModel = SDBFactory.connectDefaultModel(store); // Store를 기준으로 모델을 가져옴.
// =================== SPAQL을 통해 리딩할 수 있도록.....
baseModel.write(System.out); // 해당 모델을 출력한다.
jdbcConn.close();
sdbConn.close();
store.close();
}catch(Exception e){
e.printStackTrace();
}
}
// DB에 등록된 RDF 형식으로 저장된 테이블을 RDF 파일로 출력하기.
public static void DBtoFile(OutputStream os){
try{
storeDesc = new StoreDesc(LayoutType.LayoutTripleNodesHash, DatabaseType.SQLServer);
jdbcConn = getConnection();
sdbConn = new SDBConnection(jdbcConn);
store = StoreFactory.create(storeDesc, sdbConn);
Model baseModel = SDBFactory.connectDefaultModel(store);
baseModel.write(os);
baseModel.write(System.out);
baseModel.commit();
baseModel.close();
jdbcConn.close();
sdbConn.close();
store.close();
}catch(Exception e){
e.printStackTrace();
}
}
// RDF형식으로 저장된 스키마 테이블 삭제 기능
public static void clearDB(){
String query1 = "DELETE FROM nodes";
String query2 = "DELETE FROM prefixes";
String query3 = "DELETE FROM quads";
String query4 = "DELETE FROM triples";
PreparedStatement ps = null;
try{
storeDesc = new StoreDesc(LayoutType.LayoutTripleNodesHash, DatabaseType.SQLServer);
jdbcConn = getConnection();
sdbConn = new SDBConnection(jdbcConn);
store = StoreFactory.create(storeDesc, sdbConn);
// Model baseModel = SDBFactory.connectDefaultModel(store);
// baseModel.removeAll();
ps = jdbcConn.prepareStatement(query1);
ps.executeUpdate();
ps = jdbcConn.prepareStatement(query2);
ps.executeUpdate();
ps = jdbcConn.prepareStatement(query3);
ps.executeUpdate();
ps = jdbcConn.prepareStatement(query4);
ps.executeUpdate();
System.out.println("remove all");
jdbcConn.close();
sdbConn.close();
store.close();
}catch(Exception e){
e.printStackTrace();
}
}
// 데이터베이스 연결 메소드
private static Connection getConnection() {
try {
// return DriverManager.getConnection(DB_URL, DB_ID, DB_PWD);
return DriverManager.getConnection(CONNECTION_URL); // 커넥션 URL을 통해 연결
} catch (SQLException ex) {
ex.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
}
SDB의 활용 예제 소스의 사용법은 주석을 참고해서 확인하면 될 것 같다.
기본적으로 Java에서 JDBC를 사용하는 것과 거의 유사하므로 JDBC 사용 경험이 있다면 크게 문제 없이 활용할 수 있을 것이다.
첨부한 소스코드는 MSSQL jdbc를 이용한 소스로 오라클, mysql 등도 충분히 이용 가능하다.
소스코드에는 getConnection() => DB 연결 메소드를 포함해서 CRUD의 기초적인 기능들에 대한 소스이다.
예제 RDF 파일 소스가 있고, 그 파일을 Read해서 CRUD하는 기능들을 테스트 해보면 될 것 같다.
'Java > RDF&Jena' 카테고리의 다른 글
[Jena] Apache Jena Fuseki 리눅스 설치 방법 (0) | 2020.03.27 |
---|---|
Jena SPARQL 사용 방법 및 소스 코드 (0) | 2020.03.20 |
RDF - Jena 예제 및 주로 사용하는 함수 정리 (0) | 2020.03.12 |
RDF - Eclipse Apache Jena Xml 파일 읽어오기 (0) | 2020.03.10 |
RDF - Eclipse Apache Jena 다운로드 및 사용법 (0) | 2020.03.04 |