티스토리 뷰

Jena TDB에 RDF 데이터를 입력(적재)하는 방법은 여러가지가 존재한다.

그 중에 몇가지를 적어본다.

 

1. 데이터 직접 생성하여 입력

먼저는 TDB의 dataset에 Model로 데이터를 생성하여 입력하는 방식이다.

이 방법은 Jena Model의 사용하여 s, p ,o를 만드는 것과 동일하다.

public void insert() {
	String directory = "D:/data/TDB" ;
	
	Dataset dataset = TDBFactory.createDataset(directory);
	Model model = dataset.getDefaultModel();
	model.add(ResourceFactory.createResource("http://test.com/subject"), ResourceFactory.createProperty("http://test.com/predicate"), "object",XSDDatatype.XSDstring);
	model.add(ResourceFactory.createResource("http://test.com/abc"), ResourceFactory.createProperty("http://test.com/next"), ResourceFactory.createResource("http://test.com/def"));
	model.add(ResourceFactory.createResource("http://test.com/abc"), ResourceFactory.createProperty("http://test.com/name"), "abc");
	model.add(ResourceFactory.createResource("http://test.com/def"), ResourceFactory.createProperty("http://test.com/name"), "def");
	model.add(ResourceFactory.createResource("http://test.com/def"), ResourceFactory.createProperty("http://test.com/next"), ResourceFactory.createResource("http://test.com/ghi"));
	
    dataset.close();
}

위의 코드를 실행하면 5개의 트리플이 TDB에 저장된다.

이를 확인하려면 select 문을 사용하여 확인해 볼 수 있겠다.

public void select() {
	String directory = "D:/data/TDB" ;
	
	Dataset dataset = TDBFactory.createDataset(directory);
	dataset.begin(ReadWrite.READ) ;
	String sparqlQueryString = "SELECT * WHERE {  ?s ?p ?o . } limit 10";
	Query query = QueryFactory.create(sparqlQueryString) ;
    QueryExecution qexec = QueryExecutionFactory.create(query, dataset) ;
    ResultSet results = qexec.execSelect() ;
    ResultSetFormatter.out(results) ;
    qexec.close() ;
    dataset.end();
    dataset.close();
}

* Jena TDB에 select를 하는 방법은 이전 포스팅에서 살펴볼 수 있다.

https://joyhong.tistory.com/93

 

O_6. Jena TDB에 Select하기

Jena TDB에 적재된 트리플들을 select 하기 위한 여러가지 코드들을 적어보려고 한다. 제일 먼저 가장 기본적으로 사용되는 단순 SPARQL select 구문이 되겠다. dataset.begin(ReadWrite.READ) ; 라인과 dataste.e..

joyhong.tistory.com

다시 위의 select를 실행하면 결과는 아래와 같다.

 

2. 파일을 읽어 데이터 적재

Model에 트리플 하나씩 생성하여 입력하는 방법 외에 파일을 읽어서 TDB에 저장할 수도 있다.

이 방법은 TDBLoader.loadModel() 를 사용하여 파일 데이터를 읽어 저장하는 방식이다.

public void insertFromFile() {
	String directory = "D:/data/TDB" ;
	String file = "../TDBTest/src/test/resources/library.ttl";
	Dataset dataset = TDBFactory.createDataset(directory);
	
	Model model = dataset.getDefaultModel();
	TDBLoader.loadModel(model, file );
	dataset.close();
}

위의 예시에서는 ttl 형식을 사용하고 있지만 다른 형식도 가능하다.

public void insertFromFile2() {
	String directory = "D:/data/TDB" ;
	String file = "../TDBTest/src/test/resources/exam.trig";
	Dataset dataset = TDBFactory.createDataset(directory);
	
	Model model = dataset.getDefaultModel();
	TDBLoader.loadModel(model, file );
	dataset.close();
}

이 예시에서는 triG 형식을 사용하여 TDB에 저장하고 있다.

trig는 ttl에서 확장된 형식이며 자세한 내용은 W3C 홈페이지에서 확인할 수 있다.

https://www.w3.org/TR/trig/

 

RDF 1.1 TriG

Abstract This document defines a textual syntax for RDF called TriG that allows an RDF dataset to be completely written in a compact and natural text form, with abbreviations for common usage patterns and datatypes. TriG is an extension of the Turtle [TURT

www.w3.org

 

3. 특정 그래프에 적재

이번에는 파일 데이터를 읽어 특정 그래프에 저장하는 방식에 대해서 살펴보자.

이 방식은 Model을 생성할 때 namedModel로 생성하면 간단히 처리할 수 있다.

public void insertFromFileWithGraph() {
	String directory = "D:/data/TDB" ;
	String file = "../TDBTest/src/test/resources/library.ttl";
	Dataset dataset = TDBFactory.createDataset(directory);
	
	Model model = dataset.getNamedModel("http://test.com") ;
	TDBLoader.loadModel(model, file );
	dataset.close();
}

위의 코드와 동일하게 동작하지만 다른 코드로도 구현이 가능하다.

public void insertFromFileWithGraph2() {
	String directory = "D:/data/TDB" ;
	String file = "../TDBTest/src/test/resources/library.ttl";
	Dataset dataset = TDBFactory.createDataset(directory);
	
	Model model = RDFDataMgr.loadModel(file) ;
	dataset.addNamedModel("http://test.com", model);
	dataset.close();
}

그래프에 적재를 하게 되면 이 포스팅 첫부분에 사용한 SELECT 코드를 그대로 사용할 수 없기 때문에 SPARQL을 약간 수정하면 된다. 왜냐하면 그래프명을 명시하지 않으면 디폴트그래프이고, 그래프명을 명시하면 명시한 그래프명으로 저장이 되기 때문에 원하는 결과가 제대로 나오지 않을 수 있다.

public void selectWithGraph() {
	String directory = "D:/data/TDB" ;
	Dataset dataset = TDBFactory.createDataset(directory);
	dataset.begin(ReadWrite.READ) ;
	String sparqlQueryString = "SELECT * WHERE { GRAPH ?graph { ?s ?p ?o } } limit 10";
	Query query = QueryFactory.create(sparqlQueryString) ;
	QueryExecution qexec = QueryExecutionFactory.create(query, dataset) ;
	ResultSet results = qexec.execSelect() ;
	ResultSetFormatter.out(results) ;
	qexec.close() ;
	dataset.end();
	dataset.close();
}

위 코드를 실행하면 graph 변수가 하나 더 추가된 결과를 확인할 수 있다.

 

4. 트랜잭션 처리

트랜잭션 처리를 해야할 필요가 있을 경우에는 아래의 코드와 같이 사용하면 된다.

public void insertTransaction() {
	String directory = "D:/data/TDB" ;
	String file = "../TDBTest/src/test/resources/library.ttl";
	
	Dataset dataset = TDBFactory.createDataset(directory);
	dataset.begin(ReadWrite.WRITE) ;
	
	Model m = dataset.getNamedModel("http://test.com") ;
	m.read(file) ;
	
	dataset.commit();
	dataset.end();
	dataset.close();
}

데이터를 적재하기 전에 ReadWrite.WRITE로 하고 적재가 끝나면 끝났다고 알려주면 된다.

 

 

여기까지 Jena TDB에 RDF형식의 데이터를 적재하는 것을 간단히 설명하였다.

위의 방법은 작은 규모의 데이터를 다루기에 적합한 방법이고

대용량의 데이터를 입력하기 위해서는 벌크로딩 이라는 기능을 사용하는 것이 좋다.

이 방식에 대해서는 다음 포스팅에서 알아보겠다.

 

 

최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
글 보관함