SHACL 조건부 개수 검수, 연결된 값이 모두 기준을 벗어날 때
SHACL 조건부 개수는 전체 값과 기준에 맞는 값을 나눠 셉니다. 활성 표기가 없는 연락처와 비활성 연락처를 가상 표본으로 대조하고, 최소 개수 통과 뒤 남는 필드 오류의 검수 범위를 정리합니다.
이 글을 쓴 알파카랩스카카오·네이버·쿠팡 출신, 재하청 0%, 대기업·공공기관 등 18개사+ 레퍼런스
2026년 11월 기준, SHACL에서 조건에 맞는 값이 최소 하나인지는 qualifiedMinCount 1로 검사합니다. 연결이 많아도 적합 값이 없으면 위반입니다.
거래처에 연락처 두 개가 연결돼 있지만 둘 다 비활성으로 표시된 상황을 가정해 보겠습니다. 전체 개수가 하나 이상이라는 검사만으로는 활성 연락처가 있는지 확인할 수 없습니다. 연결된 값의 목록과 그중 조건을 만족하는 값의 목록을 나눠 봐야 합니다.
전체 값 수와 조건을 맞춘 값 수는 어떻게 다른가요?#
일반 minCount는 지정 경로의 전체 값 노드 수를 제한합니다. qualifiedValueShape는 개수를 셀 값이 만족해야 할 조건을 지정하고, qualifiedMinCount는 그 조건에 맞는 값의 최소 개수를 정합니다. 이 글은 서로 겹치는 형제 조건을 제외하는 설정 없이 단일 조건을 적용합니다. W3C SHACL 조건부 개수 제약
조건을 ‘active가 불리언 값 하나이며 true’라고 정하면 false만 있는 연락처와 active가 없는 연락처는 모두 개수에 포함되지 않습니다. 같은 최소 개수 위반이 나와도 원천에서 누락과 false 표기를 따로 확인해야 합니다.
활성 표기 조건은 어떻게 적나요?#
아래는 가상 거래처 account의 contact 경로를 검사하는 셰이프입니다. 활성 표기가 true 하나인 연락처가 최소 하나 있어야 합니다. 상태 표기의 출처와 갱신일은 입력 계약에서 정하고, 이 예제는 추론 없는 고정 그래프를 검사합니다.
@prefix ex: <https://example.org/contact/> .
@prefix sh: <http://www.w3.org/ns/shacl#> .
@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .
ex:AccountShape a sh:NodeShape ;
sh:targetNode ex:account ;
sh:property [
sh:path ex:contact ;
sh:qualifiedValueShape ex:ActiveContactShape ;
sh:qualifiedMinCount 1
] .
ex:ActiveContactShape a sh:NodeShape ;
sh:property [
sh:path ex:active ;
sh:datatype xsd:boolean ;
sh:minCount 1 ;
sh:maxCount 1 ;
sh:hasValue true
] .연락처에 true와 false가 함께 있으면 maxCount 조건을 벗어나므로 위 조건에 맞는 값으로 세지 않습니다. 연락처가 실제로 연락 가능한지, 현재 업무의 승인 권한이 있는지는 별도 확인이 필요합니다.
어떤 입력을 넣어 일반 개수 검사와 대조하나요?#
같은 입력에 일반 minCount 1과 위 조건부 규칙을 각각 적용합니다. 아래 표의 ‘적합 수’는 active가 불리언 true 하나라는 조건을 만족한 연락처 수입니다. 각 행은 독립된 가상 그래프입니다.
| 가상 연결·표기 | 전체 수 | 적합 수 | 일반 최소 1 / 조건부 최소 1 |
|---|---|---|---|
| false인 연락처 두 개 | 2 | 0 | 통과 / 위반 |
| true 하나와 false 하나 | 2 | 1 | 통과 / 통과 |
| active가 없는 연락처 하나 | 1 | 0 | 통과 / 위반 |
| true 하나와 표기 누락 하나 | 2 | 1 | 통과 / 통과 |
| 연결된 연락처 없음 | 0 | 0 | 위반 / 위반 |
| 한 연락처에 true·false 함께 있음 | 1 | 0 | 통과 / 위반 |
조건부 위반이 나오면 전체 연결 수, 적합한 값 목록, 적합하지 않은 이유를 나눠 확인합니다. 보고서에 적합하지 않은 각 연락처의 세부 사유가 모두 펼쳐질 것이라고 가정하지 않고, 입력과 조건을 따로 대조합니다. 검사 대상 자체가 빠지는 문제는 SHACL 검증 대상 누락 검수에서 다룹니다.
조건부 개수가 통과하면 전체 데이터도 올바른가요?#
표의 true 하나·표기 누락 하나인 그래프는 조건부 최소 개수를 통과합니다. 누락된 연락처의 필드를 모두 검사하는 규칙까지 적용한 결과는 별도로 확인해야 합니다. 각 연락처의 active가 필수라면 그 조건을 담은 셰이프를 만들고 contact 경로의 sh:node로 모든 값에 적용할 수 있습니다. W3C SHACL 노드 제약
전체 값의 개수와 OWL 동일성 의미를 대조하는 기준은 OWL 함수형 관계와 개수 검수에서 확인할 수 있습니다. 이번 예제의 판정 단위는 그래프의 값 노드입니다. 원천 행 수나 실제 사람 수를 대신하지 않습니다.
기술 근거는 2017년 7월 20일 SHACL 권고입니다. 2026년 11월 2일 공개된 SHACL 1.2 Core는 작업 초안이며 두 판본은 2026년 11월 5일에 확인했습니다. 원고의 합성 입력은 pySHACL 0.40.2에서 실행해 표의 결과와 대조했습니다. SHACL 1.2 Core 작업 초안
알파카랩스의 온톨로지 구축 서비스는 관계·제약 정의와 대표 정답·오답·보류 표본의 검수 조건을 협의합니다. 이 글은 알파카랩스가 작성한 설계 안내이며 하단에 자사 서비스 상담 링크가 있습니다.
SHACL 조건부 개수 검수 FAQ#
일반 minCount 1을 쓰면 활성 연락처도 하나 확보되나요?
전체 값의 존재만 확인합니다. 활성 표기처럼 값 노드가 만족해야 할 조건이 있으면 qualifiedValueShape와 조건부 개수를 함께 검토합니다.
조건에 맞지 않는 연락처가 있으면 항상 위반인가요?
이 예제는 조건에 맞는 연락처가 최소 하나인지만 검사합니다. true 하나와 false 하나인 입력은 통과합니다. 모든 연락처가 별도 필드 규칙을 만족해야 하면 그 규칙도 함께 적용합니다.
active가 없으면 false와 같은 뜻인가요?
이 셰이프의 적합 개수에는 둘 다 포함되지 않지만 업무 의미는 구별해야 합니다. 원천 미입력·미수집과 명시적인 false를 나눠 확인합니다.
true와 false가 함께 있어도 true가 있으니 포함하나요?
원고의 조건은 active 값이 하나여야 합니다. true와 false가 함께 있으면 maxCount를 벗어나므로 그 연락처는 적합 개수에 포함되지 않습니다.
조건부 개수 통과를 실제 연락 가능 여부로 써도 되나요?
그래프에 기록된 상태가 셰이프 조건에 맞는지 검증한 결과입니다. 원천 표기의 갱신일과 실제 사용 가능성·업무 권한은 별도 근거로 확인합니다.
조건부 개수 인수표 협의#
비식별 관계 표본에 조건을 만족해야 할 값과 최소 개수, 기대 결과를 적으면 인수표 초안 범위를 협의할 수 있습니다. 소요 시간은 입력과 규칙 범위를 확인한 뒤 정합니다.