SHACL 참조 타입 검수SHACL nodeKind class 차이SHACL IRI 문자열 검증SHACL 참조 대상 누락

SHACL 참조 타입 검수, 같은 주소가 왜 다른 결과를 낼까

협력사 주소가 문자열로 들어오거나 연결 대상의 유형이 빠졌을 때 SHACL에서 어떤 오류가 나는지 확인합니다. nodeKind, class, 개수 제약을 가상 발주 8건으로 비교합니다.

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

발행 ·알파카랩스

2026년 11월 기준, SHACL 참조는 노드 종류와 대상 유형을 각각 검사합니다. IRI만 요구하면 같은 주소를 적은 문자열도 위반입니다.

발주 화면에는 협력사 주소가 제대로 보이는데, 같은 발주를 지식그래프에서 조회하면 연결된 협력사 정보가 비어 있을 수 있습니다. 주소처럼 보이는 문자열이 저장됐는지, 실제 식별자로 연결됐지만 대상의 유형 정보가 빠졌는지부터 확인하면 수정할 지점을 찾을 수 있습니다.

같은 주소를 적어도 왜 결과가 달라질까요?#

IRI는 그래프에서 대상을 가리키는 식별자입니다. 같은 주소를 따옴표로 감싸면 RDF에서는 리터럴 값이 됩니다. 그 리터럴에 주소용 자료형을 지정해도 노드 종류는 그대로입니다. SHACL 권고안의 노드 종류 제약에 따르면 sh:nodeKind sh:IRI는 속성값이 IRI인지 검사합니다. IRI로 연결했다면 클래스 제약인 sh:class로 현재 데이터 그래프에 그 대상이 협력사 클래스에 속한다는 근거가 있는지 확인할 수 있습니다.

개수 제약으로 필수·단일 관계를 검수할 수 있습니다. 발주에 협력사 참조를 정확히 하나 두기로 했다면 sh:minCount 1과 sh:maxCount 1을 둡니다. 참조가 아예 없을 때는 종류나 유형을 판정할 값이 없으므로 누락은 개수 제약으로 잡습니다. 반대로 두 협력사가 모두 올바른 유형이더라도 단일 참조를 요구한 발주에는 개수 위반이 남습니다.

발주 하나에서 어떤 입력을 비교할까요?#

다음 셰이프는 가상 발주 하나를 검사합니다. 협력사 값은 정확히 하나이며 IRI로 연결되고 협력사 유형에 속해야 합니다. 실제 인수에서는 회사가 정한 공동 공급·대리점 예외에 맞춰 개수와 클래스 조건을 정합니다.

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

ex:PurchaseShape
  a sh:NodeShape ;
  sh:targetNode ex:PurchaseA ;
  sh:property [
    sh:path ex:supplier ;
    sh:minCount 1 ;
    sh:maxCount 1 ;
    sh:nodeKind sh:IRI ;
    sh:class ex:Supplier
  ] .
가상 입력관측 결과확인할 지점
유형이 등록된 협력사 IRI적합식별자와 유형 매핑
같은 주소를 따옴표로 감싼 문자열부적합, 종류·유형원천 값을 IRI로 매핑하는 규칙
같은 주소를 xsd:anyURI로 표시한 값부적합, 종류·유형리터럴 자료형과 노드 종류
협력사 유형이 붙은 빈 노드부적합, 종류공통 식별자가 필요한 관계인지
협력사 속성 누락부적합, 최소 개수원천 누락·매핑 누락
유형 정보가 없는 협력사 IRI부적합, 유형협력사 유형이 검사 그래프에 있는지
하위 클래스 유형과 상위 관계가 있는 IRI적합유형과 하위 클래스 관계
유형이 등록된 서로 다른 협력사 IRI 둘부적합, 최대 개수업무에서 합의한 참조 개수
2026년 11월 13일 pySHACL 0.31.0에서 추론 옵션을 끄고 가상 그래프 8건을 실행했습니다. 적합 여부와 검증 보고서의 제약 유형을 대조했습니다.

적합 결과로 어디까지 확인할 수 있나요?#

