G·Graph Daily Lab 전체 140회
추가 16 / 40 · 심화 · 약 15분

SPARQL로 빠진 값 다루고 묶어 세기

기본 그래프 패턴만으로는 답하기 어려운 질문, 곧 값이 빠진 대상을 남기고, 조건으로 거르고, 그룹별로 세는 질문을 SPARQL로 씁니다.

RDF와 SPARQL

배운 뒤 돌아올 회차

DAY 38의 기본 그래프 패턴 다음 단계로, 논문이 없는 사람까지 포함한 연구실별 집계를 만들기 위해 옵니다.

시작하면 직접 풀기와 퀴즈 기록이 저장됩니다. 본과정 100회 진도와는 별도입니다.

이번에 더 배울 것

OPTIONAL은 SPARQL의 왼쪽 외부 조인입니다. PREFIX ex: <http://example.org/> SELECT ?p ?paper WHERE { ?p ex:worksAt ?lab . OPTIONAL { ?p ex:authored ?paper } }는 논문이 없는 사람도 해로 남기고, 그때 ?paper는 값이 묶이지 않은(unbound) 상태가 됩니다. 빈 문자열이나 0이 아니라 ‘값 없음’이라는 점이 중요합니다.

FILTER는 해를 조건으로 거릅니다. FILTER(?year >= 2021)처럼 비교하거나, OPTIONAL 뒤에 FILTER(!BOUND(?paper))를 붙여 값이 묶이지 않은 해만 남기면 ‘논문이 없는 사람’을 찾습니다. 같은 질문을 FILTER NOT EXISTS { ?p ex:authored ?x }로 쓸 수도 있습니다. FILTER는 결과가 거짓이거나 오류인 해를 모두 버립니다.

집계는 GROUP BY와 COUNT·SUM·AVG를 씁니다. 같은 PREFIX 아래에서 SELECT ?lab (COUNT(?paper) AS ?n) WHERE { ?p ex:worksAt ?lab . OPTIONAL { ?p ex:authored ?paper } } GROUP BY ?lab에서 COUNT(?paper)는 묶인 값만 세므로 논문 없는 사람은 0으로 기여합니다. 공저 논문이 두 번 세어지는 것을 막으려면 COUNT(DISTINCT ?paper)를 쓰고, 그룹 단위 조건은 HAVING으로 겁니다.

작은 예제로 따라가기

1

그래프연구실은 민수(p2, p3)·지아(p1, p2)·서준(p3), 언어연구실은 하린(p4)·도윤(p4)·유나(없음)입니다. OPTIONAL을 쓴 COUNT(?paper)는 그래프연구실 5, 언어연구실 2입니다.

2

COUNT(DISTINCT ?paper)는 그래프연구실 3(p1, p2, p3), 언어연구실 1(p4)입니다.

3

HAVING (COUNT(DISTINCT ?paper) >= 2)를 붙이면 그래프연구실만 남습니다.

COMPARE & EXPLAIN

언어연구실을 세는 네 가지 방법

언어연구실(하린 p4, 도윤 p4, 유나는 논문 없음)에 대해 각 쿼리의 결과 행 수나 COUNT 값을 먼저 예상하세요.

2행(하린 p4, 도윤 p4)

유나는 authored 패턴이 맞지 않아 해에서 사라집니다.

OPTIONAL은 값 없는 해를 남기고, FILTER는 거르며, GROUP BY·COUNT(DISTINCT)·HAVING은 그룹 단위로 셉니다.

학습을 시작하면 새 문제를 직접 풀고 확인 퀴즈를 마친 뒤 선택한 본과정 회차로 돌아갑니다.