SHACL 1.2 코어

W3C 작업 초안

이 문서에 대한 자세한 정보
이 버전:
https://www.w3.org/TR/2026/WD-shacl12-core-20260630/
최신 게시 버전:
https://www.w3.org/TR/shacl12-core/
최신 편집자 초안:
https://w3c.github.io/data-shapes/shacl12-core/
이력:
https://www.w3.org/standards/history/shacl12-core/
커밋 이력
테스트 스위트:
https://w3c.github.io/data-shapes/data-shapes-test-suite/
최신 권고안:
https://www.w3.org/TR/2017/REC-shacl-20170720/
편집자:
(TopQuadrant, Inc.)
(TopQuadrant, Inc.)
(Inria)
(옥스퍼드 대학교)
이전 편집자:
Dimitris Kontokostas
피드백:
GitHub w3c/data-shapes (풀 리퀘스트, 새 이슈, 열린 이슈)
public-shacl@w3.org 제목 줄 [shacl12-core] 포함 (아카이브)

초록

이 문서는 SHACL의 코어를 정의합니다.

SHACL, 즉 Shapes Constraint Language는 RDF 그래프의 구조를 설명하기 위한 언어입니다. SHACL은 클래스와 이러한 클래스의 인스턴스가 가질 수 있는 속성을 정의하는 데 사용할 수 있습니다. 클래스와 인스턴스보다 더 일반적으로, SHACL은 셰이프라는 개념을 도입하여 RDF 노드와 에지의 구조에 대한 제약을 형식적으로 지정할 수 있게 합니다. SHACL 셰이프 자체는 셰이프 그래프라고 하는 RDF 그래프에 표현됩니다. 셰이프 그래프가 설명하는 RDF 그래프를 데이터 그래프라고 합니다.

SHACL은 검증, 추론, 도메인 모델링, 다른 에이전트에 정보를 제공하기 위한 온톨로지 생성, 사용자 인터페이스 구축, 코드 생성, 데이터 통합 등 다양한 목적으로 사용할 수 있습니다.

이 문서의 상태

이 섹션은 이 문서가 게시된 시점의 상태를 설명합니다. 현재 W3C 발행물 목록과 이 기술 보고서의 최신 개정판은 W3C 표준 및 초안 색인에서 확인할 수 있습니다.

이 문서는 Data Shapes Working Group권고안 트랙을 사용하여 작업 초안으로 게시했습니다.

작업 초안으로 게시되었다고 해서 W3C와 그 회원의 승인을 의미하지는 않습니다.

이 문서는 초안 문서이며 언제든지 다른 문서로 업데이트, 대체 또는 폐기될 수 있습니다. 이 문서를 진행 중인 작업 이외의 것으로 인용하는 것은 부적절합니다.

이 문서는 W3C 특허 정책에 따라 운영되는 그룹에 의해 작성되었습니다. W3C는 그룹의 산출물과 관련하여 이루어진 모든 특허 공개의 공개 목록을 유지합니다. 해당 페이지에는 특허를 공개하는 방법에 대한 지침도 포함되어 있습니다. 본인이 보기에 필수 청구항을 포함하는 특허에 대한 실제 지식을 가진 개인은 W3C 특허 정책 제6절에 따라 해당 정보를 공개해야 합니다.

이 문서는 2025년 8월 18일 W3C 프로세스 문서의 적용을 받습니다.

SHACL 명세

이 명세는 SHACL 1.2 명세군의 일부입니다. 이에 대한 더 자세한 소개는 SHACL 1.2 개요를 참조하십시오.

명세는 다음과 같습니다:

작업 초안:

SHACL 1.2 Core
SHACL의 코어를 정의합니다
SHACL 1.2 SPARQL 확장
SHACL의 SPARQL 관련 확장을 정의합니다
SHACL 1.2 노드 표현식
SHACL에서 포커스 노드를 결정하는 데 사용되는 그래프 표현식을 정의합니다
SHACL 1.2 규칙
SHACL의 규칙 기반 추론 방법을 정의합니다
SHACL 1.2 UI
사용자 인터페이스 생성을 위한 SHACL의 사용을 정의합니다
SHACL 1.2 프로파일링
SHACL 데이터를 포함한 데이터 프로파일링에 SHACL을 사용하는 방법을 정의합니다

작업 그룹 노트 초안:

SHACL 1.2 개요
SHACL 명세 집합을 개괄합니다
SHACL 1.2 Compact Syntax
SHACL 개념을 표현하기 위한 RDF 구문을 정의합니다
참고

구현자는 SHACL 1.2 테스트 스위트의 테스트 사례를 성공적으로 통과함으로써 위 명세에 대한 자신의 적합성 수준을 부분적으로 확인할 수 있습니다. 그러나 테스트 스위트의 모든 테스트를 통과한다고 해서 명세에 대한 완전한 적합성을 의미하지는 않습니다. 이는 구현이 테스트 스위트에서 테스트한 측면에 적합함을 의미할 뿐입니다.

문서 개요

소개에는 용어 섹션이 포함되어 있습니다.

섹션 2와 3은 SHACL 셰이프와 제약, 그리고 속성 경로를 다룹니다.

섹션 4는 노드 표현식을 소개하고, 섹션 5는 SHACL에서의 검증을 정의합니다.

섹션 6은 내장 SHACL Core 제약 컴포넌트를 정의하고, 섹션 7은 검증하지 않는 속성을 논의합니다.

SHACL의 구문은 RDF입니다. 이 문서의 예제는 Turtle [rdf12-turtle] 및 JSON-LD [json-ld]를 사용합니다. 실제로는 RDF/XML과 같은 다른 RDF 직렬화를 사용할 수도 있습니다. 독자는 트리플과 같은 기본 RDF 개념 [rdf12-concepts]에 익숙해야 합니다.

1. 소개

이 문서는 RDF 그래프를 설명하고 검증하기 위한 언어인 SHACL(Shapes Constraint Language)의 코어를 명세합니다. 이 섹션에서는 핵심 용어에 대한 개요와 기본 개념을 설명하는 예제를 통해 SHACL을 소개합니다.

1.1 용어

이 문서 전반에서 다음 용어가 사용됩니다.

RDF 1.2 Concepts and Abstract Syntax의 일부에 연결된 용어는 그곳에서 정의된 대로 SHACL에서 사용됩니다. SPARQL 1.2 Query Language의 일부에 연결된 용어는 그곳에서 정의된 대로 SHACL에서 사용됩니다. 하나의 연결만으로도 이 문서에서 특정 용어가 나타나는 모든 경우에 대한 정의를 제공하기에 충분합니다.

정의는 이 문서 안에서 완전합니다. 즉, 이 문서에서 어떤 상황을 참으로 만드는 규칙이 없다면 그 상황은 거짓입니다.

