티스토리 뷰

O:::Jena 다루기

O_8. Jena TDB 벌크로딩

joyHong 2019. 12. 16. 15:59

대용량의 데이터를 Jena TDB에 적재하기 위해서는 TDB에서 제공하는 벌크로딩 기능을 사용하는 것이

성능면에서나 효율면에서 좋다.

 

벌크로딩을 사용하는 방법은 그리 어렵지가 않은데 두가지 방법에 대해서 설명해 보고자 한다.

 

먼저는 RDF 형식에 상관없이 벌크로딩을 하는 방법에 대해서 보겠다.

기본적으로 n-triples, ttl, rdf/xml 형식 이외에 trig, n-quads 형식의 파일에서도 잘 동작한다.

trig와 n-quads 는 그래프를 포함하는 RDF 문법을 정의하기 위해서 사용하는 형식이며

trig는 ttl을 확장한 것이기에 ttl의 문법과 유사하다.

n-quads는 라인 기반 형식인 n-triples와 유사하지만 끝에 그래프명이 붙는 것이 다른 점이다.

위 형식에 대한 보다 자세한 설명은 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

https://www.w3.org/TR/n-quads/

 

RDF 1.1 N-Quads

Abstract N-Quads is a line-based, plain text format for encoding an RDF dataset. Status of This Document This section describes the status of this document at the time of its publication. Other documents may supersede this document. A list of current W3C p

www.w3.org

그럼 ttl, nt, nq 형식의 데이터를 하나씩 로딩시켜 보겠다.

public void loadTtl() {
	String file = "../TDBTest/src/test/resources/library.ttl";
	String directory = "D:/data/TDB" ;
	
	DatasetGraphTDB dataset = TDBInternal.getBaseDatasetGraphTDB(TDBFactory.createDatasetGraph(directory));
	
	TDBLoader.load(dataset, file, true);
}

public void loadNQuads() {
	String file = "../TDBTest/src/test/resources/exam.nq";
	String directory = "D:/data/TDB" ;
	
	DatasetGraphTDB dataset = TDBInternal.getBaseDatasetGraphTDB(TDBFactory.createDatasetGraph(directory));
	TDBLoader.load(dataset, file, true);
}

public void loadTrig() {
	String file = "../TDBTest/src/test/resources/exam.trig";
	String directory = "D:/data/TDB" ;
	
	DatasetGraphTDB dataset = TDBInternal.getBaseDatasetGraphTDB(TDBFactory.createDatasetGraph(directory));
	TDBLoader.load(dataset, file, true);
}

위에서 보이는 것처럼 형식이 무엇이든지 그냥 TDBLoader에 dataset, file을 넘기면 된다.

마지막에 true/false는 pogress를 보기 위한 설정값이다.

 

여기서 주의할 점은 그래프명이 들어가면 해당 그래프에 저장이 되기 때문에 일반적으로 SPARQL SELECT를 사용하다보면 그래프에 속한 트리플들을 찾지 못하는 경우가 발생할 수도 있다.

 

위 예제에서는 trig 형식의 파일을 로딩하여 사용할 경우에 대해서 좀더 자세히 살펴보면

exam.trig 파일의 내용은 아래와 같다.

@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
@prefix dc: <http://purl.org/dc/terms/> .
@prefix foaf: <http://xmlns.com/foaf/0.1/> .

# default graph - no {} used.
<http://example.org/bob> dc:publisher "Bob" .
<http://example.org/alice> dc:publisher "Alice" .

# GRAPH keyword to highlight a named graph
# Abbreviation of triples using ;
GRAPH <http://example.org/bob>
{
   [] foaf:name "Bob" ;
      foaf:mbox <mailto:bob@oldcorp.example.org> ;
      foaf:knows _:b .
}

GRAPH <http://example.org/alice>
{
    _:b foaf:name "Alice" ;
        foaf:mbox <mailto:alice@work.example.org>
}

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

 

그래프명을 명시하지 않은 트리플들은 default graph 이고 , 나머지 그래프명이 명시된 트리플들은 해당 그래프명에 속하게 된다.

SELECT *  WHERE { ?s ?p ?o . } limit 10

이렇게 질의를 하면 

그래프명이 명시되지 않은 트리플들, 즉 디폴트 그래프에 속한 트리플들만 결과로 나오게 된다.

 

TDB에서 사용 중인 그래프가 무엇이 있는지 확인할 필요가 있을 때는 아래의 코드처럼 그래프노드 리스트를 받아올 수 있다.

public void checkGraphList() {
	String directory = "D:/data/TDB" ;
	Dataset dataset = TDBFactory.createDataset(directory);
	dataset.begin(ReadWrite.READ) ;
	Iterator<Node> iter = dataset.asDatasetGraph().listGraphNodes();
	while(iter.hasNext()) {
		System.out.println(iter.next());
	}
	dataset.end();
	dataset.close();
}

위의 예시에서는 두 개의 그래프가 있다는 것을 확인할 수 있다.

 

 

다음으로는 ttl과 같이 그래프명이 명시되어 있지 않은 파일을 벌크로딩으로 적재할 때 그래프명을 명시하여 적재하고 싶은 경우에 사용할 수 있는 방법이 있다.

public void loadAsGraph() {
	String file = "../TDBTest/src/test/resources/library.ttl";
	String directory = "D:/data/TDB" ;

	DatasetGraphTDB dataset = TDBInternal.getBaseDatasetGraphTDB(TDBFactory.createDatasetGraph(directory));
	GraphTDB g =  dataset.getGraphTDB(NodeFactory.createURI("http://test.com"));
	TDBLoader.load(g, file, true);
}

그래프노드를 하나 만들어 TDBLoader에 전달하여 해당 그래프로 트리플들이 적재되도록 하고 있다.

여기에 select 질의를 하면 아래와 같이 나오게 된다.

 

최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/05   »
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 31
글 보관함