기술자료

DBMS, DB 구축 절차, 빅데이터 기술 칼럼, 사례연구 및 세미나 자료를 소개합니다.

Linux, UNIX 및 Windows용 DB2 10에서의 자원 기술 프레임워크 애플리케이션 개발, 파트 1: RDF 저장소 작성 및 유지보수(2)

기술자료
DBMS별 분류
DB2
작성자
dataonair
작성일
2014-02-05 00:00
조회
6112


◎ 연재기사 ◎


Linux, UNIX 및 Windows용 DB2 10에서의 자원 기술 프레임워크 애플리케이션 개발, 파트 1: RDF 저장소 작성 및 유지보수(1)


Linux, UNIX 및 Windows용 DB2 10에서의 자원 기술 프레임워크 애플리케이션 개발, 파트 1: RDF 저장소 작성 및 유지보수(2)



스킬 레벨: 중급
자원 기술 프레임워크(RDF, Resource Description Framework)는 데이터 및 메타데이터 교환을 지원하는 W3 스펙 표준 패밀리 입니다. Linuxⓡ, UNIXⓡ 및 Windowsⓡ용 IBMⓡ DB2ⓡ 10의 Enterprise Server Edition을 사용하는 애플리케이션으로 RDF 데이터를 저장하고 쿼리할 수 있습니다. 이 튜토리얼에서는 샘플 RDF 애플리케이션을 빌드하고 유지보수하는 단계를 안내합니다. 이 프로세스 중에 RDF 기술과 함께 DB2 소프트웨어를 사용하는 방법을 실습을 통해 학습 합니다. 참고: QueryRdfStore 명령을 사용하여 RDF 저장소를 쿼리하는 다른 방법을 추가로 포함시켜 달라는 독자의 요청에 따라 이 튜토리얼을 업데이트했음을 밝혀둡니다.



RDF 애플리케이션 개발 환경 설정
이 튜토리얼에서는 Eclipse를 기반으로 하고 데이터베이스 작업을 위한 다양한 기능을 제공하는 IBM Data Studio 제품을 사용 합니다. 하지만 이 튜토리얼의 실습에 Eclipse를 사용할 수도 있습니다. 시스템에 JRE 1.6 이상이 설치되어 있는지 확인 합니다.


RDF 애플리케이션 개발 환경을 설정하는 방법은 다음과 같습니다.



1. DB2RDFTutorial 프로젝트를 IBM Data Studio로 가져옵니다.



a. File > Import를 클릭합니다.


b. 팝업 창에서 General > Existing Projects into Workspace를 선택합니다.


c. DB2RDFTutorial.zip 파일에서 파일 압축을 푼 위치에서 폴더를 선택합니다.


d. DB2RDFTutorial 프로젝트를 선택하고 Finish를 클릭합니다



tech_img953.jpg


2. 모든 필수 JAR 파일을 클래스 경로에 추가 합니다.



a. 프로젝트를 마우스 오른쪽 단추로 클릭하고 Properties를 선택 합니다.


b. 팝업 창에서 Java build path를 선택합니다



tech_img954.jpg


3. Add External Jars를 클릭하고 install_path/sqllib/rdf/lib 폴더에 있는 모든 JAR 파일을 선택하여 install_path/sqllib/rdf/lib 폴더의 모든 JAR 파일을 프로젝트 빌드 경로에 추가 합니다.



4. 이전 단계와 같은 방법으로 install_path/sqllib/java 폴더의 db2jcc4.jar 파일을 빌드 경로에 추가 합니다.



작업 영역의 최종 구조는 그림 3과 같은 모습이어야 합니다.



tech_img955.jpg


RDF 애플리케이션으로 데이터 로드



4개의 원본 시스템에서 생성되는 파일을 직원 배치 시스템으로 로드할 수 있습니다. 직원 배치 시스템이 설정되어 있을 때, 이 시스템은 4개의 원본 시스템이 N-트리플 형식의 데이터를 작성할 것을 요청합니다. 이 튜토리얼의 경우, resources 폴더에 샘플 N-트리플 파일이 있습니다.



