티스토리 뷰

애플리케이션 상에서 데이터를 주고 받는 형식으로 json이 많이 사용되고 있다.

RDF 형식의 데이터도 JSON 형식으로 변환이 가능하며,

SPARQL을 통해 생성한 결과 또한 JSON으로 변환이 가능하다.

 

여기에서는 Jena에서 제공하는 포맷터를 통해 JSON형식으로 결과를 만들어 내는 것에 대해 이야기하고자 한다.

예제에서 사용하는 SPARQL은 Jena TDB에 적재되어 있는 트리플 데이터에 질의하여 결과를 생성한다.

 

그럼 Jena에서 제공하는 ResultSetFormatter 라는 클래스는 SPARQL 질의 결과를

JSON, XML, CSV, TSV 등의 형식 뿐만 아니라 RDF데이터셋의 다양한 형식으로 변환을 하게 해주는 클래스이다.

따라서 SPARQL 질의 결과를 JSON으로 변환하고 반환받고자 할 경우에는 이 클래스를 사용하면 된다.

public void getResultAsJson() {
	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() ;
    ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
    ResultSetFormatter.outputAsJSON(outputStream, results);
    String json = new String(outputStream.toByteArray());
    qexec.close() ;
    dataset.end();
    dataset.close();

    System.out.println(json);
}

ResultSetFormatter 클래스의 outputAsJSON() 메소드를 사용하여 SPARQL 질의 결과를 JSON으로 바꾸는 코드이다.

이때 인자값으로 outputstream 과 resultset 의 객체를 각각 넣어주면 된다.

위의 코드를 실행하면 아래의 그림처럼 JSON 형태의 결과를 획득할 수 있다.

 

 

그러면 JSON-LD 형식으로도 결과를 변환하여 사용할 수 있는가?

물론 할 수 있다.

우선 아래의 코드를 살펴보면,

public void getResultAsJsonLD() {
	String directory = "D:/data/TDB" ;
	Dataset dataset = TDBFactory.createDataset(directory);
	dataset.begin(ReadWrite.READ) ;
	String sparqlQueryString = "SELECT *WHERE { GRAPH <http://test.com> { ?s ?p ?o. filter(?s=<http://test.com/resource/library_1>) } } ";
	Query query = QueryFactory.create(sparqlQueryString) ;
	QueryExecution qexec = QueryExecutionFactory.create(query, dataset) ;
	ResultSet results = qexec.execSelect() ;
	Model model = RDFOutput.encodeAsModel(results);
	RDFDataMgr.write(System.out, model, RDFFormat.JSONLD_COMPACT_PRETTY) ;
    
	qexec.close() ;
	dataset.end();
	dataset.close();
}

SPARQL 질의 결과인 ResultSet을

Model model = RDFOutput.encodeAsModel(results);

을 통해 Model 로 변경하였다.

그리고 

RDFDataMgr.write(System.out, model, RDFFormat.JSONLD_COMPACT_PRETTY) ;

를 통해 모델의 내용을 JSON-LD 형식으로 변경하여 화면에 출력하도록 하였다.

결과는 위 그림처럼 JSON-LD 형식으로 나타난다.

RDFFormat 은 여러 형태의 RDF를 제공하는데 자세한 내용은 https://jena.apache.org/documentation/io/rdf-output.html#json-ld에서 참조할 수 있다.

 

Apache Jena - Writing RDF in Apache Jena

Writing RDF in Apache Jena This page describes the RIOT (RDF I/O technology) output capabilities. See Reading RDF for details of the RIOT Reader system. See Advanced RDF/XML Output for details of the Jena RDF/XML writer. API There are two ways to write RDF

jena.apache.org

마지막으로 하나 더 예제를 살펴보면

CONSTRUCT 질의를 통해 결과를 Model에 담아 바로 JSON-LD로 변경할 수도 있다.

public void getConstructAsJsonLD() {
	String directory = "D:/data/TDB" ;
	Dataset dataset = TDBFactory.createDataset(directory);
	dataset.begin(ReadWrite.READ) ;
	String sparqlQueryString = "CONSTRUCT {?s ?p ?p } WHERE { GRAPH <http://test.com> { ?s ?p ?o. filter(?s=<http://test.com/resource/library_1>) } } ";
	Query query = QueryFactory.create(sparqlQueryString) ;
	QueryExecution qexec = QueryExecutionFactory.create(query, dataset) ;
	Model model = qexec.execConstruct() ;
	ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
	RDFDataMgr.write(outputStream, model, RDFFormat.JSONLD_PRETTY) ;
//        RDFDataMgr.write(outputStream, dataset, RDFFormat.JSONLD) ;
	String json = new String((outputStream).toByteArray());
	
	qexec.close() ;
	dataset.end();
	dataset.close();
	
	System.out.println(json);
}

결과:

최근에 올라온 글
최근에 달린 댓글
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
글 보관함