스파클 사용하기 SPARQL Tutorial - Datasets

     




SPARQL Tutorial - Dataset  URI : http://jena.apache.org/tutorials/sparql_datasets.html


이번 장에서는 Dataset에 대해 다룹니다. Dataset이란 쿼리문을 통해 검색하게 될 모델 파일을 뜻합니다. 이런 모델이 여태까지는 하나였지만 여러 개로 이루어질 수 있습니다. 자료를 가지고 있는 dataset을 특정 그래프(named graph)라고 부르고 특정 그래프들을 이어주는 역할을 하는 dataset이 초기 그래프(default graph)입니다.


Querying datasets


기본적인 쿼리문을 실행했을 때, Dataset의 초기 그래프가 만들어 집니다. 이때 GRAPH라는 키워드로 변환이 가능합니다. 


GRAPH var { ... pattern ... }


만약 URI가 주어지면 pattern은 Dataset과 일치되지만, 아닐경우 실패합니다. 만약 변수가 주어졌다면 특정 그래프가 매치를 시도합니다. 


흠.. 아직 뭔소린지 모르겠습니다. 더 읽어보며 이해합시다 ;;


Example Data


다음 3가지 데이터셋이 있습니다.


Default graph (ds-dft.ttl):

@prefix dc: <http://purl.org/dc/elements/1.1/> .
@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .

<ds-ng-1.ttl> dc:date "2005-07-14T03:18:56+0100"^^xsd:dateTime .
<ds-ng-2.ttl> dc:date "2005-09-22T05:53:05+0100"^^xsd:dateTime .

Named graph (ds-ng-1.ttl):

@prefix dc: <http://purl.org/dc/elements/1.1/> .

[] dc:title "Harry Potter and the Philospher's Stone" .
[] dc:title "Harry Potter and the Chamber of Secrets" .

Named graph (ds-ng-2.ttl):

@prefix dc: <http://purl.org/dc/elements/1.1/> .

[] dc:title "Harry Potter and the Sorcerer's Stone" .
[] dc:title "Harry Potter and the Chamber of Secrets" .


아무래도 Default 그래프가 나머지 두 그래프를 연결해주는 것처럼 보입니다. dataTime은.. 만들어진 날짜 일까요...?


Accessing the Dataset


PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>
PREFIX dc: <http://purl.org/dc/elements/1.1/>
PREFIX : <.>

SELECT *
{ ?s ?p ?o }


q-ds-1.rq


일단 시키는대로 초기 그래프에 위의 쿼리를 실행했습니다.




PREFIX : <.>은 단지 표기를 간단히 하기 위해서 쓰였다고 하는데, 지우고 실행해보니 없던 괄호들이 생겻습니다. 괄호를 생략해주는 방법인 것 같습니다.



PREFIX  xsd:    <http://www.w3.org/2001/XMLSchema#>
PREFIX  dc:     <http://purl.org/dc/elements/1.1/>
PREFIX  :       <.>

SELECT *
{
    { ?s ?p ?o } UNION { GRAPH ?g { ?s ?p ?o } }
}


다음 쿼리를 진행해보았는데 결과값이 다르게 나왔습니다. 왜 그런가 했는데 명령 프롬프트 창에서 명령어를 바꿔줘야 합니다. 이제는 파일로 접근하는 게 아니라 그래프로 접근하는 거라서 다음과 같이 명령어의 구조를 바꿉니다.


java -cp ... arq.sparql
    --graph ds-dft.ttl --namedgraph ds-ng-1.ttl --namedgraph ds-ng-2.ttl
    --query query file


java -cp까지 입력할 필요는 없고 bat/sparql.bat으로 시작하면 됩니다. --data대신 --graph로 경로를 지정하면 됩니다.


위 쿼리문을 실행하면 다음과 같이 나옵니다.




확실히 3개의 그래프에서 하나의 결과값을 검색했습니다. 하지만 일일이 그래프 경로를 지정해주는 점이 불편하군요. 이 부분은 툴을 만들어서 사용할 경우 문제가 되지 않기 때문에 넘어가도록 합시다.


Querying a specific graph


어플리케이션 입장에서 그래프 이름을 알고 있다면 다음과 같이 쿼리를 날릴 수 있습니다.


PREFIX dc: <http://purl.org/dc/elements/1.1/>
PREFIX : <.>

SELECT ?title
{
  GRAPH :ds-ng-2.ttl
    { ?b dc:title ?title }
}


조건에 그래프 이름을 입력하면 됩니다. 아마 명령프롬프트창에 입력하는것은 기본 세팅으로 프로그램에서 이미 세팅되어있다고 생각하는 모양입니다.


Querying to find data from graphs that match a pattern


PREFIX  xsd:    <http://www.w3.org/2001/XMLSchema#>
PREFIX  dc:     <http://purl.org/dc/elements/1.1/>
PREFIX  :       <.>

SELECT ?date ?title
{
  ?g dc:date ?date . FILTER (?date > "2005-08-01T00:00:00Z"^^xsd:dateTime )
  GRAPH ?g
      { ?b dc:title ?title }
}


그래프의 특성을 가지고 따로 검색하는 기능입니다. 여기서는 date라는 속성값을 FILTER하는 쿼리문을 예제로 만들었습니다.


-----------------------------------------------------------------------------------------
| date                                      | title                                     |
=========================================================================================
| "2005-09-22T05:53:05+01:00"^^xsd:dateTime | "Harry Potter and the Sorcerer's Stone"   |
| "2005-09-22T05:53:05+01:00"^^xsd:dateTime | "Harry Potter and the Chamber of Secrets" |
-----------------------------------------------------------------------------------------



Describing RDF Datasets - FROM and FROM NAMED


PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>
PREFIX dc:  <http://purl.org/dc/elements/1.1/>
PREFIX :    <.>

SELECT *
FROM       <ds-dft.ttl>
FROM NAMED <ds-ng-1.ttl>
FROM NAMED <ds-ng-2.ttl>
{
   { ?s ?p ?o } UNION { GRAPH ?g { ?s ?p ?o } }
}


마지막으로 FROM을 이용하여 그래프 안에 있는 데이터를 검색하는 쿼리입니다. FROM과 FROM NAMED 두 가지가 있는데 FROM의 경우는 파일 자체에서 읽어오는 게 아니라 만들어진 그래프에서 읽어오고, FROM NAMED의 경우에는 파일 자체에 접근해서 읽어온다고 합니다. 


named graph에는 FROM NAMED만 쓰고 default graph에는 FROM만 쓰는 게 아니라는 사실을 기억합시다.







마지막 챕터인 RESULTS를 다음에 포스팅 하려고 했는데 내용이 상당히 없어서 여기에 붙여서 설명합니다. 


마지막 장에서는 기타 여러가지 명령어에 대해 언급합니다. 여태까지 스파클 쿼리문에서 SELECT라는 명령어를 사용하였지만 SELECT말고 다른 여러가지 명령어가 있습니다.


  • SELECT – Return a table of results.
  • CONSTRUCT – Return an RDF graph, based on a template in the query.
  • DESCRIBE – Return an RDF graph, based on what the query processor is configured to return.
  • ASK – Ask a boolean query.


하지만 자세한 사용방법은 나와있지 않아서 해보지는 못했습니다. 


또 출력된 데이터의 값을 정렬하거나 제한을 두는 여러가지 방법들도 제시되어 있습니다.


  • Projection - keep only selected variables
  • OFFSET/LIMIT - chop the number solutions (best used with ORDER BY)
  • ORDER BY - sorted results
  • DISTINCT - yield only one row for one combination of variables and values.


반응형

댓글

Designed by JB FACTORY