
- 정의: RDF로 표현된 데이터를 찾기 위해 SPARQL이라는 언어를 사용해 자원 기술 프레임워크(RDF) 형식으로 저장된 데이터를 검색, 조작할 수 있다.
SPARQL 쿼리가 트리플 페턴, 논리 곱, 논리 합, 선택적 패턴을 구성할 수 있도록 한다. - 유형: SELECT, ASK, CONSTRUCT, DESCRIBE
- SELECT -> 사용자가 데이터를 찾는 용도
- ASK -> 사용자가 원하는 쿼리의 결과가 있는지 없는지 Boolean 값으로 제공
즉, SELECT=결과를 가져온다. / ASK=있으면 TRUE, 없으면 FALSE - CONSTRUCT -> 사용자가 찾고자 하는 쿼리를 출력하면서 동시에 자신이 원하는 템플릿을 입력해주고 쿼리의 결과가 사용자가 원하는 템플릿대로 나오도록 한다.
- DESCRIBE -> 사용자가 찾고자 하는 정보에 대해서 그 정보와 연결된 모든 트리플을 반환.
- 유형: SELECT, ASK, CONSTRUCT, DESCRIBE
- SPARQL 만들기: SPARQL 쿼리는 기본적으로 트리플 패턴으로 사용자가 찾고자하는 결과를 가져온다.
트리플: 주(S)-술(P)-목(O) 구성된 패턴 - SPARQL은 교집합 연산으로 이루어져있다.
- 아래의 링크에서 실습을 진행한다.
PREFIX |
|
SELECT ?id |
|
SELECT |
질의 유형 |
?id |
찾는 변수( '?' 또는 '$' 를 사용한다.) |
WHERE |
찾는 조건 입력 부분 |
?id |
트리플의 주어부로 SELECT 문에서도 사용하고 있는 변수 |
rdf:type |
트리플의 술어부로 클래스 타입이 무엇인지 지정 |
http://lod.nl.go.kr/ontology/author |
트리플의 목적부로 Author를 가리키는 URI |
- WHERE 사용하기: 질의하는 대상은 데이터베이스에서는 FROM 절을 사용하여 표현하지만, SPARQL에서는 데이터베이스의 조건에 해당하는 WHERE 절을 사용하는 점이 다르다.
Ex_) (DataBase) SELECT * FROM s WHERE stuno=1111;
(SPARQL) SELECT * WHERE { 주 술 목 }
하나의 트리플 패턴이 끝날 때에는 마침표(.)를 사용해 트리플의 문장을 끝을 맺는다. - 패턴 추가하기
name을 찾기 위해 찾는 변수 부분엔 ?name을 추가하고 WHERE 절에 패턴을 추가해야 한다.
국립중앙도서관의 저자정보에는 이름을 <http://xmlns.com/foaf/0.1/name>을 사용해 트리플을 생성했기에 이 정보를 가지고 패턴을 만들어보자
SELECT ?id ?name |
![]() 저자 중 id와 name을 찾는 쿼리. |
SELECT ?id ?name |
![]() 세미콜론으로 공통된 Subject를 갖는 트리플 패턴을 생성한 것으로 마칠 때에는 "."(마침표)를 사용해 마무리한다. |
- PREFIX 사용
SELECT ?id ?name |
![]() WHERE에서 URI를 길게 쓰지 않고 PREFIX로 간결하게 입력할 수 있다. |
PREFIX nlon: <http://lod.nl.go.kr/ontology/> |
![]() rdf:type 또한 PREFIX로 간추려진 대상이며 상위 PREFIX 선언 부분에 써주지 않아도 되는 이유는 SPARQL를 처리하는 엔젠에서 디폴트로 선언되어 있다. |
- Filter 사용
특정 조건에 맞는 정보를 찾을 때 사용한다.
WHERE 절 안에 FILTER를 만들어 조건을 입력하도록 되어 있다.
WHERE 절에서 트리플의 패턴이 어떠한 것인지 정의되어 있지 않다면 FILTER에서도 적용되지 않는다.
PREFIX nlon: <http://lod.nl.go.kr/ontology> |
-> PREFIX로 경량화
-> ?id와 ?name을 출력하겠다.
-> ?id는 rdf:type이다 nlon:Author이라는 -> (?id는) foaf:name이다 ?name이라는 -> (?id는) nlon:birthYear이다 ?birth라는.
|
PREFIX nlon: <http://lod.nl.go.kr/ontology/> |
![]() FILTER안에는 (" ") 형식으로 조건을 입력해야한다. |
- ORDER BY 사용하기
PREFIX nlon: <http://lod.nl.go.kr/ontology/> + |
![]() ORDER BY ?id = ?id를 오름차순 정렬 + |
- LIMIT, OFFSET 사용하기
PREFIX nlon: <http://lod.nl.go.kr/ontology/> |
![]() -> ?id를 내림차순으로 정렬하고 |
- DISTINCT 사용하기
PREFIX foaf: <http://xmlns.com/foaf/0.1/> + |
![]() DISTINCT는 SELECT 뒤에 사용하며 그 다음에 중복을 제거할 변수를 사용합니다. SELECT DISTINCT ?name |
- UNION 사용하기
수학의 합집합 개념으로 SPARQL 에서도 합집합으로 반환.
PREFIX nlon: <http://lod.nl.go.kr/ontology/> PREFIX foaf: <http://xmlns.com/foaf/0.1/> SELECT * WHERE { { ?id foaf:name "고은"@ko . } UNION { ?id nlon:birthYear ?birth . FILTER (?birth=1990) } } |
![]() UNION 사용 시 WHERE 절과 별개로 {...}로 트리플 패턴을 묶어준다. 즉, WHERE { { 패턴 A } UNION { 패턴 B } } UNION 사용과 비사용의 차이점 SPARQL은 교집합 연산 |
- OPTIONAL 사용하기
PREFIX nlon: <http://lod.nl.go.kr/ontology/> PREFIX foaf: <http://xmlns.com/foaf/0.1/> SELECT * WHERE { ?id foaf:name ?name ; nlon:birthYear ?birth ; nlon:deathYear ?death . FILTER(?birth>1960) } |
![]() 이 쿼리는 1960년 이후에 태어났지만, 데이터 상으로 몰년이 존재하지 않으면 결과에 포함하지 않는다.(SPARQL은 교집합 연산이기에) |
PREFIX nlon: <http://lod.nl.go.kr/ontology/> PREFIX foaf: <http://xmlns.com/foaf/0.1/> SELECT * WHERE { ?id foaf:name ?name ; nlon:birthYear ?birth . FILTER(?birth>1960) OPTIONAL { ?id nlon:deathYear ?death . } } |
![]() 몰년의 존재 여부를 떠나 1960년 이후에 태어난 사람을 모두 반환 받는다. |
- COUNT 사용하기
PREFIX nlon: <http://lod.nl.go.kr/ontology/> PREFIX foaf: <http://xmlns.com/foaf/0.1/> SELECT COUNT(*) WHERE { ?id foaf:name ?name ; nlon:birthYear ?birth . FILTER(?birth>1960) OPTIONAL { ?id nlon:deathYear ?death . } } |
![]() 검색된 결과의 개수를 알아보는 쿼리. |
- GROUP BY
PREFIX nlon: <http://lod.nl.go.kr/ontology/> PREFIX foaf: <http://xmlns.com/foaf/0.1/> SELECT ?birth COUNT(?id) WHERE { ?id foaf:name ?name ; nlon:birthYear ?birth . FILTER(?birth>1980) } GROUP BY ?birth |
![]() DB와 같이 하나의 변수에 대해 그룹으로 묶어 결과를 가져오는 쿼리. birth별로 그룹을 형성하고 각각의 그룹에 존재하는 id의 개수를 COUNT로 반환한다. |
- FILTER의 여러 가지 사용법
http://www.w3.org/TR/rdf-sparql-query/ 에서 다양한 정보 확인할 수 있다.
SPARQL Query Language for RDF
RDF is a directed, labeled graph data format for representing information in the Web. This specification defines the syntax and semantics of the SPARQL query language for RDF. SPARQL can be used to express queries across diverse data sources, whether the d
www.w3.org
- STR
트리플로 표현된 데이터 중 language tag나 XSDDatatype이 무엇인지 표현하는 경우가 있다. |
|
PREFIX foaf: <http://xmlns.com/foaf/0.1/> SELECT * WHERE { ?id foaf:name ?name FILTER(STR(?name)="고은") } |
![]() ?name이란 변수를 STR 안에 넣어 String 값만 가져와 "고은"이라는 String과 비교하도록 처리된다. |
PREFIX dcterms: <http://purl.org/dc/terms/> PREFIX afn: <http://jena.hpl.hp.com/ARQ/function#> SELECT * WHERE { ?s dcterms:creator ?c . FILTER(afn:substring(str(?c),29)='KAC201011569') } |
![]() STR은 Resource의 URI를 String으로 변환하는 것에도 사용할 수 있다. 여기서 STR은 URI를 String으로 바꾸는 역할을 하고 있다. |
- LANG
Literal로 표현된 값의 language tag를 반환하는 기능도 사용할 수 있다. |
|
PREFIX foaf: <http://xmlns.com/foaf/0.1/> PREFIX nlk: <http://lod.nl.go.kr/resource/> SELECT ?name WHERE { nlk:KAC201011569 foaf:name ?name. FILTER(LANG(?name)='ko') } |
KAC201011569라는 id를 가진 사람의 이름 중 language tag가 korean인 이름을 가져오는 쿼리이다. |
PREFIX foaf: <http://xmlns.com/foaf/0.1/> PREFIX nlk: <http://lod.nl.go.kr/resource/> SELECT LANG(?name) WHERE { nlk:KAC201011569 foaf:name ?name. } |
KAC201011569라는 id를 가진 사람의 이름의 language tag를 반환하는 쿼리이다. |
- REGEX
SPARQL에서는 정규 표현식을 지원하고 있다. 이러한 정규 표현식을 통해 텍스트를 검색, 추출, 치환 등을 할 수 있다. SPARQL에서 정규 표현식을 사용하기 위해서는 REGEX를 사용한다. |
|
PREFIX foaf: <http://xmlns.com/foaf/0.1/> |
![]() |
유형별 SPARQL 따라하기
- 도서 찾기
PREFIX dct: <http://purl.org/dc/terms/> PREFIX bibo: <http://purl.org/ontology/bibo/> SELECT * WHERE { ?s a bibo:Book. ?s dct:title ?title. FILTER REGEX(STR(?title), '사랑') } |
![]() 도서 제목 중 '사랑'이라는 단어가 들어간 도서 찾기 |
PREFIX dct: <http://purl.org/dc/terms/> PREFIX bibo: <http://purl.org/ontology/bibo/> SELECT * WHERE { ?s a bibo:Book. ?s dct:created '2012' } |
![]() 2012년에 발간된 도서 찾기 |
PREFIX nlon: <http://lod.nl.go.kr/ontology/> PREFIX dct: <http://purl.org/dc/terms/> PREFIX bibo: <http://purl.org/ontology/bibo/> SELECT * WHERE { ?s a bibo:Book. ?s nlon:kdc '810.099' } |
![]() KDC가 810.099인 도서 찾기 |
PREFIX nlon: <http://lod.nl.go.kr/ontology/> PREFIX dct: <http://purl.org/dc/terms/> PREFIX bibo: <http://purl.org/ontology/bibo/> SELECT * WHERE { ?s a bibo:Book. ?s nlon:ddc '895.714' } |
![]() DDC가 895.714인 도서 찾기 |
PREFIX nlon: <http://lod.nl.go.kr/ontology/> PREFIX dct: <http://purl.org/dc/terms/> PREFIX bibo: <http://purl.org/ontology/bibo/> SELECT * WHERE { ?s a bibo:Book. ?s bibo:isbn '8975490378' } |
![]() ISBN이 8975490375인 도서 찾기 |
PREFIX dct: <http://purl.org/dc/terms/> PREFIX bibo: <http://purl.org/ontology/bibo/> PREFIX nlon: <http://lod.nl.go.kr/ontology/> SELECT ?s count(?c) WHERE { ?s a bibo:Book. ?s nlon:kdc '222.2' . ?s dct:creator ?c. } GROUP BY ?s having(count(?c)=2) |
![]() KDC가 222.2로 분류된 도서 중 저자가 2명인 도서 찾기 |
PREFIX xsd: <http://www.w3.org/2001/XMLSchema#> PREFIX dct: <http://purl.org/dc/terms/> PREFIX bibo: <http://purl.org/ontology/bibo/> PREFIX nlon: <http://lod.nl.go.kr/ontology/> SELECT * WHERE { ?s a bibo:Book. ?s dct:creator ?c . ?c nlon:birthYear "1933"^^xsd:int . } |
![]() 1933년에 출생한 저자가 저서한 도서 찾기 |
PREFIX nlon: <http://lod.nl.go.kr/ontology/> PREFIX foaf: <http://xmlns.com/foaf/0.1/> PREFIX dct: <http://purl.org/dc/terms/> SELECT ?person ?name (count(?book) as ?cnt) WHERE { ?book dct:creator ?person . ?person foaf:name ?name . FILTER REGEX(STR(?name), '고은') } GROUP BY ?person ?name |
![]() 이름에 '고은'이 들어간 저자가 저서한 도서의 건수 찾기 |
PREFIX nlon: <http://lod.nl.go.kr/ontology/> PREFIX foaf: <http://xmlns.com/foaf/0.1/> PREFIX dct: <http://purl.org/dc/terms/> SELECT ?book WHERE { ?book dct:creator ?person . ?person foaf:name ?name . FILTER(?person=<http://lod.nl.go.kr/resource/KAC201011569>) } LIMIT 10 |
![]() 고은(KAC201011569)작가의 도서 중 10개만 찾기 |
PREFIX nlon: <http://lod.nl.go.kr/ontology/> PREFIX foaf: <http://xmlns.com/foaf/0.1/> PREFIX dct: <http://purl.org/dc/terms/> SELECT ?book ?title WHERE { ?book dct:creator ?person ; dct:title ?title . ?person foaf:name ?name . FILTER(?person=<http://lod.nl.go.kr/resource/KAC201011569>) } ORDER BY ?title |
![]() 고은(KAC201011569) 작가의 도서 중 제목 오름차순으로 정렬하여 찾기 |
PREFIX nlon: <http://lod.nl.go.kr/ontology/> PREFIX foaf: <http://xmlns.com/foaf/0.1/> PREFIX dct: <http://purl.org/dc/terms/> SELECT ?book ?title WHERE { ?book dct:creator ?person ; dct:title ?title . ?person foaf:name ?name . FILTER(?person=<http://lod.nl.go.kr/resource/KAC201011569>) } ORDER BY DESC(?title) OFFSET 10 LIMIT 10 |
![]() 고은(KAC201011569)작가의 도서 중 제목 내림차순으로 정렬하여 10번 째 도서부터 10개의 데이터만 찾기 |
- 저자찾기
PREFIX nlon: <http://lod.nl.go.kr/ontology/> PREFIX foaf: <http://xmlns.com/foaf/0.1/> SELECT ?id ?name WHERE { ?id rdf:type nlon:Author ; foaf:name ?name . FILTER REGEX(STR(?name), '진명') } |
![]() 저자 중 '진명' 이라는 이름이 들어가는 저자 찾기 |
PREFIX xsd: <http://www.w3.org/2001/XMLSchema#> PREFIX nlon: <http://lod.nl.go.kr/ontology/> PREFIX foaf: <http://xmlns.com/foaf/0.1/> SELECT ?id ?name WHERE { ?id rdf:type nlon:Author ; foaf:name ?name ; nlon:birthYear '1980'^^xsd:int . } |
![]() 1980년에 출생한 저자 찾기 |
PREFIX xsd: <http://www.w3.org/2001/XMLSchema#> PREFIX nlon: <http://lod.nl.go.kr/ontology/> PREFIX foaf: <http://xmlns.com/foaf/0.1/> SELECT ?id ?name WHERE { ?id rdf:type nlon:Author ; foaf:name ?name ; nlon:deathYear '2000'^^xsd:int . } |
![]() 2000년에 사망한 저자 찾기 |
PREFIX xsd: <http://www.w3.org/2001/XMLSchema#> PREFIX nlon: <http://lod.nl.go.kr/ontology/> PREFIX foaf: <http://xmlns.com/foaf/0.1/> SELECT * WHERE { ?id rdf:type nlon:Author ; foaf:name ?name . FILTER REGEX(STR(?name), '^[하-힣]') } ORDER BY ?name LIMIT 20 |
![]() 'ㅎ' 으로 시작하는 저자 찾기 |
- 해외 도서관 연결 찾기
SELECT ?s ?o WHERE { ?s rdf:type <http://purl.org/ontology/bibo/Book> . ?s owl:sameAs ?o . } LIMIT 100 |
![]() 해외 도서관의 도서와 동일한 도서로 식별된 국립중앙도서관의 도서 찾기 |

'Programming > SPARQL' 카테고리의 다른 글
#SPARQL - Virtuoso 설치, 적재, 삭제 (0) | 2021.04.16 |
---|
댓글