이제, 직원 배치 시스템으로 이 데이터를 삽입하는 방법을 살펴봅시다.



그래프 삽입



저장소에 완전한 그래프를 삽입했는데 저장소에 그 그래프가 존재하지 않을 경우, 데이터를 수동으로 삽입하는 대신 대량 삽입 옵션을 사용할 수 있습니다. 이 경우에는 배치 조작을 사용하여 그래프의 모든 트리플이 저장소에 삽입됩니다.



4개의 시스템에서 RDF 저장소로 최초 데이터를 삽입하려면 InsertGraph.java 샘플 프로그램을 사용하며, 프로그램에서는 다음 단계를 수행합니다.



1. 연결을 작성합니다. DB2 데이터베이스 서버로 RDF 프로그램을 실행하려면 연결을 작성하여 인수로서 전달해야 합니다



목록 1. 연결 작성



Connection conn = null; Store store = null; String storeName = "staffing";
String schema = "prsahoo"; try { Class.forName("com.ibm.db2.jcc.DB2Driver");
conn=DriverManager.getConnection
("jdbc:db2://localhost:50000/REPOSDB","prsahoo","Ranjan60");
conn.setAutoCommit(false); }
catch (ClassNotFoundException e1) { e1.printStackTrace(); }



2. 이 연결을 사용하여 저장소에 연결합니다.



목록 2. 저장소에 연결



// Connect to the storestore = Store Manager.connectStore(conn, schema, storeName);



저장소에 대한 작업을 할 때마다 연결을 작성하여 저장소에 연결해야 합니다. 이런 작업은 이 튜토리얼에 있는 모든 샘플 프로그램에 필수적이지만, 이후의 샘플 프로그램 설명에서는 건너뛸 것입니다.



3. 각 N-트리플 파일에 대한 메모리 내 모델을 작성합니다. N-트리플 파일에서 읽는 데 JENARiotLoader.read 메소드가 사용됩니다.



목록 3. 메모리 내 모델 작성



private static Model createInMemoryModel(String inputFileName) { Model memModel = null; //Input the file using the FileManager InputStream in = FileManager.get().open(inputFileName); if (in == null) { throw new IllegalArgumentException( "File: " + inputFileName + " not found");
} // Read the RDF/XML file
Data setGraph dsg = Data setGraphFactory.createMem();
// Because n-triples is nothing but n-quad without graph, this will
// just go to defaultgraph
RiotLoader.read(in, dsg, Lang.NQUADS, "");
memModel = ModelFactory.createModelForGraph(dsg.getDefaultGraph());
try {
in.close();
} catch (IOException e) {
e.printStackTrace();
}
return memModel;



4. Model.union() 조작을 사용하여 4개의 모델을 전부 단일 모델로 병합합니다.



목록 4. 연결 작성



// Merge all the four in-memory models into a single graph Model merged = mHr.union(mProj); merged = merged.union(mOrg); merged= merged.union(mLegal);



5. staffing 저장소에 있는 기본 그래프(모델)에 병합된 모델을 추가합니다. 이 조작은 DB2 트랜잭션 내에 랩핑되어야 합니다.



목록 5. 기본 그래프에 병합된 모델 추가



// Connect to the defaultModel in the staffing storeModel staffingDefaultModel
= RdfStoreFactory.connectDefaultModel(store, conn);
// Begin a transaction, add the merged in-memory model to \the staffing store's default model and commit the transactionstaffingDefaultModel.begin();staffingDefaultModel.add(merged);staffingDefaultModel.commit();



기본 그래프 대신 명명된 그래프에 데이터를 추가하려면 RdfStoreFactory.connectNamedModel() 메소드를 사용하여 명명된 그래프에 대한 참조를 가져옵니다.



6. 데이터를 콘솔로 덤프하여 데이터가 DB2 데이터베이스에 올바르게 추가되었는지 확인합니다.



