SHACL 대안 검수SHACL xone or 차이SHACL 두 조건 동시 충족SHACL xone 속성 개수

SHACL 대안 검수, 두 조건이 맞는데 왜 부적합할까

SHACL xone은 정확히 한 대안, or는 하나 이상이 적합해야 통과합니다. 티켓 ID와 수동 예외 사유의 누락·동시 충족·복수 값·빈 값을 가상 표본으로 비교합니다.

이 글을 쓴 알파카랩스카카오·네이버·쿠팡 출신, 재하청 0%, 대기업·공공기관 등 18개사+ 레퍼런스

발행 ·알파카랩스

2026년 11월 기준, SHACL의 sh:xone은 대안 셰이프가 정확히 하나 맞을 때 통과합니다. 둘 다 맞으면 부적합이며, 둘을 허용하려면 sh:or를 검토합니다.

작업 요청에 자동 배정용 티켓 ID나 수동 처리 사유 중 하나를 남긴다고 가정해 보겠습니다. 담당자가 수동으로 처리하면서 티켓 ID도 남겨 두면 두 근거가 모두 있는 작업이 됩니다. 둘이 공존해도 되는 업무인지, 하나만 허용할지 먼저 정해야 같은 검증 결과를 두고 다른 판단을 내리는 일을 줄일 수 있습니다.

이 글은 그래프에 넣을 작업 요청의 검수 기준을 정하는 IT·데이터 책임자를 위한 가이드입니다. 유형 자체의 배타성은 온톨로지 배타 클래스 검수, 한 경로의 적합한 값 개수는 SHACL 조건부 개수 검수에서 다룹니다.

두 대안이 모두 맞으면 왜 부적합한가요?#

sh:xone은 평가하는 노드가 대안 셰이프 중 정확히 하나에 적합해야 합니다. 적합한 대안이 0개이거나 2개라면 이 예제에서 부적합입니다. sh:or는 하나 이상이면 적합하므로 두 대안이 모두 맞아도 통과합니다. W3C SHACL 권고의 xone 정의

아래 셰이프는 작업 노드 하나를 대상으로 삼습니다. 티켓 대안에는 티켓 ID가 하나 이상, 수동 대안에는 사유가 하나 이상 있어야 합니다. 대안에 별도 타깃을 붙이지 않아도 상위 셰이프가 같은 작업 노드를 두 대안으로 검사합니다. 두 대안이 동시에 맞는 상황을 일부러 만들 수 있도록 상대 필드의 유무는 각 대안에서 검사하지 않습니다.

@prefix ex: <https://example.invalid/work/> .
@prefix sh: <http://www.w3.org/ns/shacl#> .

ex:WorkShape a sh:NodeShape ;
  sh:targetNode ex:work ;
  sh:xone ( ex:TicketShape ex:ManualShape ) .

ex:TicketShape a sh:NodeShape ;
  sh:property [
    sh:path ex:ticketId ;
    sh:minCount 1
  ] .

ex:ManualShape a sh:NodeShape ;
  sh:property [
    sh:path ex:manualReason ;
    sh:minCount 1
  ] .

어떤 표본에서 or와 xone이 달라지나요?#

티켓 ID와 수동 사유가 모두 있으면 차이가 드러납니다. 가상 그래프를 입력마다 새로 만들고, 각 대안을 따로 검증한 뒤 같은 상위 셰이프에 sh:or와 sh:xone을 각각 적용했습니다.

한 작업의 입력적합한 대안sh:orsh:xone
둘 다 없음없음부적합부적합
티켓 ID만 있음티켓적합적합
수동 사유만 있음수동적합적합
티켓 ID와 사유가 모두 있음티켓·수동적합부적합
서로 다른 티켓 ID 2개티켓적합적합
빈 문자열인 티켓 ID만 있음티켓적합적합
2026년 11월 9일 pySHACL 0.40.2와 RDFLib 7.6.0에서 실행한 가상 결과입니다. 입력 6개를 대안별 2회와 상위 셰이프 2회로 각각 실행해 총 24회 대조했습니다. 추론, 고급 기능과 첫 오류 중단을 끄고 검증기 반환값과 보고서의 sh:conforms가 일치하는지 확인했습니다.

