이번에 더 배울 것
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으로 겁니다.
작은 예제로 따라가기
그래프연구실은 민수(p2, p3)·지아(p1, p2)·서준(p3), 언어연구실은 하린(p4)·도윤(p4)·유나(없음)입니다. OPTIONAL을 쓴 COUNT(?paper)는 그래프연구실 5, 언어연구실 2입니다.
COUNT(DISTINCT ?paper)는 그래프연구실 3(p1, p2, p3), 언어연구실 1(p4)입니다.
HAVING (COUNT(DISTINCT ?paper) >= 2)를 붙이면 그래프연구실만 남습니다.
언어연구실을 세는 네 가지 방법
언어연구실(하린 p4, 도윤 p4, 유나는 논문 없음)에 대해 각 쿼리의 결과 행 수나 COUNT 값을 먼저 예상하세요.
유나는 authored 패턴이 맞지 않아 해에서 사라집니다.
학습을 시작하면 새 문제를 직접 풀고 확인 퀴즈를 마친 뒤 선택한 본과정 회차로 돌아갑니다.