목록 6. 콘솔로 데이터 보내기



//Verify that the data is stored in DB2 by dumping out the data from DB2.RiotWriter.writeNQuads(System.out, ds.asData setGraph());



출력은 다음과 같습니다.



tech_img959.jpg
tech_img960.jpg


여기서는 4개의 모든 N-트리플 파일에서 트리플이 배수가 직원 배치 시스템의 기본 그래프에 로드 됩니다.



섹션 4. 직원 배치 시스템 애플리케이션에서 SPARQL 쿼리 사용

직원 배치 시스템에 데이터가 채워졌으므로, 쿼리를 통해 여러 원본 시스템에 분산되어 있는 정보를 손쉽게 찾을 수 있습니다. 샘플 시나리오에 대해 SPARQL 쿼리를 빌드하고 JENA API를 사용하여 DB2 데이터베이스 서버에 대해 SPARQL 쿼리를 실행하여 결과를 표시해 봅시다.



이 섹션 후반부에 JOSEKI 프로젝트를 사용하여 HTTP를 통해 DB2 데이터베이스 서버에 대해 SPARQL 쿼리를 실행할 수 있는 방법을 설명 합니다. SPARQL 프로토콜[5]에서는 SPARQL 쿼리와 업데이트를 SPARQL 처리 서비스로 전달하고 결과를 요청한 엔터티로 HTTP를 통해 결과를 리턴하는 방법을 설명 합니다.



샘플 SPARQL 쿼리



기존 프로젝트인 RobotX와 매우 흡사한 새 프로젝트를 위한 직원을 배치한다고 가정 합시다. RobotX 프로젝트에 참여했던 모든 구성원과 함께 시작하는 것이 좋습니다. 아무래도 그 사람들이 새 프로젝트에서 요구되는 역량을 갖추고 있을 것이기 때문 입니다. 이들에 대한 정보는 기존의 HR 및 프로젝트 시스템 곳곳에 분산되어 있습니다. 과거에는 이 정보를 얻으려면 API나 시스템 간에 어떤 종류의 통합이 필요했을 것입니다. 하지만 새로운 직원 배치 시스템에서는 간단한 SPARQL 쿼리를 사용하여 이 정보를 페치할 수 있습니다.



RobotX 프로젝트의 모든 구성원을 찾으려면 SPARQL에 트리플 패턴이 필요합니다. 이 서브젝트를 projectRobotX의 IRI로 지정하고, 다음과 같이 http://xyz.com/project/member를 조건자로 사용합니다.



목록 8. SPARQL에서 트리플 패턴 찾기



select member where { memberId . memberId member .}



이런 프로젝트 구성원을 전부 찾으려면 다음과 같이 이전 쿼리를 수정할 수 있습니다.



// Create a 'Query' object by passing in the SPARQL query string \to the 'create' method of the RdfStoreQueryFactory classQuery q=RdfStoreQueryFactory.create(query); // Use the connectData set method RdfStoreFactory class to get a \Data set interface to the storeData set ds = RdfStoreFactory.connectData set(store, conn); // Use the connectData set method RdfStoreFactory class to get a \Data set interface to the storeQueryExecution qe = RdfStoreQueryExecutionFactory.create(q, ds); // Call the 'execSelect' method on the QueryExecution
// object to get a back a resultsetResultSet rs=qe.execSelect();



JENA API를 사용하여 SPARQL 쿼리 실행


QueryExecutor.java 샘플 파일에 다음 코드가 구현 됩니다.



목록 9. QueryExecutor.java



// Create a 'Query' object by passing in the SPARQL query string \to the 'create' method of the RdfStoreQueryFactory classQuery q=RdfStoreQueryFactory.create(query); // Use the connectData set method RdfStoreFactory class to get a \Data set interface to the storeData set ds = RdfStoreFactory.connectData set(store, conn); // Use the connectData set method RdfStoreFactory class to get a \Data set interface to the storeQueryExecution qe = RdfStoreQueryExecutionFactory.create(q, ds); // Call the 'execSelect' method on the QueryExecution
// object to get a back a resultsetResultSet rs=qe.execSelect();