마지막 두 행이 통과한 이유는 티켓 대안이 값의 존재만 확인하기 때문입니다. 티켓 ID를 한 개로 제한하려면 그 속성에 최대 개수 제약을 두고, 빈 문자열을 막으려면 길이나 형식을 별도로 검사합니다. 공백만 있는 문자열이나 실제 시스템에 없는 티켓은 또 다른 검사 조건입니다.

두 근거를 함께 보존해야 하는 업무라면 어떻게 하나요?#

수동 처리 기록과 자동 배정 이력을 같은 노드에 보존해야 한다면 두 근거의 공존은 정상일 수 있습니다. 한 근거만 있어도 되고 둘이 함께 있어도 된다면 sh:or가 그 조건과 맞습니다. 근거는 모두 보존하면서 선택된 처리 방식만 하나로 기록해야 한다면, 선택값을 별도 필드로 두고 선택에 맞는 필수 근거를 검증하는 방법도 있습니다.

이 실행에서 두 대안이 모두 없거나 모두 맞는 경우의 보고서에는 sh:sourceConstraintComponent 값으로 sh:XoneConstraintComponent가 기록됐습니다. 그 값만으로는 어느 대안이 적합했는지 알기 어렵습니다. 진단용 사본에서 상위 셰이프의 타깃을 제거하고, 검사할 대안 하나에만 같은 작업 노드를 임시 타깃으로 붙입니다. 다른 대안도 별도 사본에서 실행해 두 판정을 나란히 봅니다. 검증 자체가 실패한 상태도 정상 완료한 부적합 보고서와 구분합니다.

어떤 근거를 확인했나요?#

원문은 2026년 11월 9일 확인했습니다. 알파카랩스 온톨로지 구축 서비스는 개념·관계·제약 정의, 원천 매핑, 검수 기준을 협의한다고 공개 안내합니다. 위 작업 노드와 인수표는 설계 예시입니다.

SHACL 대안 검수 FAQ#

sh:xone을 쓰면 한 속성에 값이 하나만 들어가나요?

sh:xone이 세는 대상은 적합한 대안 셰이프입니다. 한 속성에 값을 하나만 허용하려면 그 속성에 개수 조건을 별도로 둡니다.

두 대안에 모두 적합한 노드를 허용하려면 어떻게 하나요?

하나 이상이 적합하면 되는 업무 규칙에는 sh:or가 맞습니다. 각각의 대안이 어떤 필드를 검사하는지는 따로 정의합니다.

빈 문자열 티켓 ID가 왜 적합했나요?

가상 티켓 대안은 값이 존재하는지 검사했습니다. 빈 문자열도 값 하나로 셉니다. 빈 값과 공백만 있는 값은 길이나 형식 조건으로 따로 검수합니다.

보고서에서 어느 대안이 실패했는지 어떻게 확인하나요?

이 예제의 진단에서는 상위 셰이프의 타깃을 제거하고 검사할 대안 하나에만 같은 노드를 타깃으로 붙입니다. 각 대안을 별도 사본에서 실행해 적합 여부를 비교합니다.

적합이면 실제 티켓도 유효한가요?

이 예제의 적합은 그래프 안의 대안 조건이 맞았다는 뜻입니다. 원천 시스템에 티켓이 있는지와 처리 권한이 있는지는 별도로 확인합니다.

대안 셰이프 인수표 초안 협의#

식별 정보와 실제 요청 내용을 뺀 표본을 준비해 주세요. 첫 범위 협의에서 두 근거가 함께 있어도 되는 경우와 각각의 필수 조건을 인수표에 정리합니다. 소요 시간은 표본과 검수 범위를 확인한 뒤 협의합니다.

대안 셰이프의 인수 조건을 정리합니다

첫 범위 협의에서 비식별 표본으로 대안별 인수 조건을 정리합니다. 소요 시간은 자료와 검수 범위를 확인한 뒤 협의합니다.

대안 셰이프 인수표 초안 협의