기본 RDF 용어
이 문서는 RDF 그래프, RDF 트리플, IRI, 리터럴, 데이터타입, 기본 방향, 빈 노드, 트리플 용어, 구상화자, RDF 그래프의 노드, RDF 용어, RDF 트리플의 주어, 술어목적어라는 용어를 RDF 1.2 Concepts and Abstract Syntax [rdf12-concepts]에서 정의한 대로 사용합니다. 언어 태그는 [BCP47]에서와 같이 정의됩니다.
속성 값과 경로
속성IRI입니다. RDF 용어 nRDF 그래프에서 속성 p에 대해 v를 가집니다. 이는 그래프에 주어 n, 술어 p, 그리고 목적어 v를 가진 RDF 트리플이 있는 경우입니다. "그래프 G에서 P의 모든 값 ..."이라는 구문은 "G에서 술어 P를 가진 트리플의 모든 목적어 ..."를 의미합니다. (이 문서에서는 어떤 RDF 용어가 그래프에서 주어진 술어에 대한 값을 가진다는 사실을 표현하기 위해 동사 지정하다 또는 선언하다가 사용되기도 합니다.)
SPARQL 속성 경로SPARQL 1.2에서와 같이 정의됩니다. RDF 용어 n은 RDF 그래프 G에서 SPARQL 속성 경로 표현식 p에 대해 값 v를 가집니다. 이는 G에 대한 SPARQL 질의 SELECT ?s ?o WHERE { ?s p' ?o }의 결과에 ?sn에, ?ov에 바인딩하는 솔루션 매핑이 있는 경우이며, 여기서 p'p에 대한 SPARQL 표면 구문입니다.
SHACL 목록
RDF 그래프 GSHACL 목록IRI 또는 빈 노드이며, 이는 rdf:nil(단, rdf:nilrdf:first 또는 rdf:rest 중 어느 것에 대해서도 을 가지지 않는 경우)이거나, G에서 속성 rdf:first에 대해 정확히 하나의 을 가지고 G에서 속성 rdf:rest에 대해 정확히 하나의 을 가지며, 그 값 또한 G의 SHACL 목록이고, 그 목록이 G에서 속성 경로 rdf:rest+의 값으로 자기 자신을 가지지 않는 경우입니다.
RDF 그래프 G에서 rdf:nil을 제외한 모든 SHACL 목록의 구성원G에서 그 목록의 rdf:first 값과, 이어서 G에서 그 목록의 rdf:rest 값의 구성원들로 이루어집니다. SHACL 목록 rdf:nil은 어떤 RDF 그래프에서도 구성원을 가지지 않습니다.
SHACL 하위 클래스, SHACL 상위 클래스
노드 SubRDF 그래프 안에서, 같은 노드 SuperSHACL 하위 클래스인 것은, 그 그래프 안에 술어가 rdfs:subClassOf트리플들의 시퀀스가 있고, 첫 번째 트리플주어Sub이며, 마지막 트리플의 목적어Super이고, 마지막을 제외한 각 트리플목적어가 다음 트리플의 주어인 경우입니다. SubSHACL 하위 클래스이고, 어떤 RDF 그래프에서 Super의 하위 클래스라면, Super는 그 그래프에서 SubSHACL 상위 클래스입니다.
SHACL 타입
RDF 용어SHACL 타입RDF 그래프에서 rdf:type에 대한 그 용어의 들의 집합과, 그 그래프에서 이러한 들의 SHACL 상위 클래스들입니다. 일부 SHACL 구현은 SHACL 하위 클래스를 결정하는 rdfs:subClassOf 트리플을 데이터 그래프뿐 아니라 셰이프 그래프에서도 질의할 수 있도록 매개변수화될 수 있습니다. 6.3 rdfs:subClassOf 트리플을 위한 그래프를 참조하십시오.
SHACL 클래스
노드들의 하위 클래스, 상위 클래스 또는 타입인 노드들이 RDF 그래프 안에 있을 때, 그 그래프의 해당 노드들은 SHACL 클래스라고 합니다.
SHACL 클래스 인스턴스
노드 nRDF 그래프 G에서 SHACL 클래스 CSHACL 인스턴스인 것은, G에서 nSHACL 타입 중 하나가 C인 경우입니다.
딥 카피
그래프 sourceGraph노드 n에 대해, 그래프 targetGraph에서 n딥 카피targetGraph 안의 n에 더해, n빈 노드인 경우, n주어로 시작하여 도달할 수 있는 트리플의 목적어 위치에 나타나는 빈 노드들을 전이적으로 순회하여 도달할 수 있는 sourceGraph의 모든 트리플입니다. 이는 Concise Bounded Description과 유사하지만 구상화는 제외합니다.

1.2 문서 규약

이 문서 안에서는 다음 네임스페이스 접두사 정의가 사용됩니다:

접두사 네임스페이스
owl: http://www.w3.org/2002/07/owl#
rdf: http://www.w3.org/1999/02/22-rdf-syntax-ns#
rdfs: http://www.w3.org/2000/01/rdf-schema#
sh: http://www.w3.org/ns/shacl#
xsd: http://www.w3.org/2001/XMLSchema#
ex: http://example.com/ns#

이 문서 안에서는 다음 JSON-LD 컨텍스트가 사용됩니다:

{
  "@context": {
    "owl": "http://www.w3.org/2002/07/owl#",
    "rdf": "http://www.w3.org/1999/02/22-rdf-syntax-ns#",
    "rdfs": "http://www.w3.org/2000/01/rdf-schema#",
    "sh": "http://www.w3.org/ns/shacl#",
    "xsd": "http://www.w3.org/2001/XMLSchema#",
    "ex": "http://example.com/ns#"
  }
}

SHACL 어휘 자체를 정의하는 그래프의 URI는 위 네임스페이스와 동일합니다. 즉, #를 포함합니다. 예를 들어 owl:imports를 통한 SHACL 어휘 참조에는 #가 포함되어야 합니다.

문서 전체에 걸쳐 Turtle, JSON-LD 및 SHACL-C의 RDF 그래프를 포함하는 색상으로 구분된 상자가 나타납니다. 이러한 Turtle 문서 조각은 위에 제시된 접두사 바인딩을 사용합니다. JSON-LD 문서 조각은 위에 제시된 컨텍스트를 사용합니다. Turtle 문서만 특정 부분을 강조 표시할 수 있습니다. SHACL-C 명세는 불안정합니다. 이 문서의 SHACL-C 문서 조각은 정보 제공용입니다

이와 같은 회색 상자는 셰이프 그래프에 적용되는 구문 규칙을 포함합니다.

true는 RDF 용어 "true"^^xsd:boolean을 나타냅니다. false는 RDF 용어 "false"^^xsd:boolean을 나타냅니다.

1.3 적합성

비규범으로 표시된 섹션뿐 아니라, 이 명세의 모든 작성 지침, 다이어그램, 예제 및 참고는 비규범입니다. 이 명세의 그 밖의 모든 내용은 규범입니다.

이 문서에서 MAY, MUST, MUST NOT, SHOULD, 및 SHOULD NOT이라는 핵심어는 여기에 표시된 것처럼 모두 대문자로 나타나는 경우에만 BCP 14 [RFC2119] [RFC8174]에 설명된 대로 해석되어야 합니다.

이 문서는 SHACL Core 언어를 정의하며, 이는 간단히 SHACL이라고도 합니다. 이 명세는 다음에 대한 적합성 기준을 설명합니다:

이 문서에는 셰이프 그래프에서 셰이프와 기타 노드가 충족해야 하는 구문 규칙이 포함되어 있습니다. 이러한 규칙은 일반적으로 셰이프는 ...를 가져야 한다, X의 값은 리터럴이다, 또는 술어 P를 가진 트리플의 모든 목적어는 IRI여야 한다와 같은 형식입니다. 이러한 규칙의 전체 목록은 부록에서 확인할 수 있습니다. 이러한 규칙 중 하나라도 위반하는 노드를 잘못 형성됨이라고 합니다. 이러한 규칙을 하나도 위반하지 않는 노드를 잘 형성됨이라고 합니다.

셰이프 그래프는 다음 조건이 모두 성립할 때 잘 형성됨입니다:

  1. 잘못 형성된 노드를 포함하지 않습니다 (즉, 모든 노드가 위에서 언급한 구문 규칙을 만족합니다).
  2. 그 가져오기 폐쇄(전이적으로 owl:imports 문을 따라 결정됨)가 OWL 2 구문 명세의 섹션 3.4 [owl2-syntax]에서 정의한 제약을 만족해야 합니다. 즉, 다음과 같은 두 셰이프 그래프를 포함하지 않아야 합니다:
    • 같은 시리즈의 서로 다른 버전인 경우 (즉, 같은 셰이프 그래프 IRI를 공유하지만 서로 다른 owl:versionIRI 값을 가짐), 또는
    • 한 그래프가 다른 그래프의 셰이프 그래프 IRI 또는 owl:versionIRI와 같은 값을 가진 owl:incompatibleWith 주석을 포함하는 경우.

잘 형성됨이 아닌 셰이프 그래프잘못 형성됨입니다.

1.4 SHACL과 RDFS 추론의 관계

SHACL은 RDF와 RDFS 어휘를 사용하지만, 완전한 RDFS 추론은 요구되지 않습니다.

그러나 SHACL 프로세서는 추론을 포함하는 RDF 그래프에 대해 동작할 MAY 있습니다 [sparql12-entailment]. 이는 SHACL 프로세서에 제출되기 전에 미리 계산된 것이거나, SHACL 처리의 일부로 즉석에서 수행된 것일 수 있습니다(이때 데이터 그래프셰이프 그래프를 수정하지 않습니다). 추론 처리를 지원하기 위해, SHACL은 주어진 셰이프 그래프에서 요구하는 추론을 나타내는 속성 sh:entailment를 포함합니다.

속성 sh:entailment은 IRI입니다. 이 속성의 일반적인 값은 [sparql12-entailment]에서 다룹니다.

SHACL 구현은 추론 체계를 지원할 MAY 있지만, 필수는 아닙니다. 셰이프 그래프가 술어가 sh:entailment이고 목적어가 E트리플을 포함하며, SHACL 프로세서가 주어진 데이터 그래프에 대해 E를 추론 체계로 지원하지 않는다면, 그 프로세서는 실패를 신호해야 MUST 합니다. 그렇지 않으면, SHACL 프로세서는 셰이프 그래프에 있는 sh:entailment의 모든 값에 대한 추론을 제공해야 MUST 하며, 추론된 모든 트리플은 검증 과정 동안 데이터 그래프에 대한 모든 질의에서 반환되어야 MUST 합니다.

2. SHACL Core 시작하기

이 섹션은 비규범입니다.

이 섹션에서는 SHACL Core의 기본을 소개하는 간단한 예제를 단계별로 살펴봅니다. 데이터가 어떤 모습이어야 하는지 설명하는 방법과, SHACL 프로세서가 해당 데이터가 그 설명을 충족하는지 확인하는 방법을 배우게 됩니다.

2.1 사용 사례

여러 엔터티(Alice, Bob, Calvin)가 있고, 컴퓨터나 다른 사람에게 다음을 설명하고 싶다고 생각해 봅시다.

  1. 이러한 엔터티의 타입인 ex:Person이라는 클래스가 있습니다.
  2. ex:Person의 모든 인스턴스는 최대 하나의 사회 보장 번호(SSN)를 가지며, 그 SSN은 올바른 형식의 텍스트(예: 123-45-6789)여야 합니다.
  3. ex:Person의 모든 인스턴스는 하나 이상의 회사에서 일할 수 있지만, 해당 회사는 데이터에서 ex:Company로 타입 지정되어야 합니다.
  4. ex:Person에는 SSN (ex:ssn), 근무 소속(ex:worksFor), 그리고 필수 타입 지정 (rdf:type) 외의 다른 속성은 허용되지 않습니다.

2.2 샘플 데이터(데이터 그래프)

다음은 설명하고 검증하려는 데이터입니다:

2.3 셰이프와 클래스 작성(셰이프 그래프)

다음은 관심 도메인을 표현하는 방법을 보여 주는 자체 완결적인 예제입니다. SHACL 용어로 이것은 셰이프 그래프라고 하지만, 이것을 도메인 모델 또는 온톨로지로 생각할 수도 있습니다.

2.4 검증 실행 (검증 보고서)

셰이프 그래프를 사용하여 데이터 그래프에 대해 SHACL 검증을 실행하면, 검증기는 우리가 작성한 제약에 대해 각 Person을 검사합니다.

쉬운 영어로 말하면, 검증기는 다음을 발견합니다:

다음은 이 예제에 대한 SHACL 검증 보고서가 어떻게 보일 수 있는지를 보여 줍니다(읽기 쉽도록 단순화됨):

보고서 읽는 방법:

2.5 셰이프와 클래스의 구문 변형

SHACL은 주로 셰이프를 표현하도록 설계되었지만, RDF Schema 네임스페이스에서 rdfs:Classrdfs:subClassOf 같은 용어와 개념도 빌려옵니다. 어떤 사람들은 위의 원래 예제처럼 ex:Personex:PersonShape를 별도 엔터티로 두어 이러한 개념을 분리해 두는 것을 선호합니다. 그러나 이들을 더 밀접하게 결합하고 sh:ShapeClass를 사용하여 클래스와 셰이프를 동시에 선언하는 것도 가능합니다.

또한 때로는 속성 셰이프가 빈 노드로 선언되는 것을 볼 수 있으며, IRI가 아닐 수도 있습니다. 이는 더 간결한 표기법이지만, 예를 들어 다른 그래프가 노드 셰이프를 재사용하면서 속성 셰이프를 비활성화하려는 경우처럼, 외부에서 해당 속성 셰이프를 쉽게 참조할 수 없다는 의미입니다.

다음 Turtle 예제는 이러한 두 가지 구문 변형이 실제로 어떻게 쓰이는지 보여 줍니다.

2.6 몇 가지 SHACL 용어 소개

위의 셰이프 선언을 사용하여 SHACL에서 사용하는 형식적 용어 중 일부를 소개할 수 있습니다. 이는 이 명세의 나머지 부분을 읽는 데 도움이 될 수 있습니다.

셰이프 ex:PersonShape대상ex:Person 클래스의 모든 SHACL 인스턴스 집합입니다. 이는 sh:targetClass 속성을 사용하여 지정됩니다. 검증 중에 이러한 대상 노드는 해당 셰이프의 포커스 노드가 됩니다. 셰이프 ex:PersonShape노드 셰이프이며, 이는 포커스 노드에 적용된다는 뜻입니다. 이 셰이프는 예를 들어 sh:closedsh:ignoredProperties 매개변수를 사용하여 포커스 노드에 대한 제약을 선언합니다. 또한 노드 셰이프sh:property 속성을 사용하여 두 개의 다른 제약을 선언하며, 각각은 속성 셰이프에 의해 뒷받침됩니다. 이러한 속성 셰이프sh:datatypesh:maxCount와 같은 매개변수를 사용하여 추가 제약을 선언합니다.

일부 속성 셰이프속성 값의 여러 측면을 제한하기 위해 여러 제약 컴포넌트의 매개변수를 지정합니다. 예를 들어 ex:ssn에 대한 속성 셰이프에서는 세 개의 제약 컴포넌트의 매개변수가 사용됩니다. 이러한 제약 컴포넌트매개변수sh:datatype, sh:patternsh:maxCount입니다. 각 포커스 노드에 대해 ex:ssn속성 값은 세 컴포넌트 모두에 대해 검증됩니다.

3. 셰이프와 제약

다음 소개는 비규범입니다.

다음 비공식 다이어그램은 SHACL 어휘의 일부 핵심 클래스에 대한 개요를 제공합니다. 각 상자는 클래스를 나타냅니다. 클래스 이름 아래의 상자들은 이들 클래스의 인스턴스가 가질 수 있는 자주 사용되는 속성의 작은 부분집합과 그 값 타입을 나열합니다. 화살표는 rdfs:subClassOf 트리플을 나타냅니다.

sh:targetClass : rdfs:Class
sh:targetObjectsOf : rdf:Property
sh:targetSubjectsOf : rdf:Property
sh:deactivated : xsd:boolean
sh:message : text
sh:severity : sh:Severity
클래스 다이어그램 화살표
sh:closed : xsd:boolean 또는 sh:ByTypes
sh:or, sh:and, sh:xone : rdf:List
sh:not : sh:Shape
sh:property : sh:PropertyShape
sh:minCount, sh:maxCount : xsd:integer
sh:minLength, sh:maxLength : xsd:integer
sh:class, sh:datatype : rdfs:Resource 또는 rdf:List of rdfs:Resources
sh:node : sh:NodeShape
sh:name : xsd:string 또는 rdf:dirLangString 또는 rdf:langString
sh:values : any
sh:group : sh:PropertyGroup
sh:path : rdfs:Resource

SHACL 어휘의 Turtle 직렬화에는 완전한 SHACL 어휘가 포함되어 있습니다.

3.1 셰이프

셰이프IRI 또는 빈 노드 s로, 셰이프 그래프에서 다음 조건 중 하나 이상을 충족합니다:

위의 정의에는 잘 형성된 셰이프의 모든 구문 규칙이 포함되어 있지는 않다는 점에 유의하십시오. 그러한 규칙은 문서 전체에서 찾을 수 있으며 부록 A. SHACL 구문 규칙 요약에 정리되어 있습니다. 예를 들어, sh:targetClass의 값으로 리터럴을 가지는 셰이프는 잘못 형성된 것입니다.

비공식적으로, 셰이프는 속성의 과 포커스 노드의 다른 특성을 바탕으로 포커스 노드를 검증하는 방법을 결정합니다. 예를 들어, 셰이프는 포커스 노드가 IRI여야 한다는 조건이나, 포커스 노드가 어떤 속성에 대해 특정 값을 가지고 그 속성에 대해 최소 개수의 값도 가져야 한다는 조건을 선언할 수 있습니다.

SHACL Core 언어는 두 가지 타입의 셰이프를 정의합니다:

sh:Shape는 SHACL 어휘에서 이 두 셰이프 타입의 SHACL 상위 클래스입니다. 그 하위 클래스인 sh:NodeShapesh:PropertyShape는 각각 노드 셰이프와 속성 셰이프의 SHACL 타입으로 사용할 수 있습니다.

3.1.1 제약, 매개변수 및 제약 컴포넌트

셰이프는 제약 컴포넌트매개변수를 사용하여 제약을 선언할 수 있습니다.

제약 컴포넌트IRI입니다. 각 제약 컴포넌트에는 하나 이상의 필수 매개변수가 있으며, 각각은 속성입니다. 각 제약 컴포넌트에는 0개 이상의 선택 매개변수가 있으며, 각각은 속성입니다. 제약 컴포넌트의 매개변수는 그 필수 매개변수와 선택 매개변수를 합한 것입니다.

예를 들어, 컴포넌트 sh:MinCountConstraintComponent매개변수 sh:minCount를 선언하여, 노드가 특정 속성에 대해 최소 개수 이상의 을 가져야 한다는 제한을 나타냅니다.

제약 컴포넌트 C필수 매개변수 p1, ... pn을 가질 때, 셰이프 s셰이프 그래프 SG 안에서 pi에 대해 vi으로 가질 때, sSG에서 필수 매개변수 값 <p1,v1>, ... <pn,vn>을 가지고 C라는 종류를 가지는 제약선언합니다. 선택 매개변수가 있는 제약 컴포넌트의 경우, 제약 선언은 해당 컴포넌트의 모든 필수 및 선택 매개변수에 대해 셰이프가 가지는 으로 구성됩니다.

일부 제약 컴포넌트는 단일 매개변수만 선언합니다. 예를 들어 sh:ClassConstraintComponent에는 단일 매개변수 sh:class가 있습니다. 이러한 매개변수는 같은 셰이프에서 여러 번 사용할 수 있으며, 이러한 매개변수의 각 은 개별 제약을 선언합니다. 그러한 선언의 해석은 논리곱, 즉 모든 제약이 적용된다는 것입니다. 다음 예제는 ex:customer의 값이 ex:Customerex:Person 모두의 SHACL 인스턴스여야 함을 지정합니다.

sh:PatternConstraintComponent와 같은 일부 제약 컴포넌트는 하나보다 많은 매개변수를 선언합니다. 이러한 컴포넌트의 매개변수 중 하나라도 둘 이상의 값을 가지는 셰이프는 잘못 형성된 것입니다.

이 구문 규칙을 우회하는 한 가지 방법은 다음 예제에 설명된 것처럼 제약을 여러 (속성) 셰이프에 분산하는 것입니다.

제약 컴포넌트는 검증기와 연결되며, 이 검증기는 매개변수가 데이터를 검증하는 데 어떻게 사용되는지에 대한 지침(예: SPARQL 질의로 표현됨)을 제공합니다. RDF 용어셰이프에 대해 검증하는 것은, 셰이프가 해당 제약컴포넌트의 모든 필수 매개변수에 대해 을 가지는 각 제약에 대해, 해당 컴포넌트와 연결된 검증기를 사용하여 그 용어를 검증하는 것을 포함합니다.

SHACL Core에 포함된 제약 컴포넌트 목록은 섹션 4에 설명되어 있습니다. SHACL-SPARQL은 SPARQL 기반의 추가 제약 컴포넌트를 선언하는 데 사용할 수 있습니다.

3.1.2 포커스 노드

데이터 그래프의 트리플을 사용하여 셰이프에 대해 검증되는 RDF 용어포커스 노드라고 합니다.

이 섹션의 나머지 부분은 비규범입니다.

셰이프에 대한 포커스 노드 집합은 다음과 같이 식별될 수 있습니다:

3.1.3 대상

셰이프 그래프에서 셰이프대상 선언셰이프주어로 하고, 이 문서에서 설명하는 특정 속성 (예: sh:targetClass)을 술어로 하는 트리플입니다. 또한 sh:shape 트리플데이터 그래프에서 대상을 선언할 수 있습니다. 대상 선언은 셰이프에 대한 포커스 노드를 생성하는 데 사용할 수 있습니다. 대상 선언대상은 이 섹션의 나머지 부분에서 설명하는 규칙을 데이터 그래프에 적용하여 생성되는 RDF 용어들의 집합입니다. 셰이프의 대상은 그 셰이프에 대해 선언된 개별 대상들이 생성하는 모든 RDF 용어의 합집합입니다.

SHACL Core에는 다음 종류의 대상이 포함됩니다:

이 소개의 나머지 부분은 비규범입니다.

대상이 생성한 RDF 용어는 데이터 그래프에 노드로 존재할 필요가 없습니다. 해당 셰이프의 검증 프로세스에 포커스 노드가 직접 입력으로 제공될 때마다 셰이프의 대상은 무시됩니다. 여기에는 셰이프가 sh:node와 같은 셰이프를 기대하는 제약 매개변수 중 하나의 값이고, sh:NodeConstraintComponent와 같은 해당 제약 컴포넌트의 검증 중에 포커스 노드가 결정되는 경우가 포함됩니다. 이러한 경우, 제공된 포커스 노드는 셰이프의 대상 안에 있을 필요가 없습니다.

3.1.3.1 노드 대상 (sh:targetNode)

노드 대상sh:targetNode 술어를 사용하여 지정됩니다. 셰이프에서 sh:targetNode의 각 은 잘 형성된 노드 표현식입니다.

텍스트 정의
s셰이프이고 셰이프 그래프 SG 안에 있으며, sSG에서 sh:targetNode에 대한 expr을 가진다면, evalExpr(expr, data graph, s, {})출력 노드포커스 그래프로서 데이터 그래프 DG에 대한 대상입니다.

이 섹션의 나머지 부분은 비규범입니다.

아래 예제 데이터에서는 ex:Alice만 제공된 셰이프의 대상입니다:

3.1.3.2 클래스 기반 대상(sh:targetClass)

클래스 대상sh:targetClass 술어로 지정됩니다. 셰이프에서 sh:targetClass의 각 값은 IRI입니다.

텍스트 정의
s가 셰이프이고 셰이프 그래프 SG 안에 있으며, sSG에서 sh:targetClass에 대한 c를 가진다면, 데이터 그래프 DG에서 cSHACL 인스턴스 집합은 SGs에 대해 DG에서 온 대상입니다.

이 섹션의 나머지 부분은 비규범입니다.

이 예제에서는 ex:Aliceex:Bob만 포커스 노드입니다. SHACL 인스턴스 정의에 따르면, 클래스 계층을 따라가기 위해 필요한 모든 rdfs:subClassOf 선언은 데이터 그래프에 존재해야 합니다. 그러나 ex:Person a rdfs:Class 트리플은 어느 그래프에도 존재할 필요가 없습니다.

다음 예제에서는 선택된 포커스 노드가 ex:Who뿐입니다.

rdfs:subClassOf 트리플은 셰이프 그래프에서 질의될 수도 있다는 점에 유의하십시오 (6.3 rdfs:subClassOf 트리플을 위한 그래프 참조). 이 경우 위 예제의 rdfs:subClassOf 트리플은 데이터 그래프에 있을 필요가 없습니다.

3.1.3.3 암시적 클래스 대상과 sh:ShapeClass

비공식적으로, 셰이프 그래프에서 어떤 셰이프클래스로도 선언되어 있다면, 이 클래스의 모든 SHACL 인스턴스는 해당 셰이프의 대상입니다.

s가 RDF 그래프 G에서 sh:NodeShape 또는 sh:PropertyShapeSHACL 인스턴스이고, sG에서 rdfs:ClassSHACL 인스턴스이기도 하며, sIRI가 아니라면 sG에서 잘못 형성된 셰이프입니다.

텍스트 정의
s셰이프 그래프 SG에서 sh:NodeShape 또는 sh:PropertyShapeSHACL 인스턴스이고, sSG에서 rdfs:ClassSHACL 인스턴스이기도 하다면, 데이터 그래프 DG에서 sSHACL 인스턴스 집합은 SGs에 대해 DG에서 온 대상입니다.

SHACL 네임스페이스에는 암시적 클래스 대상 패턴을 위한 구문적 축약으로 사용할 수 있는 전용 클래스 sh:ShapeClass가 포함되어 있습니다.

텍스트 정의
클래스 sh:ShapeClasssh:NodeShaperdfs:Class 모두의 rdfs:subClassOf입니다. s셰이프 그래프 SG에서 sh:ShapeClassSHACL 인스턴스라면, 데이터 그래프 DG에서 sSHACL 인스턴스 집합은 SGs에 대해 DG에서 온 대상입니다.

일부 SHACL을 알지 못하는 구현은 sh:ShapeClassrdfs:Class의 하위 클래스라고 이해하지 못할 수 있음을 염두에 두십시오. 따라서 sh:ShapeClass를 사용하는 그래프에는 owl:imports sh: 문을 포함하는 것이 권장됩니다(필수는 아님).

이 섹션의 나머지 부분은 비규범입니다.

다음 예제에서 ex:Alice셰이프 그래프에서 클래스이면서 셰이프인 ex:PersonSHACL 인스턴스이기 때문에 포커스 노드입니다.

위 예제의 다음 변형에서는 ex:Personsh:ShapeClass의 인스턴스로 선언되며, 해석은 동일합니다.

3.1.3.4 주어 대상(sh:targetSubjectsOf)

주어 대상sh:targetSubjectsOf 술어로 지정됩니다. 셰이프에서 sh:targetSubjectsOfIRI입니다.

텍스트 정의
s가 셰이프이고 셰이프 그래프 SG 안에 있으며, sSG에서 sh:targetSubjectsOf에 대한 p를 가진다면, 데이터 그래프 DG에서 p술어로 가지는 트리플의 주어인 노드들의 집합은 SGs에 대해 DG에서 온 대상입니다.

이 섹션의 나머지 부분은 비규범입니다.

위 예제에서는 ex:Alice만 주어진 셰이프에 대해 검증됩니다. 이는 ex:knows술어로 가지는 트리플주어이기 때문입니다.

3.1.3.5 목적어 대상(sh:targetObjectsOf)

목적어 대상sh:targetObjectsOf 술어로 지정됩니다. 셰이프에서 sh:targetObjectsOfIRI입니다.

텍스트 정의
s가 셰이프이고 셰이프 그래프 SG 안에 있으며, sSG에서 sh:targetObjectsOf에 대한 p를 가진다면, 데이터 그래프 DG에서 p술어로 가지는 트리플의 목적어인 노드들의 집합은 SGs에 대해 DG에서 온 대상입니다.

이 섹션의 나머지 부분은 비규범입니다.

위 예제에서는 ex:Bob만 주어진 셰이프에 대해 검증됩니다. 이는 ex:knows술어로 가지는 트리플목적어이기 때문입니다.

3.1.3.6 Where 대상 (sh:targetWhere)

where 대상sh:targetWhere 술어로 지정됩니다. 셰이프에서 sh:targetWhere의 각 값은 잘 형성된 셰이프입니다.

텍스트 정의
s가 셰이프이고 셰이프 그래프 SG 안에 있으며, sSG에서 sh:targetWhere에 대한 w를 가진다면, 데이터 그래프 DG 안에서 w부합하는 노드의 집합은 SGs에 대해 DG에서 온 대상입니다.

이 섹션의 나머지 부분은 비규범입니다.

이 예제에서 ex:Bobex:AdultPerson의 포커스 노드입니다. 이는 그가 sh:targetWhere 셰이프가 정의한 두 제약에 부합하기 때문입니다. sh:class 제약에 따라, 그는 ex:PersonSHACL 인스턴스이고 그의 ex:age는 18 이상입니다. 그러나 ex:AdultPerson 셰이프가 모든 성인은 ex:votedFor에 대한 하나의 값을 가져야 한다고 명시하므로, ex:Bobex:AdultPerson에 부합하지 않습니다.

참고

sh:targetWhere는 셰이프에 대해 필요충분조건을 제공하는 "정의"로 해석될 수 있다는 점에 유의하십시오. 따라서 예를 들어 주어진 조건 집합을 충족하는 모든 노드를 수집하는 "분류" 작업에 잠재적으로 사용할 수 있습니다.

참고

주의할 점으로, where 대상 계산의 성능은 구현마다 다를 수 있습니다. 최악의 경우, 엔진은 데이터 그래프의 모든 노드를 하나씩 필터링하기 위해 순회해야 합니다.

3.1.3.7 명시적 셰이프 대상(sh:shape)

명시적 셰이프 대상sh:shape 술어를 사용하여 지정됩니다. sh:shape의 각 IRI입니다.

텍스트 정의
s셰이프이고 셰이프 그래프 안에 있으며, n데이터 그래프노드라고 합시다. n데이터 그래프에서 sh:shape에 대해 s를 가진다면, ns대상입니다.

이 섹션의 나머지 부분은 비규범입니다.

참고

sh:shapesh:targetNode와 다르지만, 둘 다 개별 노드를 셰이프에 연결하는 데 사용할 수 있습니다. sh:shape은 특정 주어 노드에서 목적어 셰이프로 가리킵니다. 또한 sh:targetNode 트리플은 셰이프 그래프에서 질의되는 반면, sh:shape 트리플은 데이터 그래프에 있을 것으로 기대됩니다.

아래 예제 데이터에서는 ex:Alice만 제공된 셰이프의 대상입니다:

3.1.4 셰이프 또는 제약의 심각도 선언

셰이프는 셰이프 그래프에서 속성 sh:severity에 대해 하나의 을 지정할 수 있습니다. sh:severity의 각 값은 IRI입니다.

셰이프별 심각도를 선언하는 것 외에도, 속성 sh:severity셰이프주어이고 제약매개변수 중 하나가 술어인 트리플의 구상화자에도 사용할 수 있습니다.

T셰이프 안의 제약을 나타내는 트리플들의 집합이라고 합시다. 셰이프 그래프T에 있는 트리플들의 구상화자에서 속성 sh:severity에 대해 최대 하나의 을 지정할 수 있습니다.

sh:severity의 값을 심각도라고 합니다. SHACL은 심각도를 나타내기 위해 아래 표에 나열된 IRI를 포함합니다. 이들은 SHACL 어휘에서 sh:Severity의 SHACL 인스턴스로 선언됩니다.

심각도 설명
sh:Trace 제약 위반이 아닌 추적 메시지입니다.
sh:Debug 제약 위반이 아닌 디버그 메시지입니다.
sh:Info 정보성 메시지를 나타내는 중요하지 않은 제약 위반입니다.
sh:Warning 경고를 나타내는 중요하지 않은 제약 위반입니다.
sh:Violation 제약 위반입니다.

이 섹션의 나머지 부분은 비규범입니다.

검증 프로세스는 적합성 검사에 따라 sh:severity의 값을 처리합니다. 또한 사용자 인터페이스 도구는 이 값을 사용하여 검증 결과를 분류할 수 있습니다. sh:severity의 값은 SHACL 프로세서가 검증 결과의 sh:resultSeverity 필드를 채우는 데 사용됩니다. 검증 결과의 심각도에 관한 섹션을 참조하십시오. 어떤 IRI도 심각도로 사용할 수 있습니다.

모든 셰이프와 제약에 대해, sh:severity가 지정되지 않으면 sh:Violation이 기본값입니다. 다음 예제는 이를 설명합니다.

다음 예제는 위 셰이프 그래프의 변형이지만, 구상화를 사용하여 개별 제약의 심각도를 지정합니다:

3.1.5 셰이프 또는 제약에 대한 메시지 선언

셰이프는 속성 sh:message에 대한 값을 가질 수 있습니다. sh:message의 값은 xsd:string, rdf:dirLangString, rdf:langString 또는 rdf:HTML 데이터타입을 가진 리터럴입니다. 하나의 주어는 같은 언어 태그를 가진 sh:message 값을 둘 이상 가지거나, xsd:string 데이터타입의 값을 여러 개 가져서는 안 됩니다.

셰이프가 셰이프 그래프에서 sh:message에 대한 값을 하나 이상 가지면, 그 셰이프의 결과로 생성되는 모든 검증 결과sh:resultMessage의 값으로 정확히 이러한 메시지들을 가지게 됩니다. 즉, 값은 셰이프 그래프에서 결과 그래프로 복사됩니다.

셰이프별 메시지를 선언하는 것 외에도, 속성 sh:message셰이프주어이고 제약매개변수 중 하나가 술어인 트리플의 구상화자에도 사용할 수 있습니다.

T셰이프 안의 제약을 나타내는 트리플들의 집합이라고 합시다. 셰이프 그래프T에 있는 트리플들의 구상화자에서 속성 sh:message에 대해 최대 하나의 을 지정할 수 있습니다.

이 섹션의 나머지 부분은 비규범입니다.

sh:resultMessage의 값이 채워지는 방식에 대한 자세한 내용은 검증 결과의 sh:resultMessage에 관한 섹션을 참조하십시오.

이전 섹션의 예제는 이 메커니즘을 사용하여 두 번째 검증 결과에 두 개의 메시지를 제공합니다. 다음 예제는 구상화를 사용하여 메시지를 선언하는 변형입니다.

3.1.6 셰이프와 제약 비활성화

셰이프는 속성 sh:deactivated에 대해 최대 하나의 값을 가질 수 있습니다. sh:deactivated의 값은 (유일한) 출력 노드true 또는 false 중 하나를 가져야 하는 노드 표현식입니다.

expr셰이프에서 sh:deactivated이라고 합시다. 만약 evalExpr(expr, data graph, focus node, {})true를 유일한 출력 노드로 생성한다면, 그 셰이프를 비활성화된 것이라고 합니다. 비활성화된 셰이프는 검증 중에 무시됩니다.

셰이프에 대한 모든 제약을 비활성화하는 것 외에도, 개별 제약을 비활성화할 수도 있습니다. 이는 구상화를 사용하여 수행됩니다.

셰이프주어로 가지고, sh:minCount와 같은 매개변수술어로 가지는 트리플은 속성 sh:deactivated에 대한 을 가진 구상화자를 최대 하나 가질 수 있습니다.

expr를, 셰이프주어로 가지고 매개변수술어로 가지는 트리플 위의 구상화자에서 sh:deactivated이라고 합시다. 만약 evalExpr(expr, data graph, focus node, {})true를 유일한 출력 노드로 생성한다면, 그 트리플을 사용하는 제약을 비활성화된 제약이라고 합니다. 비활성화된 제약은 검증 중에 무시됩니다.

이 섹션의 나머지 부분은 비규범입니다.

SHACL Core에서 sh:deactivated의 유일한 유효 값은 상수 리터럴 노드 표현식 truefalse입니다.

이 기능의 사용 사례에는 셰이프 재사용과 디버깅이 포함됩니다. 다른 그래프나 파일의 셰이프를 주어진 셰이프 그래프로 가져오는 시나리오에서, 현재 애플리케이션 컨텍스트에 적용되지 않는 셰이프를 제외하기 위해 가져오는 로컬 셰이프 그래프에서 sh:deactivatedtrue로 설정할 수 있습니다. 이를 통해 원저자가 한 특정 가정에 동의하지 않더라도 다른 사람이 개발한 SHACL 그래프를 재사용할 수 있습니다. 셰이프 작성자가 어떤 셰이프가 다른 사람에 의해 비활성화되거나 수정될 필요가 있을 수 있다고 예상한다면, 실제 셰이프에 빈 노드 대신 IRI를 사용하는 것이 좋은 관행입니다. 예를 들어, 셰이프 ex:PersonShape에서 속성 ex:name에 대한 속성 셰이프는 IRI ex:PersonShape-name을 가질 수 있습니다. sh:deactivated의 또 다른 일반적인 사용 사례는 셰이프 개발 및 테스트 중에 특정 셰이프를 (일시적으로) 비활성화하는 것입니다.

다음 예제는 셰이프를 비활성화하기 위해 sh:deactivated를 사용하는 방법을 설명합니다. 다른 그래프에서 셰이프를 가져오는 경우, sh:deactivated true 트리플은 가져오는 그래프에 있게 됩니다.

다음 변형은 구상화를 사용하여 같은 속성 셰이프의 다른 제약에는 영향을 주지 않고 sh:minCount 제약만 비활성화합니다.

3.2 노드 셰이프

노드 셰이프셰이프 그래프셰이프로, sh:path술어로 가지는 트리플주어가 아닌 것입니다. 노드 셰이프sh:NodeShapeSHACL 인스턴스로 선언하는 것이 권장되지만, 필수는 아닙니다. sh:NodeShapeSHACL 인스턴스는 속성 sh:path에 대한 을 가질 수 없습니다.

비공식적으로, 노드 셰이프는 포커스 노드와 관련하여 충족해야 하는 제약을 지정합니다. 속성 셰이프와 달리, 노드 셰이프는 주로 속성 값이 아니라 포커스 노드 자체에 적용됩니다.

3.3 속성 셰이프

속성 셰이프셰이프 그래프셰이프로, sh:path술어로 가지는 트리플주어인 것입니다. 셰이프는 sh:path에 대해 최대 하나의 을 가집니다. 속성 셰이프에서 sh:path잘 형성된 SHACL 속성 경로입니다.

속성 셰이프sh:PropertyShapeSHACL 인스턴스로 선언하는 것이 권장되지만, 필수는 아닙니다. sh:PropertyShapeSHACL 인스턴스는 속성 sh:path에 대해 하나의 을 가집니다.

속성 셰이프는 속성 sh:values에 대해 최대 하나의 을 가지며, 이 잘 형성된 노드 표현식입니다. 속성 셰이프는 속성 sh:defaultValue에 대해 최대 하나의 을 가지며, 이 잘 형성된 노드 표현식입니다. 속성 셰이프sh:path에 대한 술어 경로인 경우에만 sh:values 및/또는 sh:defaultValue에 대한 을 가질 수 있습니다.

비공식적으로, 속성 셰이프는 (a) sh:path를 사용하여 IRI로 지정된 주어진 속성을 직접 따르거나, (b) sh:path를 사용하여 지정된 다른 SHACL 속성 경로를 직접 따르거나, (c) sh:values를 사용하여 지정된 노드 표현식을 평가하거나, (d) 다른 값이 없을 경우 sh:defaultValue를 사용하여 지정된 노드 표현식을 평가함으로써 포커스 노드에서 도달할 수 있는 노드와 관련하여 충족해야 하는 제약을 지정합니다.

sh:valuessh:defaultValue 지원은 SHACL Core에서 필수는 아니지만, [shacl12-sparql]와 같은 확장에는 필요합니다.

잘 형성된 속성 셰이프노드 셰이프의 정의는 이 두 노드 집합을 서로소로 만든다는 점에 유의하십시오.

다음 예제는 속성 셰이프의 몇 가지 구문 변형을 설명합니다.

4. SHACL 속성 경로

속성 경로는 속성 셰이프의 값 노드를 도출하기 위해 sh:path에서 사용할 수 있습니다.

SHACL에는 다음 SPARQL 속성 경로 부분집합을 나타내기 위한 RDF 용어가 포함됩니다: PredicatePath, InversePath, SequencePath, AlternativePath, ZeroOrMorePath, OneOrMorePathZeroOrOnePath.

다음 하위 섹션은 잘 형성된 SHACL 속성 경로의 구문 규칙과 SPARQL 1.2 속성 경로로의 매핑 규칙을 함께 제공합니다. 이러한 규칙은 RDF 그래프 G에서 G의 SHACL 속성 경로인 RDF 용어 p에 대한 경로 매핑 path(p,G)을 정의합니다. 두 SHACL 속성 경로가 정확히 같은 SPARQL 속성 경로로 매핑될 때 동등한 경로로 간주됩니다.

RDF 그래프의 노드는 다음 하위 섹션의 구문 규칙 중 정확히 하나를 만족하는 경우 잘 형성된 SHACL 속성 경로 p입니다. 노드 p가 빈 노드이고 p의 어떤 경로 매핑이 직접 또는 전이적으로 p를 참조한다면, p잘 형성된 SHACL 속성 경로가 아닙니다.

다음 예제는 몇 가지 유효한 SHACL 속성 경로와 그에 대응하는 SPARQL 1.2 표현을 보여 줍니다.

4.1 술어 경로

술어 경로IRI입니다.

p술어 경로라면, path(p,G)piri로 가지는 SPARQL PredicatePath입니다.

4.2 시퀀스 경로

시퀀스 경로빈 노드로, 최소 두 개의 구성원을 가진 SHACL 목록이며, 각 구성원은 잘 형성된 SHACL 속성 경로입니다.

pG에서 목록 구성원 v1, v2, ..., vn을 가진 시퀀스 경로라면, path(p,G)path(v1,G)elt1로, v2의 목록 노드에 대한 경로 매핑 결과를 elt2로 하는 SPARQL SequencePath입니다.

비공식 참고: 이러한 SHACL 목록노드rdf:firstrdf:rest 이외의 다른 속성에 대한 을 가지지 않는 것이 좋습니다.

4.3 대안 경로

대안 경로G에서 정확히 하나의 트리플의 주어인 빈 노드입니다. 이 트리플은 sh:alternativePath를 술어로, L을 목적어로 가지며, L은 최소 두 개의 구성원을 가진 SHACL 목록이고, L의 각 구성원은 잘 형성된 SHACL 속성 경로입니다.

pG에서 대안 경로라면, 그 SHACL 목록 L의 구성원 v1, v2, ..., vn에 대해, path(p,G)path(v1,G)elt1로 가지고, 이어서 v2에 대한 AlternativePathelt2로, ..., path(vn,G)까지 이어지는 SPARQL AlternativePath입니다.

4.4 역방향 경로

역방향 경로G에서 정확히 하나의 트리플주어빈 노드입니다. 이 트리플은 sh:inversePath를 술어로 가지며, 목적어 v잘 형성된 SHACL 속성 경로입니다.

pG에서 역방향 경로라면, path(p,G)path(v,G)elt로 가지는 SPARQL InversePath입니다.

4.5 0개 이상 경로

0개 이상 경로G에서 정확히 하나의 트리플주어빈 노드입니다. 이 트리플은 sh:zeroOrMorePath술어로 가지며, 목적어 v잘 형성된 SHACL 속성 경로입니다.

pG에서 0개 이상 경로라면, path(p,G)path(v,G)elt로 가지는 SPARQL ZeroOrMorePath입니다.

4.6 1개 이상 경로

1개 이상 경로G에서 정확히 하나의 트리플주어빈 노드입니다. 이 트리플은 sh:oneOrMorePath술어로 가지며, 목적어 v잘 형성된 SHACL 속성 경로입니다.

pG에서 1개 이상 경로라면, path(p,G)path(v,G)elt로 가지는 SPARQL OneOrMorePath입니다.

4.7 0개 또는 1개 경로

0개 또는 1개 경로G에서 정확히 하나의 트리플주어빈 노드입니다. 이 트리플은 sh:zeroOrOnePath술어로 가지며, 목적어 v잘 형성된 SHACL 속성 경로입니다.

pG에서 0개 또는 1개 경로라면, path(p,G)path(v,G)elt로 가지는 SPARQL ZeroOrOnePath입니다.

5. 노드 표현식

이 섹션은 노드 표현식 개념을 소개합니다. SHACL Core는 다음 기능에서 노드 표현식을 지원합니다:

SHACL Core에만 관심 있는 독자는 일반적으로 이 섹션을 건너뛸 수 있습니다. Core는 노드 표현식으로 상수 IRI와 리터럴만 지원하므로, 노드 표현식의 사용 사례는 SHACL Core의 전통적인 사용 방식과 동일합니다.

텍스트 정의
노드 표현식은 정확히 하나의 노드 표현식 함수의 구문 규칙을 따르는 노드입니다. 각 노드 표현식 함수IRI를 그 함수 이름으로 가집니다.
노드 표현식의 평가
노드 표현식의 평가는 다음 함수로 정의됩니다. evalExpr(expr, focusGraph, focusNode, scope) -> outputNodes 여기서 노드 표현식 평가의 결과는 출력 노드라고 하는 노드들의 목록입니다(비어 있을 수 있고 중복을 포함할 수 있습니다). 평가는 평가 실패로 이어질 수도 있습니다.

SHACL Core 명세는 다음 두 하위 섹션을 기반으로 하는 노드 표현식 함수만 정확히 정의합니다. [shacl12-node-expr]는 노드 표현식의 일반적인 설계에 대한 더 많은 배경을 제공하고, 포괄적인 노드 표현식 함수 라이브러리를 포함합니다. [shacl12-sparql]와 같은 다른 명세는 빈 노드를 사용하여 추가 함수를 도입합니다. 따라서 노드 표현식은 SHACL의 확장 지점 역할을 합니다.

5.1 IRI 표현식

IRI노드 표현식함수 이름 sh:IRIExpression을 가진 IRI 표현식이라고 합니다.

RDF 그래프의 노드는 그것이 IRI라면 잘 형성된 IRI 표현식입니다.

IRI 표현식의 평가

IRI 표현식출력 노드는 정확히 노드 표현식 자체로만 구성된 목록입니다:

evalExpr(expr, focusGraph, focusNode, scope) -> [expr]

5.2 리터럴 표현식

리터럴노드 표현식함수 이름 sh:LiteralExpression을 가진 리터럴 표현식이라고 합니다.

RDF 그래프의 노드는 그것이 리터럴이라면 잘 형성된 리터럴 표현식입니다.

리터럴 표현식의 평가

리터럴 표현식출력 노드는 정확히 노드 표현식 자체로만 구성된 목록입니다:

evalExpr(expr, focusGraph, focusNode, scope) -> [expr]

6. 검증과 그래프

검증데이터 그래프셰이프 그래프를 입력으로 받아 검증 결과를 포함하는 검증 보고서를 생성합니다. 적합성 검사는 검증의 단순화된 버전으로, 불리언 결과를 생성합니다. 검증을 수행할 수 있는 시스템을 프로세서라고 하며, 동사 처리는 때때로 검증 프로세스를 가리키는 데 사용됩니다.

SHACL은 검증 보고서를 RDF 결과 그래프로 생성하는 프로세서가 사용할 수 있는 RDF 검증 보고서 어휘를 정의합니다. 이 명세는 제약 컴포넌트와 연결된 검증기의 규범적 정의에 SHACL 결과 어휘를 사용합니다. 검증 보고서 어휘의 모든 필수 속성을 생성할 수 있는 SHACL 구현만 표준에 적합합니다.

6.1 셰이프 그래프

셰이프 그래프데이터 그래프가 셰이프에 대해 검증될 수 있도록 SHACL 검증 프로세스에 셰이프와 관련 정보를 제공하는 역할을 하는 RDF 그래프입니다.

sh:ShapesGraph 클래스는 일반적으로 셰이프 그래프의 역할을 하는 그래프의 IRIrdf:type으로 사용될 MAY 있습니다.

주어진 검증에 대한 셰이프 그래프는 예를 들어 owl:imports 또는 sh:shapesGraph를 통해 여러 셰이프 그래프를 결합한 결과일 수 있습니다. 어떤 방식으로 구성되든, 검증에 사용되는 셰이프 그래프검증 프로세스 동안 고정되어 있어야 MUST 합니다. 자세한 내용은 6.5 검증을 참조하십시오.

이 섹션의 나머지 부분은 비규범입니다.

셰이프 그래프는 owl:imports 술어로 상호 참조될 수 있는 재사용 가능한 검증 모듈일 수 있습니다. 검증 전 단계로, SHACL 프로세서는 owl:imports 술어를 통해 참조된 모든 셰이프 그래프를 전이적으로 따라가고 가져와서 원래 제공된 셰이프 그래프를 확장해야 합니다. 가져온 IRI를 해석할 때, 가져온 그래프가 그 가져온 IRI를 owl:versionIRI의 목적어로 가지는 트리플을 포함한다면, 프로세서는 추가 owl:imports 문을 따라가기 위한 목적으로 그 트리플의 주어를 가져온 그래프의 셰이프 그래프 IRI로 취급해야 합니다. 형식적으로, 프로세서는 버전 IRI가 버전이 지정된 셰이프 그래프를 가져오는 데 사용될 수 있도록, 가져오기를 해석하기 위해 속성 경로 ^owl:versionIRI?/owl:imports를 반복적으로 사용해야 합니다.

다음 예제에서 셰이프 그래프는 <http://example.com/shapes/company/v2>를 가져옵니다. 프로세서가 해당 IRI에서 그래프를 가져올 때, 그 IRI가 <http://example.com/shapes/company>owl:versionIRI로 선언되어 있음을 발견합니다. 그런 다음 프로세서는 추가 owl:imports 문을 따라갈 때 해당 그래프를 식별하기 위해 <http://example.com/shapes/company>를 사용하며, 이 경우 <http://example.com/shapes/base>를 가져옵니다.

결과 그래프는 검증을 위한 불변 셰이프 그래프를 형성합니다.

참고

owl:versionIRI를 사용하여 버전이 지정된 셰이프 그래프를 가져올 때에는 호환되지 않는 버전을 가져오지 않도록 주의해야 합니다. 특히 셰이프 그래프의 가져오기 폐쇄는 같은 시리즈의 서로 다른 버전인 두 그래프나, 한 그래프가 다른 그래프에 대해 owl:incompatibleWith를 선언한 경우를 포함하지 않아야 SHOULD NOT 합니다. 이러한 셰이프 그래프는 잘못 형성된 것으로 간주됩니다. 자세한 내용은 잘 형성된 셰이프 그래프의 정의를 참조하십시오.

셰이프 선언 외에도, 셰이프 그래프는 sh:entailment 문과 같이 SHACL 프로세서를 위한 추가 정보를 포함할 수 있습니다.

6.2 데이터 그래프

어떤 RDF 그래프도 데이터 그래프가 될 수 있습니다.

sh:DataGraph 클래스는 일반적으로 데이터 그래프로 사용되는 그래프의 IRIrdf:type으로 사용될 MAY 있습니다. 다만 셰이프 그래프데이터 그래프의 역할을 할 MAY 있다는 점에 유의하십시오. 예를 들어, 셰이프 자체를 검증할 때 그렇습니다.

이 섹션의 나머지 부분은 비규범입니다.

데이터 그래프는 검증을 위한 SHACL 프로세서의 입력 중 하나입니다. SHACL 프로세서는 이를 일반 RDF 그래프로 취급하며 그 성격에 대해 아무런 가정도 하지 않습니다. 예를 들어, 메모리 내 그래프일 수도 있고 RDF 데이터셋의 명명된 그래프나 SPARQL 엔드포인트일 수도 있습니다.

SHACL은 파일 시스템, HTTP 요청 또는 RDF 데이터셋 등 어떤 수단으로 얻은 RDF 그래프와도 함께 사용할 수 있습니다. SHACL은 그래프가 어떤 RDF 수반 체계 아래에서 그래프로부터 수반된 트리플을 포함하는지 여부에 대해 아무런 가정도 하지 않습니다.

데이터 그래프는 SHACL이 클래스 대상을 올바르게 식별하고 Core SHACL 제약을 검증할 수 있도록, 데이터와 관련된 모든 온톨로지 공리, 특히 모든 rdfs:subClassOf 트리플을 포함할 것으로 기대됩니다.

참고

검증 작업의 통제되지 않은 증가를 피하기 위해 데이터 그래프의 owl:imports는 실행되지 않습니다. 여러 관련 온톨로지를 검증하려면, owl:imports 링크에 의존하지 말고 이들을 모두 SHACL 프로세서에 전달하십시오(함께 또는 하나씩).

참고

SHACL은 데이터 그래프의 owl:imports를 실행하지 않지만, 데이터 그래프 유지관리자는 owl:imports 동작을 가져오기 지시문으로 사용하는 애플리케이션을 계속 인식해야 합니다. 특히 일부 애플리케이션은 X a owl:Ontology .가 직접 존재하는 것에 구문적으로 의존하여, X owl:imports Y .Y를 로드하기 위한 지시문으로 owl:imports 문을 처리할 수 있습니다. 자세한 내용은 OWL 2 Web Ontology Language Mapping to RDF Graphs, Section 3.1.1을 참조하십시오. 따라서 X a sh:DataGraph . 형식의 문을 사용할 때에는 X a owl:Ontology .도 포함해야 합니다.

6.3 rdfs:subClassOf 트리플을 위한 그래프

SHACL의 일부 기능(예: 7.1.1 sh:class, 3.1.3.2 클래스 기반 대상 (sh:targetClass), 및 3.1.3.3 암시적 클래스 대상과 sh:ShapeClass)은 SHACL 타입 개념에 의존하여, 어떤 노드가 주어진 클래스의 SHACL 인스턴스인지 판단합니다. 기본적으로 이는 데이터 그래프에서 rdfs:subClassOfrdf:type 트리플을 조회하여 결정됩니다. 그러나 rdfs:subClassOf 트리플은 종종 인스턴스 데이터가 아니라 클래스 및/또는 셰이프 정의의 일부로 저장되므로, 일부 경우에는 이것만으로 충분하지 않습니다.

SHACL 프로세서는 true로 설정된 경우 rdfs:subClassOf 트리플이 데이터 그래프에 더해 셰이프 그래프에서도 질의되도록 SHACL 타입의 정의를 변경해야 하는 subClassOfInShapesGraph 매개변수를 제공해야 SHOULD 합니다. rdf:type 트리플은 항상 데이터 그래프에 있을 것으로 기대됩니다.

6.4 데이터 그래프를 셰이프 그래프에 연결(sh:shapesGraph)

데이터 그래프sh:shapesGraph 술어를 사용하여 SHACL 프로세서에 하나 이상의 그래프를 제안하는 데 사용되는 트리플을 포함할 수 있습니다. sh:shapesGraph의 모든 IRI입니다. 이는 데이터 그래프를 검증하는 데 사용되는 셰이프 그래프에 포함되어야 SHOULD 하는 그래프를 나타냅니다. sh:shapesGraph의 값은 owl:versionIRI의 값일 수 있으므로, 셰이프 그래프에 대해 설명한 버전 IRI에서 셰이프 그래프 IRI를 해석하는 동일한 전략이 여기에 적용됩니다.

다음 예제에서 SHACL 프로세서는 주어진 그래프를 검증할 때 ex:graph-shapes1ex:graph-shapes2 그래프(및 그 owl:imports)의 합집합을 셰이프 그래프로 사용해야 SHOULD 합니다.

6.5 검증

검증은 다음 단락에서 정의된 것처럼 어떤 입력을 검증 결과로 매핑하는 것입니다.

데이터 그래프를 셰이프 그래프에 대해 검증: 데이터 그래프셰이프 그래프가 주어졌을 때, 검증 결과셰이프 그래프의 모든 셰이프에 대해 데이터 그래프검증한 결과들의 합집합입니다.

데이터 그래프를 셰이프에 대해 검증: 데이터 그래프셰이프 그래프 안의 셰이프가 주어졌을 때, 검증 결과데이터 그래프에서 그 셰이프대상에 있는 모든 포커스 노드검증한 결과들의 합집합입니다.

포커스 노드를 셰이프에 대해 검증: 데이터 그래프 안의 포커스 노드셰이프 그래프 안의 셰이프가 주어졌을 때, 검증 결과는 그 셰이프가 선언한 모든 제약에 대해 포커스 노드검증한 결과들의 합집합입니다. 단, 셰이프비활성화된 경우에는 검증 결과가 비어 있습니다.

포커스 노드를 제약에 대해 검증: 데이터 그래프 안의 포커스 노드셰이프 그래프 안의 C라는 종류제약이 주어졌을 때, 검증 결과제약 컴포넌트 C검증기에 의해 정의됩니다. 이러한 검증기는 일반적으로 포커스 노드, 셰이프 그래프 안의 제약C에 대한 매개변수의 특정 , 그리고 그 제약을 선언한 셰이프값 노드를 입력으로 받습니다.

검증 중에는 데이터 그래프셰이프 그래프가 불변이어야 MUST 합니다. 즉, 검증 종료 시 두 그래프는 검증 시작 시의 그래프와 동일해야 MUST 합니다. SHACL 프로세서는 셰이프 그래프 또는 데이터 그래프를 구성하는 데 사용하는 그래프를 변경해서는 MUST NOT 안 되며, 이러한 그래프가 저장된 그래프의 변경을 허용하는 RDF 저장소의 일부인 경우에도 마찬가지입니다. SHACL 프로세서는 검증 결과를 포함하는 그래프와 같이 자신이 생성한 그래프를 저장할 MAY 있으며, 이 작업은 RDF 저장소의 기존 그래프를 변경할 MAY 있지만, 셰이프 그래프 또는 데이터 그래프를 구성하는 데 사용된 그래프는 변경하지 않습니다. 따라서 SHACL 처리는 멱등적입니다.

6.5.1 실패

검증적합성 검사실패로 이어질 수 있습니다. 예를 들어, 특정 SHACL 프로세서는 재귀적 셰이프를 허용하지만 데이터 내에서 루프를 감지하면 실패를 보고할 수 있습니다. 리소스 고갈로 인해 실패가 보고될 수도 있습니다. 실패는 구현별 채널을 통해 신호됩니다.

6.5.2 잘못 형성된 셰이프 그래프의 처리

셰이프 그래프잘못 형성된 노드를 포함한다면, 검증 프로세스의 결과는 정의되지 않습니다. SHACL 프로세서는 이 경우 실패를 생성해야 SHOULD 합니다. 6.7.1.4 셰이프 그래프의 구문 검사(sh:shapesGraphWellFormed)도 참조하십시오.

6.5.3 재귀적 셰이프의 처리

다음 속성은 SHACL Core의 이른바 셰이프를 기대하는 제약 매개변수입니다:

다음 속성은 SHACL Core의 이른바 목록을 받는 제약 매개변수입니다:

RDF 그래프 G 안의 셰이프 s1은, 어떤 제약 컴포넌트의 목록을 받지 않는 셰이프를 기대하는 매개변수에 대해 s2으로 가지거나, 어떤 제약 컴포넌트의 목록을 받는 셰이프를 기대하는 매개변수에 대한 구성원으로 s2를 가진 경우, G 안의 셰이프 s2참조합니다. RDF 그래프 G 안의 셰이프가 G에서 참조 관계의 전이적 폐쇄에 의해 자기 자신과 관련되어 있다면, 그 셰이프는 G에서 재귀적 셰이프입니다.

재귀적 셰이프를 사용하는 검증은 SHACL에서 정의되지 않으며 SHACL 프로세서 구현에 맡겨집니다. 예를 들어, SHACL 프로세서는 재귀 시나리오를 지원하거나 재귀를 감지할 때 실패를 생성할 수 있습니다.

이 섹션의 나머지 부분은 비규범입니다.

위의 재귀 정책은 다양한 구현 전략을 지원하기 위해 선택되었습니다. 재귀를 정의하지 않음으로써, 구현은 순환을 지원할 필요 없이 (SPARQL 엔드포인트에 대해) 정적인 SPARQL 질의 집합을 실행할 수 있도록 재귀를 지원하지 않는 선택을 할 수 있습니다. 작업 그룹은 다른 구현이 재귀를 지원할 수 있으며 일부 셰이프 그래프가 이러한 특정 특성에 의존할 수 있음을 알고 있습니다. 향후 작업, 예를 들어 W3C Community Groups에서의 작업이 재귀가 잘 정의된 특정 SHACL 방언의 정의로 이어질 것으로 기대합니다.

6.6 적합성 검사

포커스 노드는, 그 포커스 노드셰이프에 대해 검증한 결과의 집합이 불허 수준 집합의 심각도 수준을 가진 검증 결과를 포함하지 않고, 그에 의해 실패가 보고되지 않은 경우에만, 셰이프부합합니다.

불허 심각도 수준의 집합은 sh:conformanceDisallows를 술어로 하고 검증 보고서를 주어로 하는 트리플의 목적어로 정의됩니다. 검증 보고서가 이러한 트리플을 포함하지 않으면, sh:Violation, sh:Warning, 및 sh:Info가 기본값으로 설정됩니다.

적합성 검사는 주어진 포커스 노드가 주어진 셰이프부합하는 경우에만 true를 생성하고, 그렇지 않으면 false를 생성합니다.

SHACL Core의 모든 셰이프를 기대하는 제약 매개변수는 적합성 검사에 의존한다는 점에 유의하십시오. 이러한 경우, 적합성 검사의 결과를 결정하는 데 사용되는 검증 결과는 주변 검증 프로세스의 결과와 분리되며, 일반적으로 같은 검증 보고서에 포함되지 않습니다 (sh:detail의 값으로 포함될 가능성은 제외).

6.7 검증 보고서

검증 보고서검증 프로세스의 결과로, 적합성과 모든 검증 결과의 집합을 보고합니다. 검증 보고서는 이 섹션에서 정의하는 SHACL 검증 보고서 어휘로 설명됩니다. 이 어휘는 데이터 그래프의 위반을 식별하거나 수정하는 방법에 대한 지침을 제공할 수 있는 구조적 정보를 나타내는 RDF 속성을 정의합니다.

SHACL에 적합한 프로세서는 이 명세에 설명된 모든 필수 검증 결과를 가진 검증 보고서를 반환할 수 있어야 MUST 합니다. SHACL에 적합한 프로세서는 반환되는 결과 수를 제한할 수 있게 하는 선택적 인자를 지원할 MAY 있습니다. 이러한 유연성은 예를 들어 일부 대규모 데이터셋 검증 사용 사례에서 필요합니다.

다음 그래프는 셰이프 그래프에 부합하는 데이터 그래프의 검증에 대한 검증 보고서 예를 나타냅니다.

다음 그래프는 셰이프 그래프에 부합하지 않는 데이터 그래프의 검증에 대한 검증 보고서 예를 나타냅니다. sh:resultMessage의 구체적인 값은 SHACL에서 의무화하지 않으며 구현별로 간주된다는 점에 유의하십시오.

6.7.1 검증 보고서(sh:ValidationReport)

검증 프로세스의 결과는 정확히 하나의 sh:ValidationReport SHACL 인스턴스를 가진 RDF 그래프입니다. RDF 그래프는 출처 메타데이터와 같은 추가 정보를 포함할 MAY 있습니다.

6.7.1.1 적합 여부(sh:conforms)

결과 그래프의 각 sh:ValidationReport SHACL 인스턴스는 속성 sh:conforms에 대해 정확히 하나의 값을 가지며, 그 값은 xsd:boolean 데이터타입입니다. 이는 적합성 검사의 결과를 나타냅니다.

6.7.1.2 적합성-불허 집합(sh:conformanceDisallows)

결과 그래프의 각 sh:ValidationReport SHACL 인스턴스는 속성 sh:conformanceDisallows에 대해 하나 이상의 값을 가질 MAY 있습니다. sh:conformanceDisallows의 모든 값은 IRI여야 MUST 합니다.

모든 값이 결합되어 불허 심각도 수준의 집합을 정의합니다. 불허 심각도 수준 집합 안의 심각도 수준을 가진 sh:ValidationResult가 존재하면, 관련 sh:ValidationReport 인스턴스의 sh:conforms 값은 false가 되어야 MUST 합니다.

결과 그래프에 속성 sh:conformanceDisallows에 대한 값이 없으면, sh:Violation, sh:Warning, 및 sh:Info로 구성된 기본 집합이 사용되어야 MUST 합니다.

적합성-불허 집합은 검증 엔진에 의해 정의됩니다. 검증 엔진은 이 집합을 사용자 정의할 수 있는 메커니즘을 제공할 MAY 있습니다.

6.7.1.3 결과(sh:result)

검증 프로세스가 생성하는 모든 검증 결과에 대해(적합성 검사의 맥락에서 언급된 것은 제외), 결과 그래프의 sh:ValidationReport SHACL 인스턴스는 속성 sh:result에 대한 값을 가집니다. sh:result의 각 값은 클래스 sh:ValidationResultSHACL 인스턴스입니다.

6.7.1.4 셰이프 그래프의 구문 검사(sh:shapesGraphWellFormed)

SHACL 검증 엔진은 셰이프 그래프잘 형성된 것인지 엄격히 검사할 필요는 없습니다. 이러한 검사를 수행하는 구현은(예: 셰이프 그래프가 시스템에 설치될 때 또는 검증 전이나 검증 중) 이 사실을 검증 보고서의 소비자에게 알리기 위해 속성 sh:shapesGraphWellFormed를 사용해야 SHOULD 합니다. 결과 그래프의 sh:ValidationReport SHACL 인스턴스가 sh:shapesGraphWellFormed에 대한 으로 true를 가진다면, 프로세서검증 프로세스에 사용된 셰이프 그래프잘 형성된 것이라고 확신한 것입니다.

6.7.2 검증 결과(sh:ValidationResult)

SHACL은 개별 SHACL 검증 결과를 보고하기 위해 sh:ValidationResultsh:AbstractResult의 하위 클래스로 정의합니다. SHACL 구현은 예를 들어 성공적으로 완료된 제약 검사 또는 누적 결과를 보고하기 위해 sh:AbstractResult의 다른 SHACL 하위 클래스를 사용할 수 있습니다.

이 섹션의 나머지 하위 섹션에서 설명하는 모든 속성은 sh:ValidationResult에 지정될 수 있습니다. 속성 sh:focusNode, sh:resultSeveritysh:sourceConstraintComponent만 모든 검증 결과에 필수입니다.

6.7.2.1 포커스 노드 (sh:focusNode)

각 검증 결과는 속성 sh:focusNode에 대해 정확히 하나의 값을 가지며, 이 값은 그 결과를 야기한 포커스 노드와 같습니다. 이는 검증 결과가 생성될 때 검증된 포커스 노드입니다.

6.7.2.2 경로(sh:resultPath)

검증 결과는 잘 형성된 SHACL 속성 경로를 가리키는 속성 sh:resultPath에 대한 값을 가질 수 있습니다. 속성 셰이프가 생성한 결과의 경우, 달리 명시되지 않는 한 이 SHACL 속성 경로는 그 셰이프의 sh:path 과 동등합니다. sh:path p빈 노드라면, sh:resultPath는 결과 그래프에서 p딥 카피입니다.

6.7.2.3 값(sh:value)

검증 결과는 속성 sh:value으로, 그 결과를 야기한 최대 하나의 RDF 용어를 포함할 수 있습니다. SHACL Core 컴포넌트의 검증기에 대한 텍스트 정의는 이 값이 어떻게 구성되는지 지정합니다. 흔히 이 값은 제약을 위반한 값 노드입니다.

6.7.2.4 출처(sh:sourceShape)

검증 결과는 속성 sh:sourceShape의 유일한 으로, 주어진 sh:focusNode가 검증된 대상인 셰이프를 포함할 수 있습니다.

6.7.2.5 제약 컴포넌트(sh:sourceConstraintComponent)

검증 결과는 속성 sh:sourceConstraintComponent에 대해 정확히 하나의 값을 가지며, 이 값은 그 결과를 야기한 제약 컴포넌트IRI입니다. 예를 들어, sh:minCount 값에 기반한 제약 위반으로 인해 생성된 결과는 출처 제약 컴포넌트로 sh:MinCountConstraintComponent를 가집니다.

6.7.2.6 세부사항(sh:detail)

속성 sh:detail은 (부모) 결과를 해당 (부모) 결과의 원인에 대한 추가 세부사항을 제공할 수 있는 하나 이상의 sh:AbstractResult SHACL 인스턴스와 연결할 수 있습니다. SHACL 프로세서의 기능에 따라, 여기에는 예를 들어 sh:node를 통한 적합성 검사의 일부로 평가된 제약의 위반이 포함될 수 있습니다.

6.7.2.7 메시지 (sh:resultMessage)

검증 결과는 예를 들어 사람에게 추가적인 텍스트 세부사항을 전달하기 위해 속성 sh:resultMessage에 대한 값을 가질 수 있습니다. sh:resultMessage는 여러 값을 가질 수 있지만, 같은 언어 태그를 가진 두 값이 있어서는 안 됩니다. 이러한 값은 셰이프 그래프의 제약에 있는 sh:message 값을 기반으로 검증 엔진에 의해 생성됩니다. 셰이프에 대한 메시지 선언을 참조하십시오. 구상화를 사용하여 선언된 메시지는 주변 셰이프에 선언된 메시지보다 우선합니다. 제약이 셰이프 그래프에서 sh:message에 대한 값을 전혀 가지지 않는 경우, SHACL 프로세서는 sh:resultMessage에 대해 다른 값을 자동으로 생성할 MAY 있습니다.

6.7.2.8 심각도 (sh:resultSeverity)

각 검증 결과는 속성 sh:resultSeverity에 대해 정확히 하나의 을 가지며, 이 값은 IRI입니다. 이 값은 다음 규칙에 의해 순서대로 결정됩니다:

  1. 결과를 야기한 제약매개변수를 포함하는 트리플 중 어느 것의 구상화자에 있는 sh:severity
  2. 결과를 야기한 셰이프셰이프 그래프 안에서의 sh:severity
  3. 셰이프 또는 제약에 대해 sh:severity가 지정되지 않았다면 sh:Violation으로 기본 설정됩니다.

6.8 값 노드

대부분의 제약 컴포넌트의 검증기는 다음 두 하위 섹션에서 정의되는 값 노드 개념을 사용합니다.

6.8.1 노드 셰이프의 값 노드

노드 셰이프의 경우, 값 노드는 개별 포커스 노드이며, 정확히 하나의 구성원을 가진 집합을 이룹니다.

6.8.2 속성 셰이프의 값 노드

sh:path p에 대한 을 가진 속성 셰이프의 경우, 값 노드의 집합은 다음 단계로 생성됩니다:

  1. p경로 매핑으로 포커스 노드에서 도달할 수 있는 데이터 그래프 안의 모든 노드를 추가합니다.
  2. e속성 셰이프에서 sh:values이라면, evalExpr(e, data graph, focus node, {})출력 노드를 추가합니다.
  3. 집합이 여전히 비어 있고 d속성 셰이프에서 sh:defaultValue이라면, evalExpr(d, data graph, focus node, {})출력 노드를 추가합니다.

7. Core 제약 컴포넌트

이 섹션은 모든 SHACL Core 프로세서가 지원해야 MUST 하는 내장 SHACL Core 제약 컴포넌트를 정의합니다. 각 제약 컴포넌트의 정의에는 그 IRI와 매개변수 표가 포함됩니다. 달리 명시되지 않는 한, 이러한 모든 매개변수는 필수 매개변수입니다. 이러한 매개변수 표에 열거된 구문 규칙 중 하나라도 위반하는 셰이프는 잘못 형성된 것입니다.

각 제약 컴포넌트에는 해당 컴포넌트와 연결된 검증기를 설명하는 텍스트 정의도 포함됩니다. 이러한 텍스트 정의는 제약 안의 매개변수 값을 $paramName 형식의 변수로 참조하며, 여기서 paramName은 매개변수의 IRI에서 sh: 네임스페이스 뒤의 부분입니다. 예를 들어, sh:ClassConstraintComponent의 텍스트 정의는 $class 변수를 사용하여 sh:class의 값을 참조합니다. SHACL Core에서 매개변수 값이라는 용어는 매개변수의 , 즉 주어셰이프이고 술어sh:class와 같은 매개변수셰이프 그래프 안의 트리플목적어를 의미합니다.

이슈 1

작성 시점에 WG의 의도는 SHACL Core 외부에서, 용어 매개변수 값노드 표현식도 허용하는 SHACL 방언을 정의하는 것입니다. 모든 제약 컴포넌트가 매개변수 값이라는 용어를 사용하는 것은 아니며, 대신 이라는 용어를 참조한다는 점에 유의하십시오. 예를 들어 sh:node의 값은 결코 노드 표현식이 될 수 없습니다. 이는 빈 노드의 처리를 복잡하게 만들기 때문입니다. TODO: Node Expression 명세가 준비된 경우 링크를 추가하거나, 그렇지 않으면 위 문장을 명확히 할 것.

이러한 검증기는 해당 컴포넌트가 생성하는 유일한 검증 결과를 정의한다는 점에 유의하십시오. 또한 검증기는 항상 새로운 결과 노드를 생성합니다. 즉 텍스트 정의에서 "...there is a validation result..."라고 명시할 때 이는 결과 그래프 안의 서로 다른 새 노드를 가리킵니다.

이 섹션의 나머지 부분은 비규범입니다.

SHACL Core에 포함된 제약 컴포넌트의 선택은 [shacl-ucr] 문서에서 수집한 요구사항을 바탕으로 이루어졌습니다. 가능한 한 많은 일반적인 사용 사례를 다루려는 시도와 Core 언어의 크기를 관리 가능한 수준으로 유지하는 것 사이의 균형에 특별한 주의를 기울였습니다. 모든 사용 사례를 Core 언어만으로 표현할 수 있는 것은 아닙니다. 대신 SHACL-SPARQL은 이 명세의 두 번째 부분에서 설명하는 확장 메커니즘을 제공합니다. 추가적인 재사용 가능한 제약 컴포넌트 라이브러리는 제3자에 의해 유지관리될 것으로 예상됩니다.

달리 명시되지 않는 한, Core 제약 컴포넌트는 속성 셰이프노드 셰이프 모두에서 사용할 수 있습니다. 일부 제약 매개변수에는 이러한 매개변수를 사용하는 노드 셰이프잘못 형성된 것으로 만드는 구문 규칙이 붙어 있습니다. 이에 대한 예로는 속성 셰이프에서만 지원되는 sh:minCount가 있습니다.

7.1 값 타입 제약 컴포넌트

이 섹션의 제약 컴포넌트는 값 노드의 타입을 제한하는 데 사용할 수 있다는 공통점이 있습니다. sh:or를 사용하여 여러 값 타입 대안을 표현할 수 있다는 점에 유의하십시오.

7.1.1 sh:class

sh:class로 지정되는 조건은 각 값 노드가 주어진 타입(들)의 SHACL 인스턴스여야 한다는 것입니다.

제약 컴포넌트 IRI: sh:ClassConstraintComponent

매개변수:
속성 요약 및 구문 규칙
sh:class 모든 값 노드의 타입. 셰이프에서 sh:class의 값은 IRI이거나, 모든 구성원IRI잘 형성된 SHACL 목록빈 노드입니다.
텍스트 정의
$classsh:class에 대한 매개변수 값이라고 합시다. classesIRI들의 집합이라고 합시다. 이때 $classIRI라면 그 집합은 정확히 해당 IRI만으로 구성되고, $class빈 노드 SHACL 목록이라면 그 집합은 정확히 그 목록의 구성원들로 구성됩니다.

값 노드 각각에 대해, 그것이 리터럴이거나, 리터럴이 아니지만 데이터 그래프에서 classes 중 어느 것의 SHACL 인스턴스도 아니라면, 해당 값 노드sh:value로 가지는 검증 결과가 있습니다.

이 섹션의 나머지 부분은 비규범입니다.

sh:class의 여러 값은 논리곱으로 해석된다는 점에 유의하십시오. 즉, 값은 이들 모두의 SHACL 인스턴스여야 합니다. 합집합 의미론에는 목록을 사용하십시오.

다음 예제는 sh:class의 목록 기반 구문을 설명하며, 이는 속성 ex:pet의 값이 고양이 또는 개 중 하나여야 함을 의미합니다.

7.1.2 sh:datatype

sh:datatype는 각 값 노드의 데이터타입과 관련하여 충족해야 하는 조건을 지정합니다.

제약 컴포넌트 IRI: sh:DatatypeConstraintComponent

매개변수:
속성 요약 및 구문 규칙
sh:datatype 모든 값 노드의 허용된 데이터타입(들)(예: xsd:integer). 셰이프는 sh:datatype에 대해 최대 하나의 값을 가집니다. 셰이프에서 sh:datatype의 값은 IRI이거나, 모든 구성원IRI잘 형성된 SHACL 목록빈 노드입니다.
텍스트 정의
$datatypesh:datatype에 대한 매개변수 값이라고 합시다. datatypesIRI들의 집합이라고 합시다. 이때 $datatypeIRI라면 그 집합은 정확히 해당 IRI만으로 구성되고, $datatype빈 노드 SHACL 목록이라면 그 집합은 정확히 그 목록의 구성원들로 구성됩니다.

값 노드 각각에 대해, 그것이 리터럴이 아니거나, datatypes 중 어느 것과도 일치하지 않는 데이터타입을 가진 리터럴이라면, 해당 값 노드sh:value로 가지는 검증 결과가 있습니다.

리터럴의 데이터타입은 SPARQL 1.2의 datatype 함수를 따라 결정됩니다. 리터럴은 그 리터럴의 데이터타입이 같은 IRI를 가지고, SPARQL 1.2가 지원하는 데이터타입의 경우 잘못 타입 지정된 리터럴이 아니라면 데이터타입과 일치합니다.

이 섹션의 나머지 부분은 비규범입니다.

sh:datatype의 값은 일반적으로 xsd:string과 같은 데이터타입입니다.

다음 예제는 목록 기반 구문을 설명하며, 이는 rdfs:label의 모든 값이 xsd:string 또는 rdf:langString 중 하나여야 함을 의미합니다.

7.1.3 sh:nodeKind

sh:nodeKind는 각 값 노드의 RDF 노드 종류에 의해 충족되어야 하는 조건을 지정합니다.

제약 컴포넌트 IRI: sh:NodeKindConstraintComponent

매개변수:
속성 요약 및 구문 규칙
sh:nodeKind 모든 값 노드의 노드 종류(IRI, 빈 노드, 리터럴, 트리플 용어 또는 이들의 조합). 셰이프는 sh:nodeKind에 대해 최대 하나의 값을 가집니다. 셰이프에서 sh:nodeKind의 값은 IRI이거나 모든 구성원이 IRI인 잘 형성된 SHACL 목록인 빈 노드입니다.

sh:nodeKind의 값이 IRI라면, 셰이프에서 sh:nodeKind의 값은 클래스 sh:NodeKind의 다음 일곱 인스턴스 중 하나입니다: sh:BlankNode, sh:IRI, sh:Literal sh:BlankNodeOrIRI, sh:BlankNodeOrLiteral, sh:IRIOrLiteral, 및 sh:TripleTerm.

sh:nodeKind의 값이 잘 형성된 SHACL 목록이라면, 셰이프에서 해당 목록의 구성원은 클래스 sh:NodeKind의 다음 네 인스턴스 중 하나입니다: sh:BlankNode, sh:IRI, sh:Literal, 및 sh:TripleTerm.
텍스트 정의
$nodeKindsh:nodeKind에 대한 매개변수 값이라고 합시다. $nodeKindsIRI들의 집합이라고 합시다. 이때 $nodeKindIRI라면 그 집합은 정확히 해당 IRI만으로 구성되고, $nodeKind빈 노드 SHACL 목록이라면 그 집합은 정확히 그 목록의 구성원들로 구성됩니다.

값 노드 각각에 대해, 그것이 $nodeKinds 중 어느 것과도 일치하지 않는다면, 해당 값 노드sh:value로 가지는 검증 결과가 있습니다. 어떤 IRIsh:IRI, sh:BlankNodeOrIRIsh:IRIOrLiteral에만 일치합니다. 어떤 빈 노드sh:BlankNode, sh:BlankNodeOrIRIsh:BlankNodeOrLiteral에만 일치합니다. 어떤 리터럴sh:Literal, sh:BlankNodeOrLiteralsh:IRIOrLiteral에만 일치합니다. 어떤 트리플 용어sh:TripleTerm에만 일치합니다.

이 섹션의 나머지 부분은 비규범입니다.

다음 예제는 어떤 주어에서든 ex:knows의 모든 값이 IRI여야 함을 명시합니다.

다음 예제는 목록 기반 구문을 설명하며, 이는 어떤 주어에서든 ex:knows의 모든 값이 IRI 또는 빈 노드여야 함을 의미합니다.

7.2 카디널리티 제약 컴포넌트

다음 제약 컴포넌트는 주어진 포커스 노드에 대한 값 노드 수의 제한을 나타냅니다.

7.2.1 sh:minCount

sh:minCount는 조건을 만족하는 값 노드의 최소 개수를 지정합니다. 최소 카디널리티 값이 0이면 이 제약은 항상 만족되므로 생략할 수 있습니다.

제약 컴포넌트 IRI: sh:MinCountConstraintComponent

매개변수:
속성 요약 및 구문 규칙
sh:minCount 최소 카디널리티. 노드 셰이프sh:minCount에 대해 어떤 값도 가질 수 없습니다. 속성 셰이프sh:minCount에 대해 최대 하나의 값을 가집니다. 속성 셰이프에서 sh:minCount의 값은 데이터타입이 xsd:integer인 리터럴입니다.
텍스트 정의
$minCountsh:minCount에 대한 매개변수 값이라고 합시다. 값 노드의 수가 $minCount보다 작으면, 검증 결과가 있습니다.

이 섹션의 나머지 부분은 비규범입니다.

7.2.2 sh:maxCount

sh:maxCount는 조건을 만족하는 값 노드의 최대 개수를 지정합니다.

제약 컴포넌트 IRI: sh:MaxCountConstraintComponent

매개변수:
속성 요약 및 구문 규칙
sh:maxCount 최대 카디널리티. 노드 셰이프sh:maxCount에 대해 어떤 값도 가질 수 없습니다. 속성 셰이프sh:maxCount에 대해 최대 하나의 값을 가집니다. 속성 셰이프에서 sh:maxCount의 값은 데이터타입이 xsd:integer인 리터럴입니다.
텍스트 정의
$maxCountsh:maxCount에 대한 매개변수 값이라고 합시다. 값 노드의 수가 $maxCount보다 크면, 검증 결과가 있습니다.

이 섹션의 나머지 부분은 비규범입니다.

7.3 값 범위 제약 컴포넌트

다음 제약 컴포넌트는 <, <=, >>= 같은 연산자를 통해 비교 가능한 값 노드가 충족해야 하는 값 범위 조건을 지정합니다. 다음 예제는 이러한 제약 컴포넌트의 전형적인 사용 사례를 설명합니다.

7.3.1 sh:minExclusive

제약 컴포넌트 IRI: sh:MinExclusiveConstraintComponent

매개변수:
속성 요약 및 구문 규칙
sh:minExclusive 배타적 최솟값. 셰이프에서 sh:minExclusive의 값은 리터럴입니다. 셰이프는 sh:minExclusive에 대해 최대 하나의 값을 가집니다.
텍스트 정의
$minExclusivesh:minExclusive에 대한 매개변수 값이라고 합시다. SPARQL 표현식 $minExclusive < vtrue를 반환하지 않는 각 값 노드 v에 대해, vsh:value로 가지는 검증 결과가 있습니다.

이 섹션의 나머지 부분은 비규범입니다.

값 노드를 지정된 범위와 비교할 수 없는 경우, 예를 들어 누군가 문자열을 정수와 비교하는 경우에는 검증 결과가 있습니다.

7.3.2 sh:minInclusive

제약 컴포넌트 IRI: sh:MinInclusiveConstraintComponent

매개변수:
속성 요약 및 구문 규칙
sh:minInclusive 포함적 최솟값. 셰이프에서 sh:minInclusive의 값은 리터럴입니다. 셰이프는 sh:minInclusive에 대해 최대 하나의 값을 가집니다.
텍스트 정의
$minInclusivesh:minInclusive에 대한 매개변수 값이라고 합시다. SPARQL 표현식 $minInclusive <= vtrue를 반환하지 않는 각 값 노드 v에 대해, vsh:value로 가지는 검증 결과가 있습니다.

7.3.3 sh:maxExclusive

제약 컴포넌트 IRI: sh:MaxExclusiveConstraintComponent

매개변수:
속성 요약 및 구문 규칙
sh:maxExclusive 배타적 최댓값. 셰이프에서 sh:maxExclusive의 값은 리터럴입니다. 셰이프는 sh:maxExclusive에 대해 최대 하나의 값을 가집니다.
텍스트 정의
$maxExclusivesh:maxExclusive에 대한 매개변수 값이라고 합시다. SPARQL 표현식 $maxExclusive > vtrue를 반환하지 않는 각 값 노드 v에 대해, vsh:value로 가지는 검증 결과가 있습니다.

7.3.4 sh:maxInclusive

제약 컴포넌트 IRI: sh:MaxInclusiveConstraintComponent

매개변수:
속성 요약 및 구문 규칙
sh:maxInclusive 포함적 최댓값. 셰이프에서 sh:maxInclusive의 값은 리터럴입니다. 셰이프는 sh:maxInclusive에 대해 최대 하나의 값을 가집니다.
텍스트 정의
$maxInclusivesh:maxInclusive에 대한 매개변수 값이라고 합시다. SPARQL 표현식 $maxInclusive >= vtrue를 반환하지 않는 각 값 노드 v에 대해, vsh:value로 가지는 검증 결과가 있습니다.

7.4 문자열 기반 제약 컴포넌트

이 섹션의 제약 컴포넌트는 값 노드의 문자열 표현에 대한 조건을 지정한다는 공통점이 있습니다.

7.4.1 sh:minLength

sh:minLength는 조건을 만족하는 각 값 노드의 최소 문자열 길이를 지정합니다. 이는 어떤 리터럴IRI에도 적용할 수 있지만, 빈 노드에는 적용할 수 없습니다.

제약 컴포넌트 IRI: sh:MinLengthConstraintComponent

매개변수:
속성 요약 및 구문 규칙
sh:minLength 최소 길이. 셰이프에서 sh:minLength의 값은 데이터타입이 xsd:integer인 리터럴입니다. 셰이프는 sh:minLength에 대해 최대 하나의 값을 가집니다.
텍스트 정의
$minLengthsh:minLength에 대한 매개변수 값이라고 합시다. SPARQL STRLEN 함수가 정의한 v의 문자열 표현(SPARQL str 함수가 정의함)의 길이가 $minLength보다 작거나, v빈 노드인 각 값 노드 v에 대해, vsh:value로 가지는 검증 결과가 있습니다.

이 섹션의 나머지 부분은 비규범입니다.

sh:minLength의 값이 0이면 문자열 길이에 대한 제한은 없지만, 값 노드가 빈 노드인 경우에는 여전히 제약 위반이라는 점에 유의하십시오.

7.4.2 sh:maxLength

sh:maxLength는 조건을 만족하는 각 값 노드의 최대 문자열 길이를 지정합니다. 이는 어떤 리터럴IRI에도 적용할 수 있지만, 빈 노드에는 적용할 수 없습니다.

제약 컴포넌트 IRI: sh:MaxLengthConstraintComponent

매개변수:
속성 요약 및 구문 규칙
sh:maxLength 최대 길이. 셰이프에서 sh:maxLength의 값은 데이터타입이 xsd:integer인 리터럴입니다. 셰이프는 sh:maxLength에 대해 최대 하나의 값을 가집니다.
텍스트 정의
$maxLengthsh:maxLength에 대한 매개변수 값이라고 합시다. SPARQL STRLEN 함수가 정의한 v의 문자열 표현(SPARQL str 함수가 정의함)의 길이가 $maxLength보다 크거나, v빈 노드인 각 값 노드 v에 대해, vsh:value로 가지는 검증 결과가 있습니다.

이 섹션의 나머지 부분은 비규범입니다.

7.4.3 sh:pattern

sh:pattern은 각 값 노드가 조건을 만족하기 위해 일치해야 하는 정규 표현식을 지정합니다.

제약 컴포넌트 IRI: sh:PatternConstraintComponent

매개변수:
속성 요약 및 구문 규칙
sh:pattern 모든 값 노드가 일치해야 하는 정규 표현식. 셰이프에서 sh:pattern의 값은 데이터타입이 xsd:string인 리터럴입니다. 셰이프에서 sh:pattern의 값은 SPARQL REGEX 함수에 대한 유효한 pattern 인자입니다.
sh:flags SPARQL 1.2 REGEX에서처럼 해석되는 선택적 플래그 문자열. 셰이프에서 sh:flags의 값은 데이터타입이 xsd:string인 리터럴입니다.
텍스트 정의
$patternsh:pattern에 대한 매개변수 값이라고 합시다. $flagssh:flags에 대한 매개변수 값이라고 합시다. 빈 노드이거나, 문자열 표현(SPARQL str 함수가 정의함)이 정규 표현식 $pattern(SPARQL REGEX 함수가 정의함)과 일치하지 않는 각 값 노드에 대해, 해당 값 노드sh:value로 가지는 검증 결과가 있습니다. $flags가 값을 가진다면, 일치는 $flags를 세 번째 인자로 사용하여 SPARQL REGEX 함수의 3-인자 변형 정의를 따라야 MUST 합니다.

이 섹션의 나머지 부분은 비규범입니다.

7.4.4 sh:singleLine

이슈 2

이 기능은 이 기능(및 유사한) 편의 기능에 대한 WG 결의가 있을 때까지 "위험 상태"입니다. WG는 아직 Core에 들어가야 하는 기능과 다른 문서에 들어가야 하는 기능 사이에 어디에 선을 그을지 확신하지 못하고 있습니다. 원래 이슈 177로 논의되었습니다.

true로 설정되면, sh:singleLine값 노드가 줄바꿈을 포함해서는 안 된다고 지정합니다. 제약 검증 외에도, 이 정보는 사용자 인터페이스 빌더가 (한 줄) 텍스트 필드와 (여러 줄) 텍스트 영역 중에서 선택하는 데 활용될 수 있습니다.

제약 컴포넌트 IRI: sh:SingleLineConstraintComponent

매개변수:
속성 요약 및 구문 규칙
sh:singleLine 이 제약을 활성화하려면 true. 셰이프에서 sh:singleLine의 값은 데이터타입이 xsd:boolean인 리터럴입니다. 셰이프는 sh:singleLine에 대해 최대 하나의 값을 가집니다.
텍스트 정의
$singleLinesh:singleLine에 대한 매개변수 값이라고 합시다. $singleLinetrue이면, 어휘 형식이 정규 표현식(SPARQL REGEX 함수가 정의함) [\f\r\n\v]와 일치하는 리터럴인 각 값 노드에 대해, 검증 결과가 있습니다.

이 섹션의 나머지 부분은 비규범입니다.

7.4.5 sh:languageIn

sh:languageIn으로 지정되는 조건은 각 값 노드에 대해 허용되는 언어 태그가 주어진 언어 태그 목록으로 제한된다는 것입니다.

제약 컴포넌트 IRI: sh:LanguageInConstraintComponent

매개변수:
속성 요약 및 구문 규칙
sh:languageIn [BCP47]에 따른 기본 언어 범위 목록. 셰이프에서 sh:languageIn의 각 값은 SHACL 목록입니다. 그러한 목록의 각 구성원은 데이터타입이 xsd:string인 리터럴입니다. 셰이프는 sh:languageIn에 대해 최대 하나의 값을 가집니다.
텍스트 정의
$languageInsh:languageIn이라고 합시다. 값 노드 각각에 대해, 그것이 리터럴이 아니거나, SPARQL langMatches 함수가 정의한 필터링 스키마를 따라 $languageIn구성원인 기본 언어 범위 중 어느 것과도 일치하는 언어 태그를 가지지 않는다면, 해당 값 노드sh:value로 가지는 검증 결과가 있습니다.

이 섹션의 나머지 부분은 비규범입니다.

다음 예제 셰이프는 ex:prefLabel의 모든 값이 영어 또는 마오리어일 수 있다고 명시합니다.

7.4.6 sh:uniqueLang

속성 sh:uniqueLang는, 존재하는 경우 텍스트 방향까지 고려하여, 같은 언어 태그를 사용하는 값 노드 쌍이 없어야 함을 지정하기 위해 true로 설정됩니다.

제약 컴포넌트 IRI: sh:UniqueLangConstraintComponent

매개변수:
속성 요약 및 구문 규칙
sh:uniqueLang 이 제약을 활성화하려면 true. 셰이프에서 sh:uniqueLang의 값은 데이터타입이 xsd:boolean인 리터럴입니다. 속성 셰이프는 sh:uniqueLang에 대해 최대 하나의 값을 가집니다. 노드 셰이프sh:uniqueLang에 대해 어떤 값도 가질 수 없습니다.
텍스트 정의
$uniqueLangsh:uniqueLang에 대한 매개변수 값이라고 합시다. $uniqueLangtrue이면, 최소 두 개의 값 노드가 사용하는 비어 있지 않은 각 언어 태그에 대해, 검증 결과가 있습니다. rdf:dirLangString 데이터타입값 노드의 경우, 기본 방향이 유일성 조건에 포함됩니다. 예를 들어 "1"@ar--rtl"1"@ar-ltr은 서로 다르며, "1"@ar--rtl"1"@ar 쌍도 마찬가지입니다.

이 섹션의 나머지 부분은 비규범입니다.

7.5 목록 제약 컴포넌트

이 섹션의 제약 컴포넌트는 값 노드SHACL 목록인 것에 적용됩니다. 이들은 SHACL 목록의 구조, 길이 및 구성원에 대한 조건을 지정합니다.

7.5.1 sh:memberShape

sh:memberShapeSHACL 목록 값 노드의 모든 구성원이 주어진 노드 셰이프에 부합해야 함을 지정합니다.

제약 컴포넌트 IRI: sh:MemberShapeConstraintComponent

매개변수:
속성 요약 및 구문 규칙
sh:memberShape SHACL 목록의 모든 구성원이 부합해야 하는 셰이프. sh:memberShape의 값은 잘 형성된 노드 셰이프여야 합니다.
텍스트 정의
$memberShapesh:memberShape에 대한 매개변수 값이라고 합시다. 각 값 노드 vSHACL 목록이어야 합니다. v가 SHACL 목록이 아니면 검증 결과가 있습니다. SHACL 목록 v의 어떤 구성원 m$memberShape부합하지 않으면, 검증 결과가 있습니다.

이 섹션의 나머지 부분은 비규범입니다.

$memberShape에 부합하지 않는 값 노드 v의 각 구성원 mv에 대한 검증 결과 안에서 별도의 sh:detail로 보고되어야 합니다. v가 유효한 SHACL 목록이 아니라면, 이는 최상위 검증 결과로 보고되어야 하며, 개별 구성원 검증은 시도하지 않아야 합니다.

검증 결과에서 sh:detail을 생성하는 방법의 예는 SHACL 테스트 스위트의 sh:memberShape 테스트 케이스에서 찾을 수 있습니다: memberShape-001.ttl.

다음 예제에서는 속성 ex:speakerOrder의 모든 값이 구성원이 IRI인 SHACL 목록이어야 합니다.

7.5.2 sh:minListLength

sh:minListLengthSHACL 목록 값 노드가 가져야 하는 구성원의 최소 개수를 지정합니다.

제약 컴포넌트 IRI: sh:MinListLengthConstraintComponent

매개변수:
속성 요약 및 구문 규칙
sh:minListLength SHACL 목록의 최소 구성원 수. 셰이프에서 sh:minListLength의 값은 데이터타입이 xsd:integer인 리터럴입니다. 셰이프에서 sh:minListLength의 값은 0 이상인 정수입니다.
텍스트 정의
$minListLengthsh:minListLength에 대한 매개변수 값이라고 합시다. 각 값 노드 vSHACL 목록이어야 합니다. v가 SHACL 목록이 아니면 검증 결과가 있습니다. 목록 v의 구성원 수가 $minListLength보다 작으면, 검증 결과가 있습니다.

이 섹션의 나머지 부분은 비규범입니다.

다음 예제에서는 속성 ex:skills의 모든 값이 최소 1개의 구성원을 가진 SHACL 목록이어야 합니다. sh:minListLength에 대한 추가 테스트 케이스는 SHACL 테스트 스위트에서 찾을 수 있습니다: minListLength-001.ttl.

7.5.3 sh:maxListLength

sh:maxListLengthSHACL 목록 값 노드가 가져야 하는 구성원의 최대 개수를 지정합니다.

제약 컴포넌트 IRI: sh:MaxListLengthConstraintComponent

매개변수:
속성 요약 및 구문 규칙
sh:maxListLength SHACL 목록의 최대 구성원 수. 셰이프에서 sh:maxListLength의 값은 데이터타입이 xsd:integer인 리터럴입니다. 셰이프에서 sh:maxListLength의 값은 0 이상인 정수입니다.
텍스트 정의
$maxListLengthsh:maxListLength에 대한 매개변수 값이라고 합시다. 각 값 노드 vSHACL 목록이어야 합니다. v가 SHACL 목록이 아니면 검증 결과가 있습니다. 목록 v의 구성원 수가 $maxListLength보다 크면, 검증 결과가 있습니다.

이 섹션의 나머지 부분은 비규범입니다.

다음 예제에서는 속성 ex:hobbies의 모든 값이 최대 2개의 구성원을 가진 SHACL 목록이어야 합니다. sh:maxListLength에 대한 추가 테스트 케이스는 SHACL 테스트 스위트에서 찾을 수 있습니다: maxListLength-001.ttl.

7.5.4 sh:uniqueMembers

sh:uniqueMembersSHACL 목록 값 노드가 고유한 구성원을 가져야 하는지 여부를 지정합니다.

제약 컴포넌트 IRI: sh:UniqueMembersConstraintComponent

매개변수:
속성 요약 및 구문 규칙
sh:uniqueMembers SHACL 목록의 구성원이 고유해야 하는지 여부를 지정하는 불리언. 셰이프에서 sh:uniqueMembers의 값은 데이터타입이 xsd:boolean인 리터럴입니다.
텍스트 정의
$uniqueMemberssh:uniqueMembers에 대한 매개변수 값이라고 합시다. 각 값 노드 vSHACL 목록이어야 합니다. v가 SHACL 목록이 아니면 검증 결과가 있습니다. $uniqueMemberstrue이고 목록 v에 중복된 구성원이 있으면, 검증 결과가 있습니다.

이 섹션의 나머지 부분은 비규범입니다.

목록 v의 각 중복 구성원 mv에 대한 검증 결과 안에서 별도의 sh:detail로 보고되어야 합니다. 목록 v가 유효한 SHACL 목록이 아니라면, 이는 최상위 검증 결과로 보고되어야 하며, 고유 구성원 검증은 시도하지 않아야 합니다.

검증 결과에서 sh:detail을 생성하는 방법의 예는 SHACL 테스트 스위트의 sh:uniqueMembers 테스트 케이스에서 찾을 수 있습니다: uniqueMembers-001.ttl.

다음 예제에서는 속성 ex:preferences의 모든 값이 각 SHACL 목록 안에서 고유한 값을 가지는 구성원을 가진 SHACL 목록이어야 합니다.

7.6 속성 쌍 제약 컴포넌트

이 섹션의 제약 컴포넌트는 다른 속성 또는 속성 경로와의 관계에서 값 노드 집합에 대한 조건을 지정합니다. 이러한 제약 컴포넌트는 속성 셰이프에서만 사용할 수 있습니다.

7.6.1 sh:equals

sh:equals는 모든 값 노드의 집합이 sh:equals를 사용하여 지정된 SHACL 속성 경로를 통해 포커스 노드에서 도달할 수 있는 노드 집합과 같아야 한다는 조건을 지정합니다.

제약 컴포넌트 IRI: sh:EqualsConstraintComponent

매개변수:
속성 요약 및 구문 규칙
sh:equals 비교할 속성 경로. 셰이프에서 sh:equals의 값은 잘 형성된 SHACL 속성 경로입니다.
텍스트 정의
$equalssh:equals이라고 하고, $path셰이프 그래프에서 $equals가 나타내는 SHACL 속성 경로라고 합시다. $otherNodes$path를 통해 포커스 노드에서 도달할 수 있는 노드들의 집합이라고 합시다. $otherNodes에 존재하지 않는 각 값 노드에 대해, 그 값 노드sh:value로 가지는 검증 결과가 있습니다. $otherNodes 안의 각 노드값 노드 중 하나가 아닌 것에 대해, 그 sh:value로 가지는 검증 결과가 있습니다.

이 섹션의 나머지 부분은 비규범입니다.

다음 예제는 특정 포커스 노드가 ex:firstNameex:givenName에 대해 같은 값 집합을 가져야 함을 지정하기 위해 셰이프에서 sh:equals를 사용하는 방법을 설명합니다.

다음 예제는 SHACL 속성 경로sh:pathsh:equals의 값으로 모두 사용될 수 있음을 보여 줍니다.

7.6.2 sh:disjoint

sh:disjoint값 노드 집합이 sh:disjointSHACL 속성 경로를 통해 포커스 노드에서 도달할 수 있는 노드 집합과 서로소라는 조건을 지정합니다.

제약 컴포넌트 IRI: sh:DisjointConstraintComponent

매개변수:
속성 요약 및 구문 규칙
sh:disjoint 값을 비교할 속성 경로. 셰이프에서 sh:disjoint의 값은 잘 형성된 SHACL 속성 경로입니다.
텍스트 정의
$disjointsh:disjoint매개변수 값이라고 하고, $path셰이프 그래프에서 $disjoint가 나타내는 SHACL 속성 경로라고 합시다. $otherNodes$path를 통해 포커스 노드에서 도달할 수 있는 노드들의 집합이라고 합시다. $otherNodes에도 있는 각 값 노드에 대해, 그 값 노드sh:value로 가지는 검증 결과가 있습니다.

이 섹션의 나머지 부분은 비규범입니다.

다음 예제는 특정 포커스 노드가 ex:prefLabelex:altLabel에 대해 어떤 값도 공유할 수 없음을 지정하기 위해 셰이프에서 sh:disjoint를 사용하는 방법을 설명합니다.

7.6.3 sh:subsetOf

sh:subsetOf는 모든 값 노드sh:subsetOf를 사용하여 지정된 SHACL 속성 경로를 통해 포커스 노드에서 도달 가능해야 역시 한다는 조건을 지정합니다.

제약 컴포넌트 IRI: sh:SubsetOfConstraintComponent

매개변수:
속성 요약 및 구문 규칙
sh:subsetOf 비교할 속성 경로. 셰이프에서 sh:subsetOf의 값은 잘 형성된 SHACL 속성 경로입니다.
텍스트 정의
$subsetOfsh:subsetOf이라고 하고, $path셰이프 그래프에서 $subsetOf가 나타내는 SHACL 속성 경로라고 합시다. $otherNodes$path를 통해 포커스 노드에서 도달할 수 있는 노드들의 집합이라고 합시다. $otherNodes에 존재하지 않는 각 값 노드에 대해, 그 값 노드sh:value로 가지는 검증 결과가 있습니다.

이 섹션의 나머지 부분은 비규범입니다.

다음 예제는 어떤 사람의 가장 좋아하는 자녀가 실제 자녀들 중 하나여야 함을 지정하기 위해 셰이프에서 sh:subsetOf를 사용하는 방법을 설명합니다.

7.6.4 sh:lessThan

sh:lessThan는 각 값 노드sh:lessThanSHACL 속성 경로를 통해 포커스 노드에서 도달할 수 있는 모든 노드보다 작아야 한다는 조건을 지정합니다.

제약 컴포넌트 IRI: sh:LessThanConstraintComponent

매개변수:
속성 요약 및 구문 규칙
sh:lessThan 값을 비교할 속성 경로. 셰이프에서 sh:lessThan의 값은 잘 형성된 SHACL 속성 경로입니다. 노드 셰이프sh:lessThan에 대해 어떤 값도 가질 수 없습니다.
텍스트 정의
$lessThansh:lessThan이라고 하고, $path셰이프 그래프에서 $lessThan가 나타내는 SHACL 속성 경로라고 합시다. $otherNodes$path를 통해 포커스 노드에서 도달할 수 있는 노드들의 집합이라고 합시다. 값 노드$otherNodes의 구성원으로 이루어진 각 쌍에 대해, 첫 번째 이 두 번째 보다 작지 않거나 (SPARQL의 < 연산자를 기준으로), 두 값을 비교할 수 없다면, 그 값 노드sh:value로 가지는 검증 결과가 있습니다.

이 섹션의 나머지 부분은 비규범입니다.

다음 예제는 ex:startDate의 모든 값이 ex:endDate의 값보다 "이전"이어야 함을 지정하기 위해 셰이프에서 sh:lessThan를 사용하는 방법을 설명합니다.

7.6.5 sh:lessThanOrEquals

sh:lessThanOrEquals는 각 값 노드sh:lessThanOrEqualsSHACL 속성 경로를 통해 포커스 노드에서 도달할 수 있는 모든 노드보다 작거나 같아야 한다는 조건을 지정합니다.

제약 컴포넌트 IRI: sh:LessThanOrEqualsConstraintComponent

매개변수:
속성 요약 및 구문 규칙
sh:lessThanOrEquals 값을 비교할 속성 경로. 셰이프에서 sh:lessThanOrEquals의 값은 잘 형성된 SHACL 속성 경로입니다. 노드 셰이프sh:lessThanOrEquals에 대해 어떤 값도 가질 수 없습니다.
텍스트 정의
$lessThanOrEqualssh:lessThanOrEquals이라고 하고, $path셰이프 그래프에서 $lessThanOrEquals가 나타내는 SHACL 속성 경로라고 합시다. $otherNodes$path를 통해 포커스 노드에서 도달할 수 있는 노드들의 집합이라고 합시다. 값 노드$otherNodes의 구성원으로 이루어진 각 쌍에 대해, 첫 번째 이 두 번째 보다 작거나 같지 않거나(SPARQL의 <= 연산자를 기준으로), 두 값을 비교할 수 없다면, 그 값 노드sh:value로 가지는 검증 결과가 있습니다.

7.7 논리 제약 컴포넌트

이 섹션의 제약 컴포넌트는 일반적인 논리 연산자 and, or, notexclusive or의 변형을 구현합니다.

7.7.1 sh:not

sh:not는 각 값 노드가 주어진 셰이프부합할 수 없다는 조건을 지정합니다. 이는 부정 및 논리 "not" 연산자와 비슷합니다.

제약 컴포넌트 IRI: sh:NotConstraintComponent

매개변수:
속성 요약 및 구문 규칙
sh:not 부정할 셰이프. 셰이프에서 sh:not의 값은 잘 형성된 셰이프여야 합니다.
텍스트 정의
$notsh:not이라고 합시다. 각 값 노드 v에 대해: $not 셰이프에 대한 v적합성 검사실패를 생성하면 실패가 보고되어야 MUST 합니다. 그렇지 않고, v$not 셰이프에 부합하면, vsh:value로 가지는 검증 결과가 있습니다.

이 섹션의 나머지 부분은 비규범입니다.

다음 예제는 특정 포커스 노드가 ex:property의 어떤 값도 가질 수 없다는 조건을 지정하기 위해 셰이프에서 sh:not를 사용하는 방법을 설명합니다.

7.7.2 sh:and

sh:and는 각 값 노드가 제공된 모든 셰이프에 부합해야 한다는 조건을 지정합니다. 이는 논리곱 및 논리 "and" 연산자와 비슷합니다.

제약 컴포넌트 IRI: sh:AndConstraintComponent

매개변수:
속성 요약 및 구문 규칙
sh:and 값 노드를 검증할 셰이프들의 SHACL 목록. 셰이프에서 sh:and의 각 값은 SHACL 목록입니다. 그러한 목록의 각 구성원잘 형성된 셰이프여야 합니다.
텍스트 정의
$andsh:and이라고 합시다. 각 값 노드 v에 대해: $and구성원 중 어느 것에 대해 v적합성 검사실패를 생성하면 실패가 생성되어야 MUST 합니다. 그렇지 않고, v$and의 각 구성원부합하지 않으면, vsh:value로 가지는 검증 결과가 있습니다.

이 섹션의 나머지 부분은 비규범입니다.

sh:and가 값으로 셰이프들의 SHACL 목록을 가지지만, 그 셰이프들의 순서는 검증 결과에 영향을 주지 않는다는 점에 유의하십시오. 단축 평가 의미론을 사용하는 구현에서는 그 순서가 검증 효율에 영향을 줄 수 있습니다. 평가하기 더 쉽거나 실패할 가능성이 더 높은 제약을 목록의 앞쪽에 두는 것이 좋습니다.

다음 예제는 특정 포커스 노드가 ex:property의 값을 정확히 하나 가져야 한다는 조건을 지정하기 위해 셰이프에서 sh:and를 사용하는 방법을 설명합니다. 이는 최소 개수를 지정하는 별도의 명명된 셰이프(ex:SuperShape)와 추가로 최대 개수를 지정하는 속성 셰이프의 논리곱을 통해 달성됩니다. 여기에서 보듯이 sh:and는 셰이프 간 특수화 메커니즘을 구현하는 데 사용할 수 있습니다.

7.7.3 sh:or

sh:or는 각 값 노드가 제공된 셰이프 중 적어도 하나에 부합해야 한다는 조건을 지정합니다. 이는 논리합 및 논리 "or" 연산자와 비슷합니다.

제약 컴포넌트 IRI: sh:OrConstraintComponent

매개변수:
속성 요약 및 구문 규칙
sh:or 값 노드를 검증할 셰이프들의 SHACL 목록. 셰이프에서 sh:or의 각 값은 SHACL 목록입니다. 그러한 목록의 각 구성원잘 형성된 셰이프여야 합니다.
텍스트 정의
$orsh:or이라고 합시다. 각 값 노드 v에 대해: v를 어느 구성원에 대해 적합성 검사했을 때 실패가 생성되면 실패가 생성되어야 MUST 합니다. 그렇지 않고, v$or구성원 중 어느 것에도 부합하지 않으면, vsh:value로 가지는 검증 결과가 있습니다.

이 섹션의 나머지 부분은 비규범입니다.

sh:or가 값으로 셰이프들의 SHACL 목록을 가지지만, 그 셰이프들의 순서는 검증 결과에 영향을 주지 않는다는 점에 유의하십시오. 단축 평가 의미론을 사용하는 구현에서는 그 순서가 검증 효율에 영향을 줄 수 있습니다. 평가하기 더 쉽거나 성공할 가능성이 더 높은 제약을 목록의 앞쪽에 두는 것이 좋습니다.

다음 예제는 특정 포커스 노드가 ex:firstName의 값을 적어도 하나 가지거나, ex:givenName의 값을 적어도 하나 가져야 한다는 조건을 지정하기 위해 셰이프에서 sh:or를 사용하는 방법을 설명합니다.

다음 예제는 주어진 속성 ex:address의 값이 데이터타입 xsd:string을 가진 리터럴이거나 클래스 ex:AddressSHACL 인스턴스일 수 있음을 나타내기 위해 속성 셰이프에서 sh:or를 사용할 수 있음을 보여 줍니다.

SHACL의 모든 제약은 실행 시 AND 처리된다는 점에 유의하십시오. 다음 예제를 고려하십시오:

올바른 해석은 (shapeA OR shapeB) AND (shapeC OR shapeD)입니다. 대상 노드는 shapeA 또는 shapeB에 부합해야 하며, 또한 shapeC 또는 shapeD에도 부합해야 합니다.

7.7.4 sh:xone

sh:xone은 각 값 노드가 제공된 셰이프 중 정확히 하나에 부합해야 한다는 조건을 지정합니다.

제약 컴포넌트 IRI: sh:XoneConstraintComponent

매개변수:
속성 요약 및 구문 규칙
sh:xone 값 노드를 검증할 셰이프들의 SHACL 목록. 셰이프에서 sh:xone의 각 값은 SHACL 목록입니다. 그러한 목록의 각 구성원MUST 잘 형성된 셰이프여야 합니다. 그러한 각 목록은 적어도 하나의 구성원을 가져야 SHOULD 합니다.
텍스트 정의
$xonesh:xone이라고 합시다. 각 값 노드 v에 대해, N$xone구성원셰이프v가 그 셰이프에 부합하는 개수라고 합시다. v를 어느 구성원에 대해 적합성 검사했을 때 실패가 생성되면 실패가 생성되어야 MUST 합니다. 그렇지 않고, N이 정확히 1이 아니면, vsh:value로 가지는 검증 결과가 있습니다.

이 섹션의 나머지 부분은 비규범입니다.

sh:xone이 값으로 셰이프들의 SHACL 목록을 가지지만, 그 셰이프들의 순서는 검증 결과에 영향을 주지 않는다는 점에 유의하십시오.

다음 예제는 특정 포커스 노드가 ex:fullName에 대한 값을 가지거나, ex:firstNameex:lastName에 대한 값을 가져야 하지만, 둘 다 가져서는 안 된다는 조건을 지정하기 위해 셰이프에서 sh:xone을 사용하는 방법을 설명합니다.

7.8 셰이프 기반 제약 컴포넌트

이 섹션의 제약 컴포넌트는 값 노드를 특정 셰이프에 대해 검증함으로써 복잡한 조건을 지정하는 데 사용할 수 있습니다.

7.8.1 sh:node

sh:node는 각 값 노드가 주어진 노드 셰이프에 부합해야 한다는 조건을 지정합니다.

제약 컴포넌트 IRI: sh:NodeConstraintComponent

매개변수:
속성 요약 및 구문 규칙
sh:node 모든 값 노드가 부합해야 하는 노드 셰이프. 셰이프에서 sh:node의 값은 잘 형성된 노드 셰이프여야 합니다.
텍스트 정의
$nodesh:node이라고 합시다. 각 값 노드 v에 대해: $node에 대한 v적합성 검사실패를 생성하면 실패가 생성되어야 MUST 합니다. 그렇지 않고, v$node부합하지 않으면, vsh:value로 가지는 검증 결과가 있습니다.

이 섹션의 나머지 부분은 비규범입니다.

다음 예제는 속성 셰이프에서 sh:node를 사용하는 방법을 설명합니다. 속성 ex:address의 모든 값은 셰이프 ex:AddressShape가 표현한 제약을 충족해야 합니다.

다음 예제는 노드 셰이프에서 sh:node를 사용하는 방법을 설명합니다.

SHACL에서 재귀적 셰이프를 처리하는 방법은 6.5.3 재귀적 셰이프의 처리를 참조하십시오.

7.8.2 sh:property

sh:property는 각 값 노드가 주어진 속성 셰이프를 가져야 함을 지정하는 데 사용할 수 있습니다.

제약 컴포넌트 IRI: sh:PropertyConstraintComponent

매개변수:
속성 요약 및 구문 규칙
sh:property 모든 값 노드가 가져야 하는 속성 셰이프. 셰이프에서 sh:property의 각 값은 잘 형성된 속성 셰이프여야 합니다.
텍스트 정의
$propertysh:property이라고 합시다. 각 값 노드 v에 대해: 속성 셰이프 $property에 대해 v포커스 노드로 검증한 결과가 실패를 생성하면 실패가 생성되어야 MUST 합니다. 그렇지 않으면, 검증 결과는 v포커스 노드로 하여 속성 셰이프 $property에 대해 검증한 결과입니다.

이 섹션의 나머지 부분은 비규범입니다.

sh:propertysh:node 사이에는 중요한 차이가 있다는 점에 유의하십시오: 값 노드가 제약을 위반하는 경우, sh:node에 대해서는 이 값 노드에 대해 sh:NodeConstraintComponentsh:sourceConstraintComponent로 가지는 검증 결과가 하나만 있습니다. 반면 sh:property에 대해서는 검증 결과가 임의의 개수만큼 있을 수 있으며, 이들은 속성 셰이프 안의 제약의 개별 제약 컴포넌트를 sh:sourceConstraintComponent 값으로 가집니다.

다른 모든 검증 결과와 마찬가지로, 속성 셰이프sh:property를 통해 도달될 때마다, 검증 엔진은 새로운 검증 결과 노드를 생성해야 MUST 합니다. 이는 같은 포커스 노드가 같은 속성 셰이프에 대해 검증되지만 셰이프 그래프 안의 다른 경로를 통해 도달되는 경우도 포함합니다.

7.8.3 sh:someValue

sh:someValue는 적어도 하나의 값 노드가 주어진 셰이프에 부합해야 한다는 조건을 지정합니다.

제약 컴포넌트 IRI: sh:SomeValueConstraintComponent

매개변수:
속성 요약 및 구문 규칙
sh:someValue 값 노드 중 적어도 하나가 부합해야 하는 셰이프. 셰이프에서 sh:someValue의 값은 잘 형성된 셰이프여야 합니다.
텍스트 정의
$someValuesh:someValue이라고 합시다. 적어도 하나의 값 노드$someValue에 부합하는 경우를 제외하고, 어떤 값 노드$someValue에 대해 적합성 검사했을 때 실패가 생성되면 실패가 생성되어야 MUST 합니다. 그렇지 않고, 어떤 값 노드$someValue부합하지 않으면, 검증 결과가 있습니다.

이 섹션의 나머지 부분은 비규범입니다.

구현은 값 노드 중 하나가 부합하는 즉시 값 노드 처리를 중단할 수 있다는 점에 유의하십시오. 값 노드 집합 안의 노드 순서는 정의되어 있지 않으므로, 실패를 일으킬 노드에 도달한다는 보장은 없습니다. 따라서 처리를 예측 가능하게 만들기 위해, 모든 값 노드를 성공 없이 방문한 경우가 아니라면 실패는 조용히 무시됩니다.

다음 예제에서 ex:DuckFarmerShape에 부합하는 모든 노드는 ex:DuckSHACL 인스턴스ex:tendsAnimal 값을 적어도 하나 가져야 합니다.

sh:someValuesh:qualifiedValueShapesh:qualifiedMinCount 1의 조합을 위한 구문 설탕으로 간주할 수 있습니다.

또한 sh:someValue속성 셰이프에서 사용할 때 주로 의미가 있다는 점에 유의하십시오. 노드 셰이프에서 sh:someValuesh:node 또는 sh:property를 사용하는 것과 동등합니다.

7.8.4 sh:qualifiedValueShape, sh:qualifiedMinCount, sh:qualifiedMaxCount

sh:qualifiedValueShape는 지정된 수의 값 노드가 주어진 셰이프에 부합해야 한다는 조건을 지정합니다. 각 sh:qualifiedValueShape는 같은 주어에서 sh:qualifiedMinCount에 대한 값 하나, sh:qualifiedMaxCount에 대한 값 하나, 또는 각각에 대한 값 하나씩을 가질 수 있습니다.

매개변수:
속성 요약 및 구문 규칙
sh:qualifiedValueShape 지정된 수의 값 노드가 부합해야 하는 셰이프. 셰이프에서 sh:qualifiedValueShape의 값은 잘 형성된 셰이프여야 합니다. 노드 셰이프sh:qualifiedValueShape에 대해 어떤 값도 가질 수 없습니다. 이는 sh:QualifiedMinCountConstraintComponentsh:QualifiedMaxCountConstraintComponent필수 매개변수입니다.
sh:qualifiedValueShapesDisjoint 이는 sh:QualifiedMinCountConstraintComponentsh:QualifiedMaxCountConstraintComponent선택적 매개변수입니다. true로 설정되면 (계수할 때) 값 노드는 어떤 형제 셰이프에도 부합해서는 안 됩니다. 셰이프에서 sh:qualifiedValueShapesDisjoint의 값은 데이터타입이 xsd:boolean인 리터럴입니다.
sh:qualifiedMinCount 셰이프에 부합해야 하는 값 노드의 최소 개수. 셰이프에서 sh:qualifiedMinCount의 값은 데이터타입이 xsd:integer인 리터럴입니다. 이는 sh:QualifiedMinCountConstraintComponent필수 매개변수입니다.
sh:qualifiedMaxCount 셰이프에 부합할 수 있는 값 노드의 최대 개수. 셰이프에서 sh:qualifiedMaxCount의 값은 데이터타입이 xsd:integer인 리터럴입니다. 이는 sh:QualifiedMaxCountConstraintComponent필수 매개변수입니다.
형제 셰이프의 텍스트 정의
Q를 한정 카디널리티 제약을 선언하는 (즉 sh:qualifiedValueShape에 대한 값과 sh:qualifiedMinCount 또는 sh:qualifiedMaxCount 중 적어도 하나의 값을 가지는) 셰이프 그래프 G 안의 셰이프라고 합시다. psQsh:property으로 가지는 G 안의 셰이프들의 집합이라고 합시다. Qsh:qualifiedValueShapesDisjoint에 대한 으로 true를 가진다면, Q에 대한 형제 셰이프의 집합은 ps 안의 어떤 셰이프에 대해서든 SPARQL 속성 경로 sh:property/sh:qualifiedValueShape의 모든 집합에서 Q 자체의 sh:qualifiedValueShape 을 뺀 것으로 정의됩니다. 그렇지 않으면 형제 셰이프의 집합은 비어 있습니다.
sh:qualifiedMinCount의 텍스트 정의
$qualifiedValueShapesh:qualifiedValueShape이라고 합시다. $qualifiedMinCountsh:qualifiedMinCount에 대한 매개변수 값이라고 합시다. Cv$qualifiedValueShape부합하고, v현재 셰이프, 즉 v가 검증되는 대상이며 $qualifiedValueShapesh:qualifiedValueShape의 값으로 가지는 셰이프에 대한 어떤 형제 셰이프에도 부합하지 않는 값 노드 v의 수라고 합시다. 언급된 적합성 검사 중 어느 것이든 실패를 생성하면 실패가 생성되어야 MUST 합니다. 그렇지 않으면 C$qualifiedMinCount보다 작은 경우 검증 결과가 있습니다. sh:qualifiedMinCount에 대한 제약 컴포넌트sh:QualifiedMinCountConstraintComponent입니다.
sh:qualifiedMaxCount의 텍스트 정의
$qualifiedMaxCountsh:qualifiedMaxCount에 대한 매개변수 값이라고 합시다. C를 위의 sh:qualifiedMinCount에 대해 정의된 것과 같다고 합시다. 언급된 적합성 검사 중 어느 것이든 실패를 생성하면 실패가 생성되어야 MUST 합니다. 그렇지 않으면 C$qualifiedMaxCount보다 큰 경우 검증 결과가 있습니다. sh:qualifiedMaxCount에 대한 제약 컴포넌트sh:QualifiedMaxCountConstraintComponent입니다.

이 섹션의 나머지 부분은 비규범입니다.

다음 예제 셰이프는 속성 ex:parent가 정확히 두 개의 값을 가지고, 그중 적어도 하나가 여성이라는 조건을 지정하는 데 사용할 수 있습니다.

다음 예제는 sh:qualifiedValueShapesDisjoint를 사용하여 손이 ex:digit의 값을 최대 5개 가져야 하고(sh:maxCount를 사용하여 표현), 그중 정확히 하나는 ex:Thumb의 인스턴스여야 하며, 정확히 4개는 ex:Finger의 인스턴스여야 하고, 엄지와 손가락은 서로소여야 함을 표현하는 방법을 설명합니다. 즉, 한 손에서 어떤 손가락도 엄지로 함께 계산될 수 없습니다.

7.8.5 sh:reifierShape, sh:reificationRequired

sh:reifierShape속성 셰이프를 하나 이상의 노드 셰이프와 연결하는 데 사용할 수 있습니다. 모든 구상화자는 이러한 노드 셰이프에 부합해야 합니다.

제약 컴포넌트 IRI: sh:ReifierShapeConstraintComponent

매개변수:
속성 요약 및 구문 규칙
sh:reifierShape 이 트리플의 구상화자가 부합해야 하는 노드 셰이프. sh:reifierShape의 값은 잘 형성된 노드 셰이프여야 합니다. sh:reifierShape에 대한 값이 주어지면, sh:path 값은 IRI로 제한됩니다.
sh:reificationRequired 이는 sh:ReifierShapeConstraintComponent선택적 매개변수입니다. true로 설정되면, 데이터 그래프 안의 포커스 노드/경로 조합에 대해 적어도 하나의 구상화 값이 있어야 합니다. 셰이프에서 sh:reificationRequired의 값은 데이터타입이 xsd:boolean인 리터럴입니다.
텍스트 정의
t트리플 용어 (포커스 노드, $path, 값 노드)라고 합시다. 트리플 용어 t의 각 구상화자에 대해, 그 구상화자포커스 노드로 하여 노드 셰이프 $reifierShape에 대해 검증했을 때 실패가 생성되면 실패가 생성되어야 MUST 합니다. $reifierShape에 부합하지 않는 각 구상화자 t에 대해, tsh:value로 가지는 검증 결과가 있습니다.
sh:reificationRequired의 텍스트 정의
$reificationRequiredtrue로 설정되어 있고, 데이터 그래프 안에 트리플 용어 t에 대한 구상화된 문이 없다면, tsh:value로 가지는 검증 결과가 있습니다.

이 섹션의 나머지 부분은 비규범입니다.

7.9 기타 제약 컴포넌트

이 섹션은 다른 범주에 맞지 않는 Core 제약 컴포넌트를 열거합니다.

7.9.1 sh:closed, sh:ignoredProperties

RDF 데이터 모델은 엄청난 유연성을 제공합니다. 어떤 노드든 원칙적으로 어떤 속성에 대해서도 값을 가질 수 있습니다. 그러나 어떤 경우에는 어떤 속성이 노드에 적용될 수 있는지에 대한 조건을 지정하는 것이 합리적입니다. SHACL Core 언어에는 각 값 노드가 sh:property를 통해 셰이프에 지정된 속성 셰이프를 통해 명시적으로 열거된 속성에 대해서만 을 가진다는 조건을 지정하는 데 사용할 수 있는 sh:closed라는 속성이 포함되어 있습니다.

제약 컴포넌트 IRI: sh:ClosedConstraintComponent

매개변수:
속성 요약 및 구문 규칙
sh:closed 셰이프를 닫으려면 true로 설정. 셰이프에서 sh:closed의 값은 데이터타입이 xsd:boolean인 리터럴이거나 IRI sh:ByTypes입니다.
sh:ignoredProperties sh:property를 통해 명시적으로 열거된 속성에 더해 추가로 허용되는 속성들의 선택적 SHACL 목록. 셰이프에서 sh:ignoredProperties의 값은 SHACL 목록이어야 합니다. 그러한 목록의 각 구성원IRI여야 합니다.
텍스트 정의
$closedsh:closed에 대한 매개변수 값이라고 합시다. $ignoredPropertiessh:ignoredProperties에 대한 이라고 합시다.

$closedtrue 또는 sh:ByTypes이고 P가 아래에 정의된 속성들의 집합이라면, 값 노드주어로 가지고, P에 속하지 않는 술어를 가지는 각 트리플에 대해 검증 결과가 있습니다. $ignoredProperties가 값을 가지면 이 SHACL 목록구성원으로 열거된 속성도 값 노드에 대해 허용됩니다. 검증 결과는 트리플의 술어sh:resultPath로, 트리플의 목적어sh:value로 가져야 MUST 합니다.

$closedtrue이면, P는 현재 셰이프에서 SPARQL 경로 sh:property/sh:path를 통해 도달할 수 있는 IRI 속성들의 집합입니다.

$closedsh:ByTypes이면, P는 다음 알고리즘을 통해 값 노드에서 도달할 수 있는 IRI 속성들의 집합에 rdf:type을 더한 것입니다:
function collectProperties(S)
    SPARQL 경로 sh:property/sh:path를 통해 S에서 도달할 수 있는
            모든 IRI 속성을 추가
    if S is a SHACL instance of rdfs:Class in the shapes graph {
        for each triple in the shapes graph matching (S rdfs:subClassOf ?o)
            collectProperties(?o)
        for each triple in the shapes graph matching (?s sh:targetClass S)
            collectProperties(?s)
    }
    if S is a SHACL instance of sh:NodeShape in the shapes graph
        for each triple in the shapes graph matching (S sh:node ?o)
            collectProperties(?o)

for each rdf:type T of the value node in the data graph
    collectProperties(T)
구현은 위 알고리즘에서 같은 S를 두 번 방문하지 못하게 하여 무한 루프를 피해야 한다는 점에 유의하십시오.

이 섹션의 나머지 부분은 비규범입니다.

다음 예제는 특정 포커스 노드가 ex:firstNameex:lastName에 대해서만 값을 가진다는 조건을 지정하기 위해 셰이프에서 sh:closed를 사용하는 방법을 설명합니다. "무시되는" 속성 rdf:type도 허용됩니다.

sh:closed sh:ByTypes의 사용 사례에는 현재 값 노드 타입의 상위 클래스 (rdfs:subClassOf를 통해)에 선언된 속성뿐 아니라, sh:targetClass를 통해 그 타입에 연결된 다른 셰이프와 sh:node를 통해 한 노드 셰이프에서 다른 노드 셰이프로 도달할 수 있는 셰이프가 포함됩니다. sh:ByTypes의 예는 테스트 케이스 라이브러리에서 찾을 수 있습니다: closed-003.ttl, closed-004.ttl.

7.9.2 sh:hasValue

sh:hasValue는 적어도 하나의 값 노드가 주어진 RDF 용어와 같아야 한다는 조건을 지정합니다.

제약 컴포넌트 IRI: sh:HasValueConstraintComponent

매개변수:
속성 요약 및 구문 규칙
sh:hasValue 특정 필수 값.
텍스트 정의
$hasValuesh:hasValue에 대한 매개변수 값이라고 합시다. RDF 용어 $hasValue값 노드들 중에 없으면, 검증 결과가 있습니다.

이 섹션의 나머지 부분은 비규범입니다.

7.9.3 sh:in

sh:in은 각 값 노드가 제공된 SHACL 목록구성원이라는 조건을 지정합니다.

제약 컴포넌트 IRI: sh:InConstraintComponent

매개변수:
속성 요약 및 구문 규칙
sh:in 허용된 값들을 구성원으로 가지는 SHACL 목록. 셰이프에서 sh:in의 각 값은 SHACL 목록입니다. 셰이프는 sh:in에 대해 최대 하나의 값을 가집니다. 그러한 각 목록은 적어도 하나의 구성원을 가져야 SHOULD 합니다.
텍스트 정의
$insh:in이라고 합시다. $in구성원이 아닌 각 값 노드에 대해, 그 값 노드sh:value로 가지는 검증 결과가 있습니다.

이 섹션의 나머지 부분은 비규범입니다.

리터럴의 일치는 정확해야 한다는 점에 유의하십시오. 예를 들어 "04"^^xsd:byte"4"^^xsd:integer와 일치하지 않습니다.

7.9.4 sh:rootClass

sh:rootClass가 지정하는 조건은 각 값 노드가 주어진 클래스이거나 그 클래스의 (전이적) 하위 클래스라는 것입니다.

제약 컴포넌트 IRI: sh:RootClassConstraintComponent

매개변수:
속성 요약 및 구문 규칙
sh:rootClass 모든 값 노드가 속해야 하는 클래스 계층의 루트(들). 셰이프에서 sh:rootClass의 값은 IRI이거나, 모든 구성원IRI잘 형성된 SHACL 목록빈 노드입니다.
텍스트 정의
$rootClasssh:rootClass에 대한 매개변수 값이라고 합시다. classesIRI들의 집합이라고 합시다. 이때 $rootClassIRI라면 그 집합은 정확히 해당 IRI만으로 구성되고, $rootClass빈 노드 SHACL 목록이라면 그 집합은 정확히 그 목록의 구성원들로 구성됩니다.

값 노드IRI가 아니거나, classes 안에 데이터 그래프valueNode rdfs:subClassOf* class를 수반하는 class가 존재하지 않는 IRI라면, 그 값 노드sh:value로 가지는 검증 결과가 있습니다.

이 섹션의 나머지 부분은 비규범입니다.

sh:rootClass 제약은 일반적으로 값으로 클래스를 가질 수 있는 속성 셰이프(예: sh:class rdfs:Class를 통해)와 함께 사용되어 값 노드에 허용된 하위 클래스 계층을 제한합니다. 주어진 클래스는 허용된 클래스 계층의 상한 역할을 합니다.

7.9.5 sh:uniqueValuesFor

sh:uniqueValuesFor값 노드의 하나 이상의 지정된 속성 값이 현재 셰이프의 모든 대상 노드 안에서 고유해야 한다는 조건을 지정합니다.

제약 컴포넌트 IRI: sh:UniqueValuesForConstraintComponent

매개변수:
속성 요약 및 구문 규칙
sh:uniqueValuesFor 속성의 IRI이거나, 각 구성원이 속성의 IRISHACL 목록.
텍스트 정의
$uniqueValuesForshape S 안의 sh:uniqueValuesFor이라고 하자. $properties를 다음과 같은 집합이라고 하자: $uniqueValuesForIRI이면 $properties = { uniqueValuesFor }이다. $uniqueValuesForSHACL 목록이면, $properties는 그 목록의 멤버들의 집합이다. $targetNodesS대상 노드들이라고 하자.
값 노드 V에 대해, $targetNodes 안에 V$properties의 모든 속성에 대해 정확히 같은 들을 가지는 또 다른 노드가 존재하면, 검증 결과가 있다. V$properties 안의 어떤 속성에 대해서도 을 가지지 않으면 결과는 생성되지 않는다.

이 섹션의 나머지 부분은 비규범입니다.

리터럴의 일치는 정확해야 한다는 점에 유의하십시오. 예를 들어 "04"^^xsd:byte"4"^^xsd:integer와 일치하지 않습니다. 또한 sh:uniqueValuesFor는 이러한 값의 존재를 규정하지 않으므로 보통 sh:minCount 1 제약과 함께 사용됩니다.

대상 노드의 계산은 셰이프의 정의, 예를 들어 sh:uniqueValuesFor 제약도 보유하는 셰이프의 sh:targetClass 선언에만 의존한다는 점에 유의하십시오.

8. 검증하지 않는 셰이프 특성

이 섹션은 비규범입니다.

이전 섹션들이 검증 조건을 나타내는 속성을 소개한 반면, 이 섹션은 SHACL 프로세서가 무시하는 속성을 다룹니다. 이른바 이러한 검증하지 않는 속성의 사용은 전적으로 선택 사항이며 형식적 해석 계약의 대상이 아닙니다. 이들은 폼 구축, 코드 생성 또는 RDF 파일의 예측 가능한 출력과 같은 목적으로 사용될 수 있습니다.

8.1 sh:name 및 sh:description

속성 셰이프는 해당 속성이 나타나는 대상 안에서 그 속성에 대해 사람이 읽을 수 있는 레이블을 제공하기 위해 sh:name에 대해 하나 이상의 을 가질 수 있습니다. 존재한다면 도구는 rdf:Property 자체에 전역적으로 지정된 레이블보다 이러한 로컬로 지정된 레이블을 선호해야 합니다. 예를 들어 폼이 sh:name이 있는 주어진 속성 셰이프의 대상 안에 있는 노드를 표시한다면, 도구는 제공된 이름을 사용해야 합니다. sh:name데이터타입xsd:string, rdf:dirLangString, 또는 rdf:langString리터럴이어야 합니다.

마찬가지로, 속성 셰이프는 주어진 맥락에서 속성에 대한 설명을 제공하기 위해 sh:description에 대한 값을 가질 수 있습니다. sh:description데이터타입xsd:string, rdf:dirLangString, rdf:langString, 또는 rdf:HTML리터럴이어야 합니다.

sh:namesh:description은 모두 여러 을 가질 수 있지만, 언어 태그당 하나의 만 가져야 합니다.

sh:namesh:description노드 셰이프에는 사용해서는 NOT 안 된다는 점에 유의하십시오. 노드 셰이프의 경우 속성 rdfs:labelrdfs:comment가 잘 확립되어 있으며 이미 클래스 정의에 사용됩니다.

8.2 sh:intent

셰이프는 sh:intent에 대한 을 가질 수 있으며, 그 값은 데이터타입xsd:string, rdf:langString 또는 rdf:dirLangString리터럴이어야 합니다.

속성 sh:intent는 셰이프와 관련된 하나 이상의 의도된 규칙, 가정 또는 제약에 대한 사람이 읽을 수 있는 설명을 제공합니다.

일반 문서화나 편집 텍스트를 포함할 수 있는 rdfs:comment와 달리, 그리고 속성 값의 의미를 설명하는 sh:description과 달리, sh:intent는 셰이프의 의도된 의미론을 표현하는 개별 규칙 같은 문장을 포착하기 위한 것입니다.

서로 다른 의도된 규칙을 나타내기 위해 sh:intent의 여러 값을 제공할 수 있습니다. 이러한 규칙 중 일부는 SHACL 제약 컴포넌트를 사용해 이미 형식적으로 표현된 제약과 겹칠 수 있습니다. sh:intent의 값이 같은 셰이프 그래프 안에서 형식적으로도 표현된 의미론을 나타낼 때, sh:intent 문장의 트리플은 속성 값 sh:formalized true로 구상화될 수 있습니다. 그러나 sh:intent의 존재나 내용은 SHACL 검증 또는 적합성에 영향을 주어서는 MUST NOT 안 됩니다.

8.3 sh:agentInstruction

셰이프는 sh:agentInstruction에 대한 을 가질 수 있으며, 그 값은 데이터타입xsd:string, rdf:langString, 또는 rdf:dirLangString리터럴이어야 합니다.

이 속성은 자연어를 이해하는 소프트웨어 에이전트에게 보낼 수 있는 텍스트 지침을 나타내는 데 사용할 수 있습니다.

참고

이 속성은 rdfs:comment, sh:description, rdfs:label, sh:name, sh:intent, 그리고 sh:message의 유사한 텍스트 설명과 함께 사용되어, 셰이프의 의미론적 해석에 대해 소프트웨어 에이전트에게 지시할 수 있습니다.

8.4 sh:codeIdentifier

셰이프는 API, 질의 언어 및 유사한 프로그래밍 방식 접근에서 셰이프의 표현에 사용할 수 있는 이름을 제안하기 위해 sh:codeIdentifier에 대해 하나의 을 가질 수 있습니다. sh:codeIdentifier의 값은 문자열이 정규 표현식 ^[a-zA-Z_][a-zA-Z0-9_]*$와 일치하는 데이터타입 xsd:string리터럴입니다.

참고

전형적인 사용 사례는 셰이프로부터 GraphQL 질의 스키마를 생성하고, 속성 셰이프를 GraphQL 필드에 매핑하는 것입니다. 기본적으로 이러한 스키마 생성기는 sh:path의 로컬 이름을 사용할 수 있지만, sh:codeIdentifier가 존재한다면 이를 사용해야 합니다. 복잡한 경로 표현식의 경우 명시적인 sh:codeIdentifier가 강력히 권장됩니다. 유사한 요구사항은 예를 들어 Java, JavaScript 또는 Python의 API 생성기에도 존재합니다.

8.5 sh:unit

셰이프는 값 노드에 대한 측정 단위, 통화 또는 유사한 정보를 나타내기 위해 속성 sh:unit에 대한 을 가질 수 있습니다. sh:unit의 값은 데이터타입 xsd:string 또는 rdf:langString 또는 rdf:dirLangString리터럴이거나, IRI일 수 있습니다. SHACL 1.2는 sh:unit에 대한 특정 값을 규정하지 않습니다. 작성 시점(2026년)에 이를 균일하게 나타낼 공식 W3C 표준이 없었고, W3C 밖에 여러 표준이 존재했기 때문입니다.

SHACL 1.2에 대해서는 다음 권장사항이 제공됩니다:

이러한 구문 규칙은 의도적으로 유연하게 남겨져 있지만, 특정 애플리케이션은 더 구체적인 규칙을 강제할 수 있습니다; 예를 들어 sh:unit 속성에 sh:class qudt:Unit 제약을 선언함으로써 그렇게 할 수 있습니다.

SHACL 기반 사용자 인터페이스 도구는 sh:unit의 값을 사용하여 값을 렌더링할 수 있습니다. 사용자의 로캘에 따라 이러한 도구는 단위 간 변환을 자동으로 수행할 수도 있고, 실제 값이 저장될 단위와 다른 단위로 데이터 입력을 허용할 수도 있습니다.

참고

SHACL Core는 sh:unit에 대한 특정 의미론을 지정하지 않지만, 일부 SHACL 기반 확장은 검증을 포함한 다른 목적에 단위를 사용할 수 있습니다. 예를 들어, 속성이 sh:unit "K"를 선언한 모든 리터럴에 대해 sh:minInclusive 0 제약을 강제하는 셰이프를 정의할 수 있습니다.

위 예제의 다음 변형은 노드 셰이프를 사용하여 단위뿐 아니라 최솟값 같은 제약도 포함하는 "유로 가격"의 재사용 가능한 정의를 캡슐화합니다.

8.6 sh:order

속성 셰이프는 폼 구축과 같은 목적을 위해 속성 셰이프의 상대적 순서를 나타내기 위해 속성 sh:order에 대해 하나의 을 가질 수 있습니다. sh:order의 값은 데이터타입xsd:decimal 또는 xsd:integer리터럴입니다. sh:order는 검증 목적으로 사용되지 않으며, 어떤 타입의 주어와도 함께 사용될 수 있습니다. 속성 셰이프에 존재한다면, sh:order의 권장 사용 방식은 속성 셰이프를 오름차순으로 정렬하는 것입니다. 예를 들어 더 작은 order를 가진 속성이 더 큰 order를 가진 속성보다 위쪽 또는 시작 지점(왼쪽에서 오른쪽으로 쓰는 언어에서는 왼쪽)에 배치되도록 하는 것입니다.

8.7 sh:group

속성 셰이프는 속성 sh:group을 사용하여 클래스 sh:PropertyGroupSHACL 인스턴스에 연결함으로써 셰이프가 관련 속성 셰이프 그룹에 속함을 나타낼 수 있습니다. 각 그룹은 폼 구축을 위한 rdfs:label과 같이 애플리케이션 목적에 쓰이는 추가 트리플을 가질 수 있습니다. 그룹은 같은 폼 안에서 그룹들의 상대적 순서를 나타내기 위해 sh:order 속성도 가질 수 있습니다.

다음 예제는 이러한 다양한 기능을 함께 사용하는 방법을 설명합니다.

폼 구축 애플리케이션은 위 정보를 사용하여 다음과 같이 정보를 표시할 수 있습니다:

이름
이름: John
성: Doe
주소
도로명 주소: 123 Silverado Ave
지역: Cupertino
우편번호: 54321

같은 정보는 트리플의 순서를 바꾸지만 sh:order 값은 바꾸지 않는 다음 예제로도 생성된다는 점에 유의하십시오:

참고
xsd:string, rdf:langString, rdf:dirLangString, 또는 rdf:HTML 타입의 리터럴을 받는 술어의 경우, 사용자는 xsd:string을 피하고 rdf:langString 또는 rdf:dirLangString을 선호해야 합니다. 국제화를 지원하고 양방향 텍스트를 올바르게 처리하기 위해 언어 태그와, 적절한 경우 방향성 표지를 사용하는 것이 권장됩니다.

부록

A. SHACL 구문 규칙 요약

이 섹션은 SHACL의 모든 규범적 구문 규칙을 열거합니다. 이 섹션은 이 명세의 다른 부분에서 자동으로 생성되며, 규칙의 맥락이 불명확한 경우 본문으로 돌아가는 하이퍼링크가 제공됩니다. 셰이프 그래프에서 이러한 규칙을 위반하는 노드는 잘못 형성된 것입니다.

구문 규칙 Id 구문 규칙 텍스트
SHACL-list RDF 그래프 G 안의 SHACL 목록IRI 또는 빈 노드로, rdf:nil(단, rdf:nilrdf:first 또는 rdf:rest 어느 것에 대해서도 을 갖지 않는 경우)이거나, G 안에서 속성 rdf:first에 대해 정확히 하나의 을 가지고, G 안에서 속성 rdf:rest에 대해 정확히 하나의 을 가지며, 그 값 역시 G 안의 SHACL 목록이고, 그 목록이 G 안에서 속성 경로 rdf:rest+의 값으로 자기 자신을 갖지 않는 것입니다.
entailment-nodeKind 속성 sh:entailment은 IRI입니다.
shape 셰이프IRI 또는 빈 노드 s이며, 셰이프 그래프에서 다음 조건 중 적어도 하나를 충족합니다:
multiple-parameters sh:PatternConstraintComponent와 같은 일부 제약 컴포넌트는 둘 이상의 매개변수를 선언합니다. 그러한 컴포넌트의 매개변수 중 어느 것에 대해서든 둘 이상의 값을 가지는 셰이프는 잘못 형성된 것입니다.
targetNode-nodeKind 셰이프 안의 sh:targetNode의 각 은 잘 형성된 노드 표현식입니다.
targetClass-nodeKind 셰이프 안의 sh:targetClass의 각 값은 IRI입니다.
implicit-targetClass-nodeKind s가 RDF 그래프 G 안에서 sh:NodeShape 또는 sh:PropertyShapeSHACL 인스턴스이고, s가 또한 G 안에서 rdfs:ClassSHACL 인스턴스이며, sIRI가 아니라면 sG 안의 잘못 형성된 셰이프입니다.
targetSubjectsOf-nodeKind 셰이프 안의 sh:targetSubjectsOfIRI입니다.
targetObjectsOf-nodeKind 셰이프 안의 sh:targetObjectsOfIRI입니다.
targetWhere-node 셰이프 안의 sh:targetWhere의 각 값은 잘 형성된 셰이프입니다.
shape-nodeKind sh:shape의 각 IRI입니다.
severity-maxCount 셰이프는 셰이프 그래프 안에서 속성 sh:severity에 대해 하나의 을 지정할 수 있습니다.
severity-nodeKind sh:severity의 각 값은 IRI입니다.
severity-reifier-maxCount T셰이프 안의 제약을 나타내는 트리플의 집합이라고 합시다. 셰이프 그래프T 안의 트리플구상화자 안에서 속성 sh:severity에 대해 최대 하나의 을 지정할 수 있습니다.
message-datatype sh:message의 값은 데이터타입xsd:string, rdf:dirLangString, rdf:langString, 또는 rdf:HTML리터럴입니다. 한 주어는 같은 언어 태그를 가진 sh:message 값을 둘 이상 가져서는 안 되며, 데이터타입 xsd:string인 값을 여러 개 가져서도 안 됩니다.
message-reifier-maxCount T셰이프 안의 제약을 나타내는 트리플의 집합이라고 합시다. 셰이프 그래프T 안의 트리플구상화자 안에서 속성 sh:message에 대해 최대 하나의 을 지정할 수 있습니다.
deactivated-maxCount 셰이프는 속성 sh:deactivated에 대해 최대 하나의 값을 가질 수 있습니다.
deactivated-datatype sh:deactivated의 값은 (유일한) 출력 노드true 또는 false 중 하나를 가져야 하는 노드 표현식입니다.
deactivated-reified-maxCount 셰이프주어로 가지고, sh:minCount와 같은 매개변수술어로 가지는 트리플은 속성 sh:deactivated에 대한 을 가진 구상화자를 최대 하나 가질 수 있습니다.
NodeShape-path-maxCount sh:NodeShapeSHACL 인스턴스는 속성 sh:path에 대한 을 가질 수 없습니다.
PropertyShape 속성 셰이프셰이프 그래프 안의 셰이프로, sh:path를 그 술어로 가지는 트리플주어입니다.
path-maxCount 셰이프는 sh:path에 대해 최대 하나의 을 가집니다.
path-node 속성 셰이프 안의 sh:path잘 형성된 SHACL 속성 경로입니다.
PropertyShape-path-minCount sh:PropertyShapeSHACL 인스턴스는 속성 sh:path에 대해 하나의 을 가집니다.
path-values 속성 셰이프는 속성 sh:values에 대해 최대 하나의 을 가지며, 이 잘 형성된 노드 표현식입니다.
path-defaultValue 속성 셰이프는 속성 sh:defaultValue에 대해 최대 하나의 을 가지며, 이 잘 형성된 노드 표현식입니다.
path-values-iri 속성 셰이프sh:path에 대한 술어 경로일 때에만 sh:values 및/또는 sh:defaultValue에 대한 을 가질 수 있습니다.
path-metarule RDF 그래프 안의 노드는 다음 하위 섹션들의 구문 규칙 중 정확히 하나를 만족하는 경우 잘 형성된 SHACL 속성 경로 p입니다.
path-non-recursive p가 빈 노드이고 p의 어떤 경로 매핑이든 직접 또는 전이적으로 p를 참조한다면, 노드 p잘 형성된 SHACL 속성 경로가 아닙니다.
path-sequence 시퀀스 경로는 적어도 두 개의 구성원을 가진 SHACL 목록빈 노드이며, 각 구성원은 잘 형성된 SHACL 속성 경로입니다.
path-alternative 대체 경로G 안에서 정확히 하나의 트리플의 주어인 빈 노드입니다. 이 트리플은 sh:alternativePath를 술어로, L을 목적어로 가지며, L은 적어도 두 개의 구성원을 가진 SHACL 목록이고, L의 각 구성원은 잘 형성된 SHACL 속성 경로입니다.
path-inverse 역 경로G 안에서 정확히 하나의 트리플주어빈 노드입니다. 이 트리플은 sh:inversePath를 술어로 가지며, 목적어 v잘 형성된 SHACL 속성 경로입니다.
path-zero-or-more zero-or-more 경로G 안에서 정확히 하나의 트리플주어빈 노드입니다. 이 트리플은 sh:zeroOrMorePath술어로 가지며, 목적어 v잘 형성된 SHACL 속성 경로입니다.
path-one-or-more one-or-more 경로G 안에서 정확히 하나의 트리플주어빈 노드입니다. 이 트리플은 sh:oneOrMorePath술어로 가지며, 목적어 v잘 형성된 SHACL 속성 경로입니다.
path-zero-or-one zero-or-one 경로G 안에서 정확히 하나의 트리플주어빈 노드입니다. 이 트리플은 sh:zeroOrOnePath술어로 가지며, 목적어 v잘 형성된 SHACL 속성 경로입니다.
IRIExpression-syntax RDF 그래프 안의 노드는 IRI라면 잘 형성된 IRI 표현식입니다.
LiteralExpression-syntax RDF 그래프 안의 노드는 리터럴이라면 잘 형성된 리터럴 표현식입니다.
ShapesGraph sh:ShapesGraph 클래스는 일반적으로 셰이프 그래프의 역할을 하는 그래프의 IRIrdf:type으로 사용될 MAY 있습니다.
DataGraph sh:DataGraph 클래스는 일반적으로 데이터 그래프로 사용되는 그래프의 IRIrdf:type으로 사용될 MAY 있습니다.
shapesGraph-nodeKind sh:shapesGraph의 모든 IRI입니다
class-nodeKind 셰이프 안의 sh:class의 값은 IRI 또는 모든 구성원IRI잘 형성된 SHACL 목록빈 노드입니다.
datatype-maxCount 셰이프는 sh:datatype에 대해 최대 하나의 값을 가집니다.
datatype-nodeKind 셰이프 안의 sh:datatype의 값은 IRI 또는 모든 구성원IRI잘 형성된 SHACL 목록빈 노드입니다.
nodeKind-maxCount 셰이프는 sh:nodeKind에 대해 최대 하나의 값을 가집니다.
nodeKind-in sh:nodeKind의 값이 IRI라면, 셰이프 안의 sh:nodeKind의 값은 클래스 sh:NodeKind의 다음 일곱 인스턴스 중 하나입니다: sh:BlankNode, sh:IRI, sh:Literal sh:BlankNodeOrIRI, sh:BlankNodeOrLiteral, sh:IRIOrLiteral, 및 sh:TripleTerm.

sh:nodeKind의 값이 잘 형성된 SHACL 목록이라면, 셰이프 안에서 그러한 목록의 구성원은 클래스 sh:NodeKind의 다음 네 인스턴스 중 하나입니다: sh:BlankNode, sh:IRI, sh:Literal, 및 sh:TripleTerm.
minCount-scope 노드 셰이프sh:minCount에 대해 어떤 값도 가질 수 없습니다.
minCount-maxCount 속성 셰이프sh:minCount에 대해 최대 하나의 값을 가집니다.
minCount-datatype 속성 셰이프 안의 sh:minCount의 값은 데이터타입이 xsd:integer인 리터럴입니다.
maxCount-scope 노드 셰이프sh:maxCount에 대해 어떤 값도 가질 수 없습니다.
maxCount-maxCount 속성 셰이프sh:maxCount에 대해 최대 하나의 값을 가집니다.
maxCount-datatype 속성 셰이프 안의 sh:maxCount의 값은 데이터타입이 xsd:integer인 리터럴입니다.
minExclusive-nodeKind 셰이프 안의 sh:minExclusive의 값은 리터럴입니다.
minExclusive-maxCount 셰이프는 sh:minExclusive에 대해 최대 하나의 값을 가집니다.
minInclusive-nodeKind 셰이프 안의 sh:minInclusive의 값은 리터럴입니다.
minInclusive-maxCount 셰이프는 sh:minInclusive에 대해 최대 하나의 값을 가집니다.
maxExclusive-nodeKind 셰이프 안의 sh:maxExclusive의 값은 리터럴입니다.
maxExclusive-maxCount 셰이프는 sh:maxExclusive에 대해 최대 하나의 값을 가집니다.
maxInclusive-nodeKind 셰이프 안의 sh:maxInclusive의 값은 리터럴입니다.
maxInclusive-maxCount 셰이프는 sh:maxInclusive에 대해 최대 하나의 값을 가집니다.
minLength-datatype 셰이프 안의 sh:minLength의 값은 데이터타입이 xsd:integer인 리터럴입니다.
minLength-maxCount 셰이프는 sh:minLength에 대해 최대 하나의 값을 가집니다.
maxLength-datatype 셰이프 안의 sh:maxLength의 값은 데이터타입이 xsd:integer인 리터럴입니다.
maxLength-maxCount 셰이프는 sh:maxLength에 대해 최대 하나의 값을 가집니다.
pattern-datatype 셰이프 안의 sh:pattern의 값은 데이터타입이 xsd:string인 리터럴입니다.
pattern-regex 셰이프 안의 sh:pattern의 값은 SPARQL REGEX 함수에 대한 유효한 pattern 인자입니다.
flags-datatype 셰이프 안의 sh:flags의 값은 데이터타입이 xsd:string인 리터럴입니다.
singleLine-datatype 셰이프 안의 sh:singleLine의 값은 데이터타입이 xsd:boolean인 리터럴입니다.
singleLine-maxCount 셰이프는 sh:singleLine에 대해 최대 하나의 값을 가집니다.
languageIn-node 셰이프 안의 sh:languageIn의 각 값은 SHACL 목록입니다.
languageIn-members-datatype 그러한 목록의 각 구성원은 데이터타입이 xsd:string인 리터럴입니다.
languageIn-maxCount 셰이프는 sh:languageIn에 대해 최대 하나의 값을 가집니다.
uniqueLang-datatype 셰이프 안의 sh:uniqueLang의 값은 데이터타입이 xsd:boolean인 리터럴입니다.
uniqueLang-maxCount 속성 셰이프는 sh:uniqueLang에 대해 최대 하나의 값을 가집니다.
uniqueLang-scope 노드 셰이프sh:uniqueLang에 대해 어떤 값도 가질 수 없습니다.
memberShape-node sh:memberShape의 값은 잘 형성된 노드 셰이프여야 합니다.
minListLength-datatype 셰이프 안의 sh:minListLength의 값은 데이터타입이 xsd:integer인 리터럴입니다.
minListLength-minInclusive 셰이프 안의 sh:minListLength의 값은 0 이상의 정수입니다.
maxListLength-datatype 셰이프 안의 sh:maxListLength의 값은 데이터타입이 xsd:integer인 리터럴입니다.
maxListLength-minInclusive 셰이프 안의 sh:maxListLength의 값은 0 이상의 정수입니다.
uniqueMembers-datatype 셰이프 안의 sh:uniqueMembers의 값은 데이터타입이 xsd:boolean인 리터럴입니다.
equals-nodeKind 셰이프 안의 sh:equals의 값은 잘 형성된 SHACL 속성 경로입니다.
disjoint-nodeKind 셰이프 안의 sh:disjoint의 값은 잘 형성된 SHACL 속성 경로입니다.
subsetOf-nodeKind 셰이프 안의 sh:subsetOf의 값은 잘 형성된 SHACL 속성 경로입니다.
lessThan-nodeKind 셰이프 안의 sh:lessThan의 값은 잘 형성된 SHACL 속성 경로입니다.
lessThan-scope 노드 셰이프sh:lessThan에 대해 어떤 값도 가질 수 없습니다.
lessThanOrEquals-nodeKind 셰이프 안의 sh:lessThanOrEquals의 값은 잘 형성된 SHACL 속성 경로입니다.
lessThanOrEquals-scope 노드 셰이프sh:lessThanOrEquals에 대해 어떤 값도 가질 수 없습니다.
not-node 셰이프 안의 sh:not의 값은 잘 형성된 셰이프여야 합니다.
and-node 셰이프 안의 sh:and의 각 값은 SHACL 목록입니다.
and-members-node 그러한 목록의 각 구성원잘 형성된 셰이프여야 합니다.
or-node 셰이프 안의 sh:or의 각 값은 SHACL 목록입니다.
or-members-node 그러한 목록의 각 구성원잘 형성된 셰이프여야 합니다.
xone-node 셰이프 안의 sh:xone의 각 값은 SHACL 목록입니다.
xone-members-node 그러한 목록의 각 구성원잘 형성된 셰이프여야 MUST 합니다.
xone-minListLength 그러한 각 목록은 적어도 하나의 구성원을 가져야 SHOULD 합니다.
node-node 셰이프 안의 sh:node의 값은 잘 형성된 노드 셰이프여야 합니다.
property-node 셰이프 안의 sh:property의 각 값은 잘 형성된 속성 셰이프여야 합니다.
someValue-shape 셰이프 안의 sh:someValue의 값은 잘 형성된 셰이프여야 합니다.
qualifiedValueShape-node 셰이프 안의 sh:qualifiedValueShape의 값은 잘 형성된 셰이프여야 합니다.
qualifiedValueShape-scope 노드 셰이프sh:qualifiedValueShape에 대해 어떤 값도 가질 수 없습니다.
qualifiedValueShapesDisjoint-datatype 셰이프 안의 sh:qualifiedValueShapesDisjoint의 값은 데이터타입이 xsd:boolean인 리터럴입니다.
qualifiedMinCount-datatype 셰이프 안의 sh:qualifiedMinCount의 값은 데이터타입이 xsd:integer인 리터럴입니다.
qualifiedMaxCount-datatype 셰이프 안의 sh:qualifiedMaxCount의 값은 데이터타입이 xsd:integer인 리터럴입니다.
reifierShape-node sh:reifierShape의 값은 잘 형성된 노드 셰이프여야 합니다. sh:reifierShape에 대한 값이 주어지면, sh:path 값은 IRI로 제한됩니다.
reificationRequired-datatype 셰이프 안의 sh:reificationRequired의 값은 데이터타입이 xsd:boolean인 리터럴입니다.
closed-datatype 셰이프 안의 sh:closed의 값은 데이터타입이 xsd:boolean인 리터럴이거나 IRI sh:ByTypes입니다.
ignoredProperties-node 셰이프 안의 sh:ignoredProperties의 값은 SHACL 목록이어야 합니다.
ignoredProperties-members-nodeKind 그러한 목록의 각 구성원IRI여야 합니다.
in-node 셰이프 안의 sh:in의 각 값은 SHACL 목록입니다.
in-maxCount 셰이프는 sh:in에 대해 최대 하나의 값을 가집니다.
in-minListLength 그러한 각 목록은 적어도 하나의 구성원을 가져야 SHOULD 합니다.
rootClass-nodeKind 셰이프 안의 sh:rootClass의 값은 IRI 또는 모든 구성원IRI잘 형성된 SHACL 목록빈 노드입니다.
uniqueValuesFor-node 속성의 IRI이거나, 각 구성원이 속성의 IRISHACL 목록입니다.

B. 셰이프 그래프를 검증하기 위한 SHACL 셰이프

이 섹션은 비규범입니다.

SHACL 1.2 Overview의 SHACL-SHACL 부록은 다른 SHACL 셰이프 그래프를 검증하는 데 사용할 수 있고, 따라서 다양한 SHACL 명세를 따르는 것을 목표로 하는 RDF 데이터와 관련된 많은 구문적 제약을 강제할 수 있는 SHACL 그래프를 설명합니다.

SHACL-SHACL 셰이프 그래프는 명세별로 제공되며, Overview의 부록에 표시된 것처럼 http://www.w3.org/ns/shacl-shacl에서 번들된 'union'으로도 제공됩니다.

C. SHACL Core 검증기 요약

이 섹션은 SHACL Core의 모든 규범적 검증기를 열거합니다. 이 섹션은 이 명세의 다른 부분에서 자동으로 생성되며, 검증기의 맥락이 불명확한 경우 본문으로 돌아가는 하이퍼링크가 제공됩니다.

제약 컴포넌트별 검증기
sh:ClassConstraintComponent: $classsh:class에 대한 매개변수 값이라고 합시다. classesIRI들의 집합으로 둡시다. 이때 $classIRI라면 그 집합은 정확히 해당 IRI만으로 구성되고, $class빈 노드 SHACL 목록이라면 그 집합은 정확히 목록의 구성원들로 구성됩니다.

값 노드리터럴이거나, 리터럴이 아니면서 데이터 그래프 안에서 classes 중 어느 것의 SHACL 인스턴스도 아닌 각 노드에 대해, 그 값 노드sh:value로 가지는 검증 결과가 있습니다.
sh:DatatypeConstraintComponent: $datatypesh:datatype에 대한 매개변수 값이라고 합시다. datatypesIRI들의 집합으로 둡시다. 이때 $datatypeIRI라면 그 집합은 정확히 해당 IRI만으로 구성되고, $datatype빈 노드 SHACL 목록이라면 그 집합은 정확히 목록의 구성원들로 구성됩니다.

값 노드리터럴이 아니거나, datatypes 중 어느 것과도 일치하지 않는 데이터타입을 가진 리터럴인 각 노드에 대해, 그 값 노드sh:value로 가지는 검증 결과가 있습니다.

리터럴의 데이터타입은 SPARQL 1.2의 datatype 함수를 따라 결정됩니다. 리터럴은 그 리터럴의 데이터타입이 같은 IRI를 가지고, SPARQL 1.2가 지원하는 데이터타입의 경우 ill-typed 리터럴이 아니라면 데이터타입과 일치합니다.
sh:NodeKindConstraintComponent: $nodeKindsh:nodeKind에 대한 매개변수 값이라고 합시다. $nodeKindsIRI들의 집합으로 둡시다. 이때 $nodeKindIRI라면 그 집합은 정확히 해당 IRI만으로 구성되고, $nodeKind빈 노드 SHACL 목록이라면 그 집합은 정확히 목록의 구성원들로 구성됩니다.

$nodeKinds 중 어느 것과도 일치하지 않는 각 값 노드에 대해, 그 값 노드sh:value로 가지는 검증 결과가 있습니다. 모든 IRIsh:IRI, sh:BlankNodeOrIRIsh:IRIOrLiteral에만 일치합니다. 모든 빈 노드sh:BlankNode, sh:BlankNodeOrIRIsh:BlankNodeOrLiteral에만 일치합니다. 모든 리터럴sh:Literal, sh:BlankNodeOrLiteralsh:IRIOrLiteral에만 일치합니다. 모든 트리플 용어sh:TripleTerm에만 일치합니다.
sh:MinCountConstraintComponent: $minCountsh:minCount에 대한 매개변수 값이라고 합시다. 값 노드의 수가 $minCount보다 작으면, 검증 결과가 있습니다.
sh:MaxCountConstraintComponent: $maxCountsh:maxCount에 대한 매개변수 값이라고 합시다. 값 노드의 수가 $maxCount보다 크면, 검증 결과가 있습니다.
sh:MinExclusiveConstraintComponent: $minExclusivesh:minExclusive에 대한 매개변수 값이라고 합시다. SPARQL 표현식 $minExclusive < vtrue를 반환하지 않는 각 값 노드 v에 대해, vsh:value로 가지는 검증 결과가 있습니다.
sh:MinInclusiveConstraintComponent: $minInclusivesh:minInclusive에 대한 매개변수 값이라고 합시다. SPARQL 표현식 $minInclusive <= vtrue를 반환하지 않는 각 값 노드 v에 대해, vsh:value로 가지는 검증 결과가 있습니다.
sh:MaxExclusiveConstraintComponent: $maxExclusivesh:maxExclusive에 대한 매개변수 값이라고 합시다. SPARQL 표현식 $maxExclusive > vtrue를 반환하지 않는 각 값 노드 v에 대해, vsh:value로 가지는 검증 결과가 있습니다.
sh:MaxInclusiveConstraintComponent: $maxInclusivesh:maxInclusive에 대한 매개변수 값이라고 합시다. SPARQL 표현식 $maxInclusive >= vtrue를 반환하지 않는 각 값 노드 v에 대해, vsh:value로 가지는 검증 결과가 있습니다.
sh:MinLengthConstraintComponent: $minLengthsh:minLength에 대한 매개변수 값이라고 합시다. v의 문자열 표현(SPARQL str 함수가 정의한 대로)의 길이(SPARQL STRLEN 함수가 정의한 대로)가 $minLength보다 작거나, v빈 노드인 각 값 노드 v에 대해, vsh:value로 가지는 검증 결과가 있습니다.
sh:MaxLengthConstraintComponent: $maxLengthsh:maxLength에 대한 매개변수 값이라고 합시다. v의 문자열 표현(SPARQL str 함수가 정의한 대로)의 길이(SPARQL STRLEN 함수가 정의한 대로)가 $maxLength보다 크거나, v빈 노드인 각 값 노드 v에 대해, vsh:value로 가지는 검증 결과가 있습니다.
sh:PatternConstraintComponent: $patternsh:pattern에 대한 매개변수 값이라고 합시다. $flagssh:flags에 대한 매개변수 값이라고 합시다. 빈 노드이거나 문자열 표현(SPARQL str 함수가 정의한 대로)이 정규 표현식 $pattern(SPARQL REGEX 함수가 정의한 대로)과 일치하지 않는 각 값 노드에 대해, 그 값 노드sh:value로 가지는 검증 결과가 있습니다. $flags가 값을 가지면, 일치는 $flags를 세 번째 인자로 사용하여 SPARQL REGEX 함수의 3-인자 변형 정의를 따라야 MUST 합니다.
sh:SingleLineConstraintComponent: $singleLinesh:singleLine에 대한 매개변수 값이라고 합시다. $singleLinetrue이면, 어휘 형식이 정규 표현식(SPARQL REGEX 함수가 정의한 대로) [\f\r\n\v]와 일치하는 리터럴인 각 값 노드에 대해 검증 결과가 있습니다.
sh:LanguageInConstraintComponent: $languageInsh:languageIn이라고 합시다. 리터럴이 아니거나, SPARQL langMatches 함수가 정의한 필터링 스키마를 따라 $languageIn구성원인 기본 언어 범위 중 어느 것과도 일치하는 언어 태그를 가지지 않는 각 값 노드에 대해, 그 값 노드sh:value로 가지는 검증 결과가 있습니다.
sh:UniqueLangConstraintComponent: $uniqueLangsh:uniqueLang에 대한 매개변수 값이라고 합시다. $uniqueLangtrue라면, 적어도 두 개의 값 노드가 사용하는 각 비어 있지 않은 언어 태그에 대해 검증 결과가 있습니다. 값 노드데이터타입 rdf:dirLangString을 가지는 경우, 기본 방향은 고유성 조건에 포함됩니다. 예를 들어 "1"@ar--rtl"1"@ar-ltr는 서로 다르며, "1"@ar--rtl"1"@ar의 쌍도 마찬가지입니다.
sh:MemberShapeConstraintComponent: $memberShapesh:memberShape에 대한 매개변수 값이라고 합시다. 각 값 노드 vSHACL 목록이어야 합니다. v가 SHACL 목록이 아니면 검증 결과가 있습니다. SHACL 목록 v의 어떤 구성원 m$memberShape부합하지 않으면 검증 결과가 있습니다.
sh:MinListLengthConstraintComponent: $minListLengthsh:minListLength에 대한 매개변수 값이라고 합시다. 각 값 노드 vSHACL 목록이어야 합니다. v가 SHACL 목록이 아니면 검증 결과가 있습니다. 목록 v의 구성원 수가 $minListLength보다 작으면, 검증 결과가 있습니다.
sh:MaxListLengthConstraintComponent: $maxListLengthsh:maxListLength에 대한 매개변수 값이라고 합시다. 각 값 노드 vSHACL 목록이어야 합니다. v가 SHACL 목록이 아니면 검증 결과가 있습니다. 목록 v의 구성원 수가 $maxListLength보다 크면, 검증 결과가 있습니다.
sh:UniqueMembersConstraintComponent: $uniqueMemberssh:uniqueMembers에 대한 매개변수 값이라고 합시다. 각 값 노드 vSHACL 목록이어야 합니다. v가 SHACL 목록이 아니면 검증 결과가 있습니다. $uniqueMemberstrue이고 목록 v에 중복 구성원이 있으면, 검증 결과가 있습니다.
sh:EqualsConstraintComponent: $equalssh:equals이라고 하고, $path셰이프 그래프 안에서 $equals가 나타내는 SHACL 속성 경로라고 합시다. $otherNodes$path를 통해 포커스 노드에서 도달할 수 있는 노드들의 집합이라고 합시다. $otherNodes에 존재하지 않는 각 값 노드에 대해, 그 값 노드sh:value로 가지는 검증 결과가 있습니다. $otherNodes 안의 각 노드값 노드 중 하나가 아닌 것에 대해, 그 sh:value로 가지는 검증 결과가 있습니다.
sh:DisjointConstraintComponent: $disjointsh:disjoint매개변수 값이라고 하고, $path셰이프 그래프 안에서 $disjoint가 나타내는 SHACL 속성 경로라고 합시다. $otherNodes$path를 통해 포커스 노드에서 도달할 수 있는 노드들의 집합이라고 합시다. $otherNodes에도 있는 각 값 노드에 대해, 그 값 노드sh:value로 가지는 검증 결과가 있습니다.
sh:SubsetOfConstraintComponent: $subsetOfsh:subsetOf이라고 하고, $path셰이프 그래프 안에서 $subsetOf가 나타내는 SHACL 속성 경로라고 합시다. $otherNodes$path를 통해 포커스 노드에서 도달할 수 있는 노드들의 집합이라고 합시다. $otherNodes에 존재하지 않는 각 값 노드에 대해, 그 값 노드sh:value로 가지는 검증 결과가 있습니다.
sh:LessThanConstraintComponent: $lessThansh:lessThan이라고 하고, $path셰이프 그래프 안에서 $lessThan가 나타내는 SHACL 속성 경로라고 합시다. $otherNodes$path를 통해 포커스 노드에서 도달할 수 있는 노드들의 집합이라고 합시다. 값 노드$otherNodes의 구성원으로 이루어진 각 쌍에 대해, 첫 번째 이 두 번째 보다 작지 않거나 (SPARQL의 < 연산자를 기준으로) 두 값을 비교할 수 없다면, 그 값 노드sh:value로 가지는 검증 결과가 있습니다.
sh:LessThanOrEqualsConstraintComponent: $lessThanOrEqualssh:lessThanOrEquals이라고 하고, $path셰이프 그래프 안에서 $lessThanOrEquals가 나타내는 SHACL 속성 경로라고 합시다. $otherNodes$path를 통해 포커스 노드에서 도달할 수 있는 노드들의 집합이라고 합시다. 값 노드$otherNodes의 구성원으로 이루어진 각 쌍에 대해, 첫 번째 이 두 번째 보다 작거나 같지 않거나 (SPARQL의 <= 연산자를 기준으로) 두 값을 비교할 수 없다면, 그 값 노드sh:value로 가지는 검증 결과가 있습니다.
sh:NotConstraintComponent: $notsh:not이라고 합시다. 각 값 노드 v에 대해: 셰이프 $not에 대한 v적합성 검사실패를 생성하면 실패가 보고되어야 MUST 합니다. 그렇지 않고, v가 셰이프 $not부합하면, vsh:value로 가지는 검증 결과가 있습니다.
sh:AndConstraintComponent: $andsh:and이라고 합시다. 각 값 노드 v에 대해: $and구성원 중 어느 것에 대해 v적합성 검사실패를 생성하면 실패가 생성되어야 MUST 합니다. 그렇지 않고, v$and의 각 구성원부합하지 않으면, vsh:value로 가지는 검증 결과가 있습니다.
sh:OrConstraintComponent: $orsh:or이라고 합시다. 각 값 노드 v에 대해: 구성원 중 어느 것에 대해 v적합성 검사실패를 생성하면 실패가 생성되어야 MUST 합니다. 그렇지 않고, v$or구성원 중 어느 것에도 부합하지 않으면 vsh:value로 가지는 검증 결과가 있습니다.
sh:XoneConstraintComponent: $xonesh:xone이라고 합시다. 각 값 노드 v에 대해 N$xone구성원셰이프v가 그 셰이프에 부합하는 개수라고 합시다. 구성원 중 어느 것에 대해 v적합성 검사실패를 생성하면 실패가 생성되어야 MUST 합니다. 그렇지 않고, N이 정확히 1이 아니면, vsh:value로 가지는 검증 결과가 있습니다.
sh:NodeConstraintComponent: $nodesh:node이라고 합시다. 각 값 노드 v에 대해: $node에 대한 v적합성 검사실패를 생성하면 실패가 생성되어야 MUST 합니다. 그렇지 않고, v$node부합하지 않으면, vsh:value로 가지는 검증 결과가 있습니다.
sh:PropertyConstraintComponent: $propertysh:property이라고 합시다. 각 값 노드 v에 대해: 속성 셰이프 $property에 대해 v포커스 노드로 검증한 결과가 실패를 생성하면 실패가 생성되어야 MUST 합니다. 그렇지 않으면, 검증 결과는 속성 셰이프 $property에 대해 v포커스 노드로 하여 검증한 결과입니다.
sh:SomeValueConstraintComponent: $someValuesh:someValue이라고 합시다. 적어도 하나의 값 노드$someValue에 부합하는 경우를 제외하고, 어떤 값 노드$someValue에 대해 적합성 검사했을 때 실패가 생성되면 실패가 생성되어야 MUST 합니다. 그렇지 않고, 어떤 값 노드$someValue부합하지 않으면, 검증 결과가 있습니다.
sh:QualifiedMinCountConstraintComponent: $qualifiedValueShapesh:qualifiedValueShape이라고 합시다. $qualifiedMinCountsh:qualifiedMinCount에 대한 매개변수 값이라고 합시다. Cv$qualifiedValueShape부합하고, v현재 셰이프, 즉 v가 검증되는 대상이며 $qualifiedValueShapesh:qualifiedValueShape의 값으로 가지는 셰이프에 대한 어떤 형제 셰이프에도 부합하지 않는 값 노드 v의 수라고 합시다. 언급된 적합성 검사 중 어느 것이든 실패를 생성하면 실패가 생성되어야 MUST 합니다. 그렇지 않으면 C$qualifiedMinCount보다 작은 경우 검증 결과가 있습니다. sh:qualifiedMinCount에 대한 제약 컴포넌트sh:QualifiedMinCountConstraintComponent입니다.
sh:QualifiedMaxCountConstraintComponent: $qualifiedMaxCountsh:qualifiedMaxCount에 대한 매개변수 값이라고 합시다. C를 위의 sh:qualifiedMinCount에 대해 정의된 것과 같다고 합시다. 언급된 적합성 검사 중 어느 것이든 실패를 생성하면 실패가 생성되어야 MUST 합니다. 그렇지 않으면 C$qualifiedMaxCount보다 큰 경우 검증 결과가 있습니다. sh:qualifiedMaxCount에 대한 제약 컴포넌트sh:QualifiedMaxCountConstraintComponent입니다.
sh:ReifierShapeConstraintComponent: t트리플 용어 (포커스 노드, $path, 값 노드)라고 합시다. 트리플 용어 t의 각 구상화자에 대해, 구상화자포커스 노드로 하여 노드 셰이프 $reifierShape에 대해 검증했을 때 실패가 생성되면 실패가 생성되어야 MUST 합니다. $reifierShape에 부합하지 않는 각 구상화자 t에 대해, tsh:value로 가지는 검증 결과가 있습니다.
sh:ReificationRequiredConstraintComponent: $reificationRequiredtrue로 설정되어 있고, 트리플 용어 t에 대한 구상화된 문이 데이터 그래프 안에 없다면, tsh:value로 가지는 검증 결과가 있습니다.
sh:ClosedConstraintComponent: $closedsh:closed에 대한 매개변수 값이라고 합시다. $ignoredPropertiessh:ignoredProperties에 대한 이라고 합시다.

$closedtrue 또는 sh:ByTypes이고 P가 아래에 정의된 속성들의 집합이라면, 값 노드를 그 주어로 가지고, P에 속하지 않는 술어를 가지는 각 트리플에 대해 검증 결과가 있습니다. $ignoredProperties가 값을 가지면 이 SHACL 목록구성원으로 열거된 속성도 값 노드에 대해 허용됩니다. 검증 결과는 트리플의 술어sh:resultPath로, 트리플의 목적어sh:value로 가져야 MUST 합니다.

$closedtrue이면, P는 현재 셰이프에서 SPARQL 경로 sh:property/sh:path를 통해 도달할 수 있는 IRI 속성들의 집합입니다.

$closedsh:ByTypes이면, P는 다음 알고리즘을 통해 값 노드에서 도달할 수 있는 IRI 속성들의 집합에 rdf:type을 더한 것입니다:
function collectProperties(S)
    SPARQL 경로 sh:property/sh:path를 통해 S에서 도달할 수 있는
            모든 IRI 속성을 추가
    if S is a SHACL instance of rdfs:Class in the shapes graph {
        for each triple in the shapes graph matching (S rdfs:subClassOf ?o)
            collectProperties(?o)
        for each triple in the shapes graph matching (?s sh:targetClass S)
            collectProperties(?s)
    }
    if S is a SHACL instance of sh:NodeShape in the shapes graph
        for each triple in the shapes graph matching (S sh:node ?o)
            collectProperties(?o)

for each rdf:type T of the value node in the data graph
    collectProperties(T)
구현은 위 알고리즘에서 같은 S를 두 번 방문하지 못하게 하여 무한 루프를 피해야 한다는 점에 유의하십시오.
sh:HasValueConstraintComponent: $hasValuesh:hasValue에 대한 매개변수 값이라고 합시다. RDF 용어 $hasValue값 노드들 중에 없으면, 검증 결과가 있습니다.
sh:InConstraintComponent: $insh:in이라고 합시다. $in구성원이 아닌 각 값 노드에 대해, 그 값 노드sh:value로 가지는 검증 결과가 있습니다.
sh:RootClassConstraintComponent: $rootClasssh:rootClass에 대한 매개변수 값이라고 합시다. classesIRI들의 집합으로 둡시다. 이때 $rootClassIRI라면 그 집합은 정확히 해당 IRI만으로 구성되고, $rootClass빈 노드 SHACL 목록이라면 그 집합은 정확히 목록의 구성원들로 구성됩니다.

값 노드IRI가 아니거나, IRI이지만 데이터 그래프valueNode rdfs:subClassOf* class를 수반하는 classclasses 안에 존재하지 않는 각 노드에 대해, 그 값 노드sh:value로 가지는 검증 결과가 있습니다.
sh:UniqueValuesForConstraintComponent: $uniqueValuesForshape S 안의 sh:uniqueValuesFor이라고 하자. $properties를 다음과 같은 집합이라고 하자: $uniqueValuesForIRI이면 $properties = { uniqueValuesFor }이다. $uniqueValuesForSHACL 목록이면, $properties는 그 목록의 멤버들의 집합이다. $targetNodesS대상 노드들이라고 하자.
값 노드 V에 대해, $targetNodes 안에 V$properties의 모든 속성에 대해 정확히 같은 들을 가지는 또 다른 노드가 존재하면, 검증 결과가 있다. V$properties 안의 어떤 속성에 대해서도 을 가지지 않으면 결과는 생성되지 않는다.

D. 보안 및 개인정보 보호 고려사항

이 섹션은 비규범입니다.

대부분의 RDF 기반 기술과 마찬가지로, SHACL 프로세서는 다양한 출처에서 결합된 그래프에서 동작할 수 있습니다. 일부 애플리케이션은 개방형 "linked data" 아키텍처를 가지고 조직의 신뢰 네트워크 밖에 있는 출처에서 RDF 트리플을 동적으로 조합할 수 있습니다. RDF는 누구든 어떤 리소스에 대해서도 문을 추가할 수 있게 하므로, 트리플은 셰이프 정의나 데이터 그래프 안 노드의 원래 의도된 의미론을 수정할 수 있으며, 따라서 오해의 소지가 있는 결과로 이어질 수 있습니다. 이 시나리오와 다음 시나리오에 대한 보호는 신뢰되고 검증된 RDF 출처만 사용하고, owl:importssh:shapesGraph를 통해 그래프가 동적으로 추가될 가능성을 제거함으로써 달성할 수 있습니다.

E. 색인

E.1 이 명세에서 정의한 용어

E.2 참조로 정의된 용어

F. 감사의 말

이 섹션은 비규범입니다.

원래 SHACL Core 명세는 RDF Data Shapes Working Group에서 작성했습니다. 해당 감사의 말 섹션을 참조하십시오.

G. 원래 SHACL Core와 SHACL 1.2 Core 사이의 변경사항

이 섹션은 비규범입니다.

H. 참고문헌

H.1 규범적 참고문헌

[BCP47]
언어 식별을 위한 태그. A. Phillips, 편집자; M. Davis, 편집자. IETF. 2009년 9월. 최선 현행 관행. URL: https://www.rfc-editor.org/info/rfc5646/
[owl2-syntax]
OWL 2 웹 온톨로지 언어 구조 명세 및 함수형 스타일 구문(제2판). Boris Motik; Peter Patel-Schneider; Bijan Parsia. W3C. 2012년 12월 11일. W3C 권고안. URL: https://www.w3.org/TR/owl2-syntax/
[rdf12-concepts]
RDF 1.2 개념 및 추상 데이터 모델. Andy Seaborne; Gregg Kellogg; Olaf Hartig; Pierre-Antoine Champin. W3C. 2026년 4월 7일. W3C 후보 권고안. URL: https://www.w3.org/TR/rdf12-concepts/
[RFC2119]
RFC에서 요구 수준을 나타내기 위해 사용하는 핵심어. S. Bradner. IETF. 1997년 3월. 최선 현행 관행. URL: https://www.rfc-editor.org/info/rfc2119/
[RFC8174]
RFC 2119 핵심어에서 대문자와 소문자의 모호성. B. Leiba. IETF. 2017년 5월. 최선 현행 관행. URL: https://www.rfc-editor.org/info/rfc8174/
[shacl-ucr]
SHACL 사용 사례 및 요구사항. Simon Steyskal; Karen Coyle. W3C. 2017년 7월 20일. W3C 작업 그룹 노트. URL: https://www.w3.org/TR/shacl-ucr/
[shacl12-node-expr]
SHACL 1.2 노드 표현식. Holger Knublauch; Simon Steyskal; Robert David; David Habgood. W3C. 2026년 1월 8일. FPWD. URL: https://www.w3.org/TR/shacl12-node-expr/
[shacl12-sparql]
SHACL 1.2 SPARQL 확장. Holger Knublauch; Ashley Sommer. W3C. 2026년 1월 30일. W3C 작업 초안. URL: https://www.w3.org/TR/shacl12-sparql/
[sparql12-entailment]
SPARQL 1.2 함의 체제. Peter Patel-Schneider. W3C. 2026년 4월 9일. W3C 작업 초안. URL: https://www.w3.org/TR/sparql12-entailment/
[sparql12-query]
SPARQL 1.2 질의 언어. Olaf Hartig; Andy Seaborne; Ruben Taelman; Gregory Williams; Thomas Pellissier Tanon. W3C. 2026년 6월 25일. W3C 작업 초안. URL: https://www.w3.org/TR/sparql12-query/

H.2 정보성 참고문헌

[json-ld]
JSON-LD 1.0. Manu Sporny; Gregg Kellogg; Markus Lanthaler. W3C. 2020년 11월 3일. W3C 권고안. URL: https://www.w3.org/TR/json-ld/
[owl2-mapping-to-rdf]
OWL 2 웹 온톨로지 언어의 RDF 그래프로의 매핑(제2판). Peter Patel-Schneider; Boris Motik. W3C. 2012년 12월 11일. W3C 권고안. URL: https://www.w3.org/TR/owl2-mapping-to-rdf/
[rdf12-turtle]
RDF 1.2 Turtle. Gregg Kellogg; Andy Seaborne; Dominik Tomaszuk. W3C. 2026년 6월 12일. W3C 작업 초안. URL: https://www.w3.org/TR/rdf12-turtle/