협력사 유형이 하위 클래스로 기록되고 상위 관계가 검사 그래프에 있으면 sh:class는 그 관계를 따라 소속을 판정합니다. 표의 가상 배급사는 협력사 하위 클래스로 연결돼 적합했습니다. 클래스 목록을 다른 그래프에 따로 보관한다면 검증기에 어떤 범위가 들어가는지 합의해야 합니다. 검사 그래프에 유형 근거가 빠지면 실제 원장에 등록된 협력사도 부적합으로 나올 수 있습니다.

적합 결과를 받으면 연결된 IRI와 유형을 확인할 수 있습니다. 협력사 원장에 같은 식별자가 실제로 있는지, 올바른 거래처를 연결했는지 확인하려면 원장 식별자와 별도로 대조합니다. 발주가 검사 대상 자체에서 빠졌는지 보려면 대상 명부와 실행 내역을 비교합니다. 그 절차는 SHACL 검증 대상 누락 점검에서 이어 볼 수 있습니다.

외부 공유나 재처리 없이 한 그래프 안에서만 익명 노드를 사용할 업무라면 빈 노드를 허용하는 선택도 가능합니다. 여러 시스템에서 같은 대상을 대조하는 관계라면 식별자 발급과 매핑부터 검수하세요. 매핑·클래스·검증 그래프 범위가 바뀌면 같은 가상 표본을 다시 실행해 이전 결과와 비교합니다.

표준과 실행 결과는 어디서 확인하나요?#

  • W3C SHACL 권고안, 2017년 7월 20일 공개, 2026년 11월 13일 확인. 클래스·노드 종류·개수 제약의 기준입니다.
  • W3C SHACL 1.2 Core 작업 초안, 2026년 11월 2일 공개, 11월 13일 확인. 이 글의 실행 예시는 2017 권고안에 있는 제약을 사용합니다.
  • pySHACL 0.31.0 릴리스, 2026년 1월 16일 공개, 11월 13일 확인. 표는 명시한 버전에서 가상 입력의 검증 결과만 기록했습니다.

알파카랩스는 공개 서비스 안내에서 개체 식별 기준, 원천 매핑, 관계 제약을 합의한 샘플로 검토한다고 설명합니다. 이 글의 표는 가상 발주를 이용한 검수 예시입니다. 온톨로지·지식그래프 구축 안내

SHACL 참조 타입 검수 FAQ#

같은 주소가 화면에 보이는데 왜 부적합인가요?

따옴표로 저장한 주소는 RDF 리터럴입니다. IRI를 요구하는 관계라면 화면 표시와 별개로 그래프의 노드 종류를 검사합니다.

xsd:anyURI를 쓰면 문자열이 IRI로 바뀌나요?

xsd:anyURI는 리터럴의 자료형을 나타냅니다. 그 값을 RDF 관계의 IRI로 저장할지 여부는 매핑에서 정합니다.

IRI 형식이면 협력사 유형도 통과하나요?

노드 종류와 클래스는 별도 조건입니다. 올바른 IRI라도 검사 그래프에 협력사 유형이나 해당 하위 클래스 소속 근거가 없으면 클래스 제약에서 위반이 나옵니다.

협력사 참조가 누락됐는지는 어떻게 확인하나요?

필수 관계에는 sh:minCount를 둡니다. 정확히 하나가 필요하면 sh:maxCount도 둡니다. 개수 제약은 값 노드가 0개인 누락과 초과 참조를 구분합니다. 빈 문자열이 저장되면 값 노드가 1개로 계산됩니다.

sh:class 적합이면 원장에도 있는 협력사인가요?

클래스 소속은 검사 그래프에서 확인한 결과입니다. 원장 등록 여부와 올바른 매칭은 원장 식별자와 원천 기록을 대조해 확인합니다.

비식별 관계 표본으로 인수 범위를 정합니다#

올바른 IRI, 주소 문자열, 유형 누락을 대표하는 비식별 표본과 각 표본의 기대 결과를 준비하면 인수 기준을 합의할 수 있습니다.

관계 데이터의 인수 기준을 정리합니다

첫 범위 협의에서 비식별 관계 표본과 기대 결과로 인수표를 정리합니다. 소요 시간은 데이터와 검수 범위를 확인한 뒤 협의합니다.

참조 타입 인수표 초안 협의