본문 바로가기
Web Development/SPARQL

[SPARQL / RDF] SPARQL 트리플 패턴을 간단하게 이해해보기

by 감자맹고우 2022. 1. 17.
728x90
반응형

▼▼▼ SPARQL에 대해서 아직 이해가 덜 되었다면 하단의 이전 시리즈 글을 참고

 

[SPARQL / RDF] LOD 데이터와 SPARQL을 RDB 개념으로 간단하게 이해해보기

◆ LD : Linked Data ◆ OD : Open Data ◆ LD + OD = LOD(Linked Open Data) 위에서 알 수 있듯이 LOD는 Linked Data와 Open Data의 합성어이다. 웹에 발행된 데이터들을 개별 URI를 통해 구별 및 연결하는 Linke..

devlifetestcase.tistory.com

 

SPARQL 쿼리는 SQL 쿼리와 다르게 트리플 패턴으로 이루어져 있다.

 

트리플 패턴이 주는 느낌은 마치, 영어의 3형식 문장과 같다.

 

- 영어 3형식 문장 : 주어(S) + 동사(V) + 목적어(O)
- 트리플 패턴 : 주어부(subject) + 술어부(predicate), 목적부(object)

 

의미는 다르지만 트리플 패턴의 느낌을 문장처럼 생각하면 이해하기가 보다 쉽다.

 

빠르게 SPARQL 예제를 접하고 싶지만, 그 전에 딱 한가지 더 알고 가야할 것이 있다.

바로 '변수' 이다.

 

데이터베이스에 컬럼이 존재한다면, SPARQL에서는 변수가 존재한다.

SQL에서 컬럼을 통해 쿼리를 작성한다면, SPARQL에서는 변수를 사용하여 쿼리를 작성해야하는 것이다.

그리고, 이 변수는 '?' 나 '$'를 사용하여 표현하며, 주로 '?'를 사용하여 표현한다.

 

이제 예제를 접해보겠다.

예제로 사용할 Endpoint는 국토교통부 국가공간정보포털 > LOD 개방 서비스이다.