결과 세트를 반복하고 개별 결과 세트에 액세스할 방법은 많이 있습니다. 다음은 hasNext 메소드를 사용하여 결과 세트를 반복하고 다음 메소드를 사용하여 각 솔루션을 검색하는 한 가지 간단한 방법 입니다.



목록 10. 결과 세트의 반복



while (rs.hasNext()) { QuerySolution qs = rs.next(); System.out.println(qs); System.out.println();}



이 SPARQL 쿼리의 출력은 아래에 표시된 것과 같습니다.


목록 11. SPARQL 쿼리의 출력



( member = "Rajesh K Arora" ) ( friendname = "Varuna Subramaniam" )( member = "Mario Ds Briggs" ) ( friendname = "Rajesh K Arora" )( member = "Priya Ranjan Sahoo" ) ( friendname = "Robert" )( member = "Gayathri Raghavendra" ) ( friendname = "Iti Rawat" )( member = "Farzana Anwar" ) ( friendname = "Alan Ng" )



QueryRdfStore 명령을 사용하여 SPARQL 쿼리 실행


DB2 RDF는 SPARQL 쿼리 실행을 위해 실행할 수도 있는 rdfstore.jar에서 Java 클래스 java com.ibm.rdf.store.cmd.QueryRdfStore도 제공 합니다.



QueryRdfStore 명령의 구문은 다음과 같습니다.



목록 12. QueryRdfStore 명령



