SPARQL VALUES 검수, 빈 ID가 조회를 넓히는 이유
SPARQL 배치 조회의 VALUES에 UNDEF가 섞이면 요청 목록 밖의 주문이 나올 수 있습니다. 같은 그룹과 서브쿼리의 BOUND 결과를 가상 조회 7개로 비교합니다.
이 글을 쓴 알파카랩스카카오·네이버·쿠팡 출신, 재하청 0%, 대기업·공공기관 등 18개사+ 레퍼런스
SPARQL VALUES의 ID 칸에 UNDEF를 넣으면 그 행의 ID 제약이 빠집니다. 필수 ID는 조인 전에 확인하세요. 2026년 11월 10일 확인 기준입니다.
담당자가 주문 A의 상태만 확인하려고 했는데 AI 도구가 주문 B와 C까지 반환했다고 해 보겠습니다. 배치 요청에 A와 빈 ID가 있었고, 조회기가 그 빈 값을 UNDEF로 만들어 넘겼다면 인라인 값 표에서 ID가 정해지지 않은 행이 생깁니다. 그 행은 뒤의 주문 상태 패턴에서 A, B, C에 모두 결합할 수 있습니다.
UNDEF 한 행이 왜 요청 범위를 넓히나요?#
SPARQL의 VALUES는 조회에 결합할 인라인 값 표를 만듭니다. UNDEF가 있는 칸에는 변수와 RDF 값의 대응이 생기지 않습니다. 조인할 때 양쪽에 공통으로 값이 있는 변수만 서로 같아야 하므로, ID 하나만 있는 표에서 그 칸이 비어 있으면 해당 행에는 주문을 고르는 조건이 없습니다. W3C SPARQL 1.1 VALUES · 호환 매핑의 정의
가상 그래프에 상태가 있는 주문 A·B·C가 각각 한 건 있다고 가정합니다. A와 UNDEF를 함께 주면 A를 지정한 행이 A 한 건과 결합하고, ID가 비어 있는 행은 A·B·C와 결합합니다. 그 결과 A가 두 번 나옵니다. DISTINCT를 추가해도 A의 중복만 사라져 B와 C가 남습니다.
배치 조회는 어떤 결과를 인수표에 적나요?#
가상 그래프에서 주문 A는 접수, B는 포장, C는 출하 상태입니다. 인수표에는 조회 요청의 ID 목록, 허용 그래프, 예상 ID와 각 ID의 행 수를 따로 적습니다. 아래 표는 같은 그래프에 인라인 ID 값과 조건만 바꾼 결과입니다.
| 요청 또는 조회 조건 | 결과 ID와 행 수 | 확인할 점 |
|---|---|---|
| VALUES에 주문 A | A 1행 | 요청한 ID만 반환 |
| VALUES에 UNDEF 한 행 | A·B·C 각 1행 | 그 행에서 ID 제약이 빠짐 |
| VALUES에 A와 UNDEF | A 2행, B·C 각 1행 | 다른 ID가 들어오고 A가 중복 |
| 같은 그룹에 FILTER BOUND | A 2행, B·C 각 1행 | 그래프 패턴이 ID를 채운 뒤 조건 적용 |
| 같은 결과에 SELECT DISTINCT | A·B·C 각 1행 | 중복은 줄고 조회 대상은 넓은 채로 유지 |
| ID만 있는 서브쿼리에서 BOUND | A 1행 | 미바인딩 ID를 조인 전에 제거 |
| 그래프에 없는 유효한 ID | 0행 | ID 제약을 유지하고 일치 결과가 없음 |
같은 그룹에 둔 FILTER(BOUND(?id))는 그 그룹의 그래프 패턴에서 이미 값이 생긴 ID를 통과시킵니다. 문장만 위로 옮겨도 같은 그룹에 있는 한 필터의 범위는 같습니다. 아래처럼 인라인 ID 표만 평가하는 서브쿼리에서는 BOUND가 조인 전에 미바인딩 행을 제거합니다. W3C FILTER 범위 · SPARQL 서브쿼리
PREFIX ex: <https://example.test/orders/>
SELECT ?id ?status WHERE {
{
SELECT ?id WHERE {
VALUES ?id { ex:orderA UNDEF }
FILTER(BOUND(?id))
}
}
?id ex:status ?status .
}필수 ID가 누락된 요청은 입력 단계에서 오류로 돌려주면 호출자가 누락을 바로 고칠 수 있습니다. 부분 처리를 허용하는 서비스라면 누락 행을 별도 상태로 돌려주고, 검증을 마친 ID만 조회하는 정책을 정합니다. 필수 ID가 모두 빠진 경우는 그래프 조회를 시작하기 전에 처리합니다. 그래프에 없는 유효한 ID의 0행과 입력 오류는 응답에서 구분합니다.
UNDEF를 허용해도 되는 경우는 언제인가요?#
배치의 주문 ID는 정해져 있고 창고 조건만 선택 사항이라면, 창고를 지정하지 않은 행에서 그 주문의 여러 창고를 허용하는 의도일 수 있습니다. 먼저 필수 열과 선택 열을 나누고, 여러 값으로 넓어질 수 있는 선택 열은 응답 범위에 적습니다. 쿼리 실행이 허용되는 그래프와 사용자가 읽을 수 있는 데이터의 권한은 별도로 확인합니다.
결과에 다른 ID가 섞이면 활성 그래프와 해당 요청의 접근 권한을 유지한 채 인라인 표만 바꿔 재현합니다. 데이터셋 선택을 확인하는 방법은 SPARQL 조회 범위 검수에 있습니다. 입력 매퍼, 질의 템플릿, 엔진을 바꾸면 같은 가상 요청을 다시 검수합니다.
어떤 문서에서 기준을 확인했나요?#
- W3C SPARQL 1.1 Query Language는 VALUES의 미바인딩, 그룹 필터, 서브쿼리와 조인 규칙을 정의합니다. 2013년 3월 21일 권고.
- W3C SPARQL 1.2 Query 작업 초안은 VALUES와 UNDEF의 같은 입력 예를 설명합니다. 2026년 11월 1일 공개한 작업 초안입니다.
- 알파카랩스 온톨로지 구축·컨설팅은 공통 식별자·원천 매핑, 출처와 권한을 지키는 AI 조회, 운영 인수 조건을 협의하는 서비스를 안내합니다.
원문은 2026년 11월 10일 확인했습니다. 가상 표의 행 수는 RDFLib에서 실행한 SPARQL 1.1 예시의 결과입니다.
자주 묻는 질문#
VALUES의 UNDEF는 NULL과 같은 값인가요?
해당 행에 변수의 값이 생기지 않는다는 표시입니다. 그래프에서 얻은 해가 그 변수에 값을 제공해 함께 결합할 수 있습니다.
같은 WHERE 그룹에서 FILTER를 앞에 두면 해결되나요?
같은 그룹의 필터 위치를 앞쪽으로 옮겨도 그 그룹을 평가하는 범위는 같습니다. 예시처럼 인라인 ID만 담은 서브쿼리 안에서 BOUND를 적용할 수 있습니다.
DISTINCT를 쓰면 요청한 주문만 남나요?
같은 결과 행의 중복을 줄입니다. 요청에 없던 B와 C가 이미 조인 결과에 있다면 그대로 남습니다.
모든 ID가 빠졌거나 유효한 ID가 존재하지 않으면 어떻게 다루나요?
필수 ID가 모두 빠진 요청은 입력 정책에 따라 오류나 별도 상태로 처리합니다. 검증된 ID로 조회했는데 그래프에 일치가 없으면 0행으로 기록합니다.
선택 조건에는 UNDEF를 쓸 수 있나요?
그 열에 값이 없을 때 조건을 넓혀도 되는지 먼저 정합니다. 주문 ID는 필수로 두고 선택 창고만 미지정으로 허용하는 방식이 한 예입니다.
배치 조회 인수 범위를 정할 때#
SPARQL 배치 조회의 인수 기준을 정리합니다
첫 범위 협의에서 비식별 ID 요청과 기대 결과를 바탕으로 누락·과다 조회의 인수 기준을 정리합니다. 소요 시간은 표본과 조회 권한 범위를 확인한 뒤 협의합니다.
SPARQL 배치 조회 인수표 초안 협의