( http://www.nsdi.go.kr/lxportal/?menuno=4042 )

 

PREFIX poi: <http://lod.nsdi.go.kr/ontology/poi/>
PREFIX addr: <http://lod.nsdi.go.kr/ontology/address/>
PREFIX buil: <http://lod.nsdi.go.kr/ontology/building/>
PREFIX hous: <http://lod.nsdi.go.kr/ontology/house/>
PREFIX land: <http://lod.nsdi.go.kr/ontology/land/>
PREFIX dc: <http://purl.org/dc/elements/1.1/>
PREFIX geo: <http://www.w3.org/2003/01/geo/wgs84_pos#>
PREFIX ns: <http://www.w3.org/2006/vcard/ns#>

SELECT *
WHERE {
    ?uri dc:title ?title .
    ?uri poi:address ?address .
}
LIMIT 100

 

위의 쿼리는 해당 Endpoint에서 기본으로 제공되는 쿼리이다.

구조를 먼저 살펴보면, RDB와 비슷하게 SELECT, WHERE, LIMIT을 사용하고 있다.

다만, SPARQL에서 WHERE는 SQL의 WHERE가 아닌 FROM과 유사한 역할을 하고 있다는 것만 유의하면 된다.

 

PREFIX는 해당하는 uri를 약어로 줄여 사용하겠다는 뜻으로 이해하면 된다.

PREFIX poi: <http://lod.nsdi.go.kr/ontology/poi/>

위의 문장은 <http://lod.nsdi.go.kr/ontology/poi/>를 poi로 사용하겠다는 뜻이다.

 

반응형

 

SELECT *
WHERE {
    ?uri dc:title ?title .
    ?uri poi:address ?address .
}
LIMIT 100

 

그렇다면 위의 쿼리는 어떻게 해석하면 될까?

 

우선, SELECT *과 LIMIT 100은 말그대로 전체를 조회하되, 100개씩 조회하겠다는 뜻이다.

그리고 WHERE는 FROM과 같다고 했으니, {}안의 내용을 100개씩 전체 조회하겠다고 해석할 수 있다.

 

문제는 {}안의 트리플인데, 구조는 앞서 말한 트리플 패턴으로 2개의 트리플이 존재하는 구조이다.

즉, 첫번째 트리플에서는 ?uri가 주어부, dc:title은 술어부, ?title이 목적부이고

두번째 트리플에서는 ?uri가 주어부, poi:address가 술어부, ?address가 목적부이다.

트리플의 구분은 각 트리플의 끝에 마침표(.) 로 표시되어 2개의 트리플로 구성되었음을 알 수 있다.

 

그러면 이제 구조를 알았으니, 각 트리플의 의미를 분석해보자.

 

?uri dc:title ?title.

 

우선 첫번째 문장을 보면, 주어부인 ?uri가 변수로 되어있다. 보통 문장에서는 철수가 라면을 먹었다와 같이, 철수라는 주체가 명확한데 여기서는 주체가 변수로 되어있으니 감을 잡기가 어려웠다.

그러나 ?uri는 이렇게 이해하면 쉽다.

?uri는 Endpoint와 연계된 Ontology에서 제공되는 URI의 집합이다. 즉, '온톨로지에서 제공하는 URI 목록' 이라고 보면 된다.

 

dc:title 은 다음 URI와 같다.

PREFIX dc: <http://purl.org/dc/elements/1.1/> 로 dc에 대해서는 이미 선언이 되었다.

그러므로 dc:title은 <http://purl.org/dc/elements/1.1/title> 과 동일한 의미이다.

실제로 dc:title 대신 <http://purl.org/dc/elements/1.1/title> 라고 적어도 쿼리가 동일하게 동작한다.

뜻은 http://purl.org/dc/elements/1.1 의 타이틀 속성이라는 뜻으로, 표준처럼 흔히 사용되는 속성 중의 하나다.

 

( ※ 예를 들어, 온톨로지를 구성할 때 삼국지라는 책을 다루고 있는 URI를 데이터로 구성한다면 해당 URI를 데이터로 구성하면서 dc:title이라는 속성과 속성값을 부여할 수 있다.

그러면 SPARQL 쿼리를 통해서 dc:title이라는 속성을 가진 URI를 조회한다면, 삼국지 책을 다룬 URI와 속성, 속성값이 결과로 조회된다. )

 

반응형

 

그렇다면, 첫번째 문장의 전체 뜻은 URI목록(?uri)중 dc:title인 속성값을 ?title이라는 변수로 지정한다.

두번째 문장은 URI목록(?uri)중 poi:address 속성값을 ?address라는 변수로 지정한다.

 

표준에 따라 dc:title은 이름/제목을, address는 주소를 값으로 가지므로, URI 목록에서 이름과 주소를 조회하겠다는 뜻으로 알 수 있다.

 

그리고, 기본적으로 트리플이 여러 개로 이루어져있으면 교집합으로 조회한다.

그렇기에 전체 쿼리를 해석하면 결국 다음의 뜻과 같다.

 

SELECT *                                   ( == SELECT ?uri ?title ?address ; 변수 전체)
WHERE {
    ?uri dc:title ?title .
    ?uri poi:address ?address .
}
LIMIT 100

 

URI 목록 중 이름과 주소 속성이 모두 존재하는 데이터를 조회하며( WHERE {~~} ),

URI(?uri), 이름(?title), 주소(?address) 값을 조회하고( SELECT * ),

100개를 조회한다( LIMIT 100 ).

 

 

그 결과, 다음과 같이 조회가 되는 것을 알 수 있다.

 

URI TITLE ADDRESS
http://lod.nsdi.go.kr/ontology/poi/POI_100007 (주)세광푸드 충청북도 옥천군 옥천읍 마암리 102-7
http://lod.nsdi.go.kr/ontology/poi/POI_136522 (주)엘식품입구 충청북도 옥천군 옥천읍 마암리 102-7
http://lod.nsdi.go.kr/ontology/poi/POI_1000081 김백근농장 강원도 원주시 신림면 황둔리 800
http://lod.nsdi.go.kr/ontology/poi/POI_1000090 김백호농장 충청남도 당진시 우강면 송산리 513
http://lod.nsdi.go.kr/ontology/poi/POI_1000191 김병만의달인갈매기 전라북도 김제시 신풍동 584-6

 

 

※ 참고로 변수명은 ?uri, ?title, ?address 와 동일할 필요가 없으며, 변수명에 불과하므로 ?s ?o 이런 식으로 사용해도 결과 컬럼명만 달라질뿐 값은 동일하게 조회된다.

 

🤞 도움이 되셨기를 바랍니다. 한 번의 클릭과 댓글은 어딘가의 누군가에게 진실로 큰 힘이 됩니다. 🐱‍🏍

 

728x90
반응형

댓글