SPARQL로 패턴 찾기
RDF 그래프에 질문하는 표준 언어 SPARQL에서, 변수가 든 트리플 패턴으로 값을 찾는 법을 봅니다.
이번 회차, 내 속도로.
기초를 더 짚거나 궁금한 주제로 잠깐 넓혀 보세요. 최대 3단계를 거쳐 DAY 38로 돌아옵니다.
난이도·관심 주제 고르기
1/2개 선택 · 새 보충·심화 수업과 본과정 다시 읽기를 선택할 수 있어요.
이렇게 다녀와요 1단계 · 약 12분
- 출발 · DAY 38SPARQL 기본 그래프 패턴
- 1. 관심 주제빈 노드·데이터타입·언어 태그추가 15 · 새 추가 수업
- 복귀 · DAY 38원래 회차 이어가기
- 빈 노드·데이터타입·언어 태그 · DAY 36·37에서 트리플과 IRI를 배운 뒤, 이름 없는 대상과 값의 타입 때문에 생기는 실수를 다루러 옵니다.
선택과 경로 기록은 이 브라우저에 저장됩니다. 본과정의 회차 완료와는 별도입니다.
핵심 개념
SPARQL은 W3C가 정한 RDF 질의 언어로, 현재 널리 쓰이는 판은 SPARQL 1.1입니다. 데이터의 트리플과 같은 모양에 ?로 시작하는 변수를 넣어 질문합니다. PREFIX ex: <http://example.org/> SELECT ?p WHERE { ?p ex:worksAt ex:graphLab . }은 그래프연구실에서 일하는 대상을 모두 ?p에 묶어 돌려줍니다. 결과는 변수 값들의 표입니다.
중괄호 안에 트리플 패턴 여러 개를 마침표로 이어 쓴 것을 기본 그래프 패턴(basic graph pattern, BGP)이라고 합니다. 패턴들이 같은 변수를 쓰면 그 변수 값이 같은 것끼리만 결과로 남습니다. 곧 공통 변수가 조인 역할을 합니다. PREFIX ex: <http://example.org/> SELECT ?p WHERE { ?p ex:worksAt ?lab . ?lab ex:city "대전" . }은 ?lab으로 두 패턴을 이어 ‘대전 연구실에서 일하는 사람’을 찾습니다.
리터럴 조건은 패턴에 값을 직접 넣거나 FILTER로 씁니다. 같은 PREFIX 아래에서 SELECT ?x WHERE { ?x ex:year ?y . FILTER(?y >= 2021) }는 2021년 이후 논문만 남깁니다. 구조는 Cypher의 MATCH–WHERE와 비슷하지만, SPARQL에서는 노드의 속성도 모두 트리플이라 속성 조건도 트리플 패턴으로 씁니다.
BGP는 정확히 일치하는 트리플만 찾습니다. 한 패턴이라도 맞는 트리플이 없으면 그 해(solution)는 사라지고, 빠진 값을 허용하려면 OPTIONAL이 필요합니다. 또 술어 IRI가 다르면 뜻이 비슷해도 일치하지 않습니다. ex:worksAt으로 질의하면 schema:worksFor로 적은 데이터는 매핑 없이는 찾지 못합니다.
작은 예제로 따라가기
데이터: minsu와 jia가 graphLab에서, harin이 langLab에서 일하고, graphLab의 city는 "대전", langLab은 "서울"입니다. 패턴 ?p ex:worksAt ?lab의 바인딩은 3개입니다.
패턴 ?lab ex:city "대전"의 바인딩은 ?lab=graphLab 1개입니다.
두 패턴을 ?lab으로 조인하면 (minsu, graphLab), (jia, graphLab) 2개의 해가 남습니다.
직접 실험해 보기
쿼리 선택지를 ‘트리플 패턴 1개 → 2개 조인 → 리터럴 필터’ 순서로 바꾸며, 패턴별 중간 바인딩 수와 최종 결과 표의 행 수를 기록하세요.
트리플 패턴을 공통 변수로 조인하기
PREFIX foaf: <http://xmlns.com/foaf/0.1/>
PREFIX ex: <http://example.org/lab/>
SELECT ?p ?name
WHERE {
?p ex:worksAt ex:lab1 .
?p foaf:name ?name .
}| # | 트리플 패턴 | 단독 | 조인 후 |
|---|---|---|---|
| ?p ex:worksAt ex:lab1 | 3 | 3 | |
| ?p foaf:name ?name | 6 | 3 (?p로 조인) |
| ?p | ?name |
|---|---|
| ex:minsu | "민수" |
| ex:jia | "지아" |
| ex:seojun | "서준" |
| 주어 | 술어 | 목적어 |
|---|---|---|
| ex:minsu | foaf:name | "민수" |
| ex:minsu | ex:worksAt | ex:lab1 |
| ex:jia | foaf:name | "지아" |
| ex:jia | ex:worksAt | ex:lab1 |
| ex:seojun | foaf:name | "서준" |
| ex:seojun | ex:worksAt | ex:lab1 |
| ex:harin | foaf:name | "하린" |
| ex:harin | ex:worksAt | ex:lab2 |
| ex:doyun | foaf:name | "도윤" |
| ex:doyun | ex:worksAt | ex:lab2 |
| ex:yuna | foaf:name | "유나" |
| ex:yuna | ex:worksAt | ex:lab2 |
| ex:lab1 | ex:city | "대전" |
| ex:lab2 | ex:city | "서울" |
변수(?p)에 값을 묶는 것이 바인딩이다. 두 패턴이 같은 변수를 쓰면 두 바인딩의 값이 같은 것만 남는다(조인). 리터럴 "대전"을 패턴에 직접 쓰면 그 값과 정확히 같은 트리플만 맞는다.
이번에는 직접 풀어 보세요
정답을 보기 전에 계산과 이유를 적어 보세요. 해설과 비교하고 확인 표시를 남기면 완료할 수 있습니다.
힌트 보기
worksAt, city, authored 세 패턴을 공통 변수로 잇습니다.
풀이와 비교하기
PREFIX ex: <http://example.org/> SELECT ?p ?paper WHERE { ?p ex:worksAt ?lab . ?lab ex:city "대전" . ?p ex:authored ?paper . }입니다. 결과는 (ex:minsu, ex:p2)와 (ex:jia, ex:p2) 2행입니다.
풀이와 확인 표시는 이 브라우저에 저장됩니다.
오늘 이해한 것과 다시 볼 것
계산이 달라진 이유, 헷갈린 개념, 다음에 확인할 질문을 남겨 보세요.
메모는 이 브라우저에 저장됩니다. 홈에서 전체 기록을 내려받을 수 있습니다.오늘의 이해 확인
SPARQL 기본 그래프 패턴에서 두 트리플 패턴이 같은 변수 ?lab을 쓰면 어떻게 되나요?
완료 조건: 확인 퀴즈 정답 · / 직접 풀기 0/1
더 깊이 읽기
예제와 실험 데이터는 이 과정을 위해 만든 것입니다. 원문은 선택 자료이며, 강의와 직접 풀기만으로도 다음 회차를 이어갈 수 있습니다.
SPARQL 1.1 Query LanguageW3C이 자료는 개념 학습용입니다. 실제 데이터베이스·라이브러리·플랫폼의 동작과 설정은 제품과 버전마다 다를 수 있습니다.