java com.ibm.rdf.store.cmd.QueryRdfStore
-db -user -password [ -host [ -port [ -schema



여기서,



- RDF-store-name은 RDF 저장소의 이름 입니다.


- database-name, user, password, host-name, port-number 및 schema name은 저장소가 존재하는 스키마와 데이터베이스를 식별 합니다.


- query-string / query file은 문자열로서의 SPARQL 쿼리 또는 쿼리가 포함된 파일의 경로 입니다.



DB2 RDF 명령 프롬프트에서 다음 명령을 실행합니다.



java com.ibm.rdf.store.cmd.QueryRdfStore staffing
-db RDFSAMPL -userdb2admin -password db2admin
"select member friendname where {
memberId .memberId
member . memberId
friendId . friendId
friendname .}



이 명령의 출력은 다음과 같습니다.



목록 13. QueryRdfStore 명령



--------------------------------------------------------------| member | friendname |==============================================================| "Rajesh K Arora" | "Varuna Subramaniam" || "Mario Ds Briggs" | "Rajesh K Arora" || "Priya Ranjan Sahoo" | "Robert" || "Gayathri Raghavendra" | "Iti Rawat" || "Farzana Anwar" | "Alan Ng" |Time taken : 43



이 쿼리를 query.txt로 명명된 파일에 놓고 다음과 같이 실행할 수도 있습니다.



java com.ibm.rdf.store.cmd.QueryRdfStore staffing
-db RDFSTORE -userdb2admin -password db2admin query.txt



참고: 앞으로 매개변수가 바뀔 수 있으므로 이 유틸리티는 아직 구체화된 것이 아닙니다.


HTTP를 통한 SPARQL 쿼리 실행



W3C에는 HTTP를 통해 RDF 조작을 수행하기 위한 스펙 초안이 있습니다. Graph Store HTTP 프로토콜에서는 Graph Store에서의 RDF 그래프 컨텐츠 업데이트와 Graph Store over HTTP에서 REST 스타일의 RDF 그래프 컨텐츠 페치를 기술 합니다.



DB2 데이터베이스에 대해 HTTP를 통한 SPARQL 쿼리의 실행(업데이트 아님)을 위해 Joseki HTTP 엔진이 지원 됩니다.


Joseki 설정



시스템에서 Joseki를 설정하는 방법은 다음과 같습니다.



1. 로컬 시스료 참조).


2. 명령 프롬프트를 열고 Joseki의 압축을 푼 폴더로 변경 합니다.


3. JOSEKIROOT 변수를 현재 폴더로 설정 합니다.


4. bin/rdfserver.bat 파일을 실행 합니다.


5. 브라우저를 시작하고 URL localhost:2020을 탐색 합니다. 다음과 같이 Joseki 기본 페이지가 나타날 것 입니다.



tech_img956.jpg


6. DB2 데이터베이스 서버에 액세스하기 위해 Joseki를 수정 합니다. Joseki 파일의 압축을 푼 루트 폴더에 joseki-config.ttl 파일이 있습니다. 다음 예제에 나타낸 것처럼, 이 파일에서 DB2 데이터베이스를 위한 서비스를 추가 합니다.



목록 14. joseki-config.ttl 파일에 DB2용 서비스 추가



# Service for DB2# General-purpose SPARQL processor for DB2 RDF store,# The store name and how to connect to it are specified in the 'processor' definition# The data set should be skipped in the service definition# Service for DB2 - SPARQL processor for a DB2 RDF store@prefix db2rdf: .<#serviceDB2>rdf:type joseki:Service ; rdfs:label "SPARQL against DB2 RDF store" ; joseki:serviceRef "db2" ; # web.xml must route this name to Joseki # data set part #joseki:data set <#sample> ; NOTE RDF store does not take in data set # Service part. # This processor does not allow either the protocol, # or the query, to specify the data set. joseki:processor joseki:ProcessorDB2SPARQL ; . ## Processors# DB2 processor support using FROM/FROM NAMED in the request# It does not support specify the data set in the protocol request). joseki:ProcessorDB2SPARQL rdfs:label "DB2 RDF General SPARQL processor" ; rdf:type joseki:Processor ; module:implementation joseki:DB2ImplSPARQL ; # Parameters - this processor processes FROM/FROM NAMED automatically # RDF store parameters: Database details. Specify either \specify a jdbcConnectStringwith username and password or specify a jndiDataSource db2rdf:jdbcConnectString "jdbc:db2://localhost:50000/RDFSAMPL" ; db2rdf:userName "db2admin" ; db2rdf:password "db2admin"; #db2rdf:jndiDataSource "testDS" ; # RDF data set details : storeName and schema in which the store exists db2rdf:storeName "staffing" ; #db2rdf:schema "db2admin" ; . joseki:DB2ImplSPARQL rdf:type joseki:ServiceImpl ; module:className .



7. Joseki 파일의 압축을 푼 위치 아래의 lib 폴더에 rdfstore.jar, wala.jar, antlr-3.3-java.jar, commons-logging-1-0-3.jar, db2jcc4.jar 파일을 추가 합니다.


8. Joseki 파일의 압축을 푼 위치 아래의 lib 폴더에 rdfstore-joseki.jar 파일을 추가 합니다. rdfstore-joseki.jar 파일은 DB2RDFTutorial.zip\lib 폴더에 있습니다.


9. webapps\joseki\WEB-INF\web.xml 파일에는 다음 예제에 나타낸 것처럼 /db2를 서비스 이름 항목으로 추가 합니다. 이 튜토리얼에서는 /db2를 사용하는데, db2가 joseki-config.ttl 파일에 등록된 서비스 이름이기 때문 입니다. 다른 joseki-config.ttl 항목이 있는 같은 장소에 /db2를 추가해야 합니다.



목록 15. Servlet-mapping 항목



SPARQL service processor /db2



10. 다음 예제에 나타낸 것처럼, webapps\joseki\sparql.html 파일에서 양식 요소의 동작 특성 값을 SPARQL에서 DB2 데이터베이스 서버로 변경 합니다. 이 튜토리얼에서는 db2를 사용하는데, db2가 joseki-config.ttl 파일에 등록된 서비스 이름이기 때문입니다.



목록 16. sparql.html 수정



General SPARQL query : input query, \set any options and press "Get Results"



11. Joseki를 다시 시작 합니다. 샘플 출력은 다음과 같습니다.


목록 17. 샘플 출력



C:\Joseki-3.4.4>bin\rdfserver.bat 15:24:54 INFO Configuration :: ==== Configuration ==== 15:24:54 INFO Configuration :: Loading : 15:24:55 INFO ServiceInitSimple :: Init: Example initializer 15:24:55 INFO Configuration :: ==== Datasets ==== 15:24:55 INFO Configuration :: New dataset: Books 15:24:55 INFO Configuration :: Default graph : books.ttl 15:24:55 INFO Configuration :: New dataset: MEM 15:24:55 INFO Configuration :: Default graph : <> 15:24:55 INFO Configuration :: ==== Services ==== 15:24:55 INFO Configuration :: Service reference: "books" 15:24:55 INFO Configuration :: Class name: org.joseki.processors.SPARQL 15:24:55 INFO SPARQL :: SPARQL processor 15:24:55 INFO SPARQL :: Locking policy: \multiple reader, single writer 15:24:55 INFO SPARQL :: Dataset description: \false // Web loading: false 15:24:55 INFO Configuration :: Dataset: Books 15:24:55 INFO Configuration :: Service reference: "db2" 15:24:55 INFO Configuration :: Class name: \com.ibm.rdf.store.jena.joseki.SPARQLProcessor 15:24:57 INFO Configuration :: Service reference: "sparql" 15:24:57 INFO Configuration :: Class name: org.joseki.processors.SPARQL 15:24:57 INFO SPARQL :: SPARQL processor 15:24:57 INFO SPARQL :: Locking policy: none 15:24:57 INFO SPARQL :: Dataset description: \true // Web loading: true 15:24:57 INFO Configuration :: ==== Bind services to the server ==== 15:24:57 INFO Configuration :: Service: 15:24:57 INFO Configuration :: Service: 15:24:57 INFO Configuration :: Service: 15:24:57 INFO Configuration :: ==== Initialize datasets ==== 15:24:58 INFO Configuration :: ==== End Configuration ==== 15:24:58 INFO Dispatcher :: Loaded data source \configuration: joseki-config.ttl 15:24:58 INFO log :: Logging to \org.slf4j.impl.Log4jLoggerAdapter(org.mortbay.log)
via org.mortbay.log.Slf4jLog 15:24:58 INFO log :: jetty-6.1.25 15:24:58 INFO log :: NO JSP Support for /, did not find org.apache.jasper.servlet.JspServlet 15:24:58 INFO log :: Started \BlockingChannelConnector@0.0.0.0:2020



12. 아래와 같이 브라우저에서 http://localhost:2020/sparql.html로 이동하고, SPARQL 쿼리를 입력하고, Get Results를 클릭 합니다.



tech_img957.jpg


그러면 브라우저에 다음 출력이 표시 됩니다.



tech_img958.jpg


섹션 7. 결론





이 튜토리얼에서는 샘플 RDF 애플리케이션 시나리오를 소개하고 DB2 RDF 기능을 사용하여 이 애플리케이션을 빌드하는 단계를 안내했습니다. 기본 RDF 저장소를 작성하고 그래프를 이 저장소에 삽입하는 방법을 학습했으며, 그 다음에 JENA API를 사용하여 SPARQL 쿼리를 실행하는 방법과 더불어 Joseki를 사용하여 HTTP를 통해 SPARQL 쿼리를 실행하는 방법을 학습했습니다. 그런 다음, RDF 저장소에서 그래프를 업데이트하는 방법을 학습했습니다.


그 밖에도, 쿼리가 효율적으로 수행되도록 RDF 저장소에 대한 통계를 유지보수하는 방법을 학습했습니다. 마지막으로, 다른 RDF 스토리지 엔진에서 DB2 데이터베이스 서버로 마이그레이션하기 위한 프로세스에 대해 학습했습니다.




파트 2에서는 최적화된 RDF 저장소 작성 및 RDF를 위한 액세스 제어 사용과 같이 더욱 진전된 주제를 다루겠습니다.