Copyright © 2026 World Wide Web Consortium. W3C® liability, trademark and permissive document license rules apply.
이 문서는 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 1.2 명세군의 일부입니다. 다음을 참조하세요. SHACL 1.2 개요는 더 자세한 해당 명세들의 소개를 제공합니다.
명세는 다음과 같습니다:
작업 초안:
편집자 초안:
구현자는 테스트를 수행하여 위 명세에 대한 적합성 수준을 부분적으로 확인할 수 있습니다. 직접 각 명세의 메타데이터에서 링크로 제공하는 테스트 케이스를 사용하여 확인합니다. 다만, 테스트 스위트의 모든 테스트를 통과해도 완전한 적합성을 의미하지는 않는다는 점에 유의하세요. 명세에 관해서는, 이는 구현이 테스트 스위트에서 테스트하는 측면에 적합함을 의미할 뿐입니다.
서론에는 용어 절이 포함되어 있습니다.
2. SHACL 코어 시작하기에서는 예제를 사용하여 SHACL 코어를 비공식적으로 소개합니다.
3. 셰이프와 제약 조건 및 4. SHACL 속성 경로에서는 SHACL 셰이프와 제약 조건뿐만 아니라 속성 경로도 다룹니다.
5. 노드 표현식에서는 노드 표현식을 소개하고, 6. 검증과 그래프에서는 SHACL의 검증을 정의합니다.
7. 코어 제약 조건 컴포넌트에서는 SHACL 코어에 내장된 제약 조건 컴포넌트를 정의하고, 8. 검증하지 않는 셰이프 특성에서는 검증하지 않는 속성을 설명합니다.
SHACL의 구문은 RDF입니다. 이 문서의 예제에서는 Turtle [rdf12-turtle]과 JSON-LD [json-ld]를 사용합니다. 실제로는 RDF/XML과 같은 다른 RDF 직렬화 형식도 사용할 수 있습니다. 독자는 트리플과 같은 기본적인 RDF 개념 [rdf12-concepts]에 익숙해야 합니다.
이 문서는 RDF 그래프를 설명하고 검증하기 위한 언어인 SHACL(Shapes Constraint Language)의 코어를 명세합니다. 이 섹션에서는 핵심 용어에 대한 개요와 기본 개념을 설명하는 예제를 통해 SHACL을 소개합니다.
이 문서 전체에서는 다음 용어를 사용합니다.
RDF 1.2 Concepts and Abstract Syntax의 일부에 링크된 용어는 해당 문서에서 정의된 대로 SHACL에서 사용됩니다. SPARQL 1.2 Query Language의 일부에 링크된 용어는 해당 문서에서 정의된 대로 SHACL에서 사용됩니다. 하나의 링크만으로도 이 문서에서 특정 용어가 나타나는 모든 경우에 대한 정의를 제공하기에 충분합니다.
정의는 이 문서 내에서 완전합니다. 즉, 이 문서에 어떤 상황을 참으로 만드는 규칙이 없다면 해당 상황은 거짓입니다.
n은 RDF 그래프에서 속성 p에 대한
값 v를 갖습니다.
이는 RDF 그래프에 RDF 트리플이 존재하고
그 주어가 n, 술어가 p, 그리고 목적어가 v인 경우입니다.
"그래프 G에서 P의 모든 값 ..."이라는 구절은 "G에서 술어가 P인 트리플의 모든 목적어
..."를 의미합니다.
(이 문서에서는 RDF 항이 그래프에서 주어진 술어에 대한 값을 갖는다는
사실을 표현하기 위해 지정하다 또는 선언하다라는 동사를 사용하기도 합니다.)
n은 RDF 그래프 G에서 SPARQL 속성
경로 표현식
p에 대한 값 v를 갖습니다. 이는 G에 대한 SPARQL
쿼리
SELECT ?s ?o WHERE { ?s p' ?o }의 결과에 솔루션 매핑이 존재하고, 이 매핑이 ?s를
n에, ?o를 v에 바인딩하며, 여기서 p'는 p의 SPARQL
표면 구문인 경우입니다.
G의 SHACL 목록은
IRI
또는 공백 노드이며,
rdf:nil이거나(rdf:nil이 rdf:first 또는 rdf:rest 중
어느 것에 대해서도 값을 갖지 않는다는 조건에서),
G에서 속성 rdf:first에 대해 정확히 하나의 값을 갖고,
G에서 속성 rdf:rest에 대해 정확히 하나의 값을 가지며
그 값 또한 G에서 SHACL 목록이고,
해당 목록 자체가 G에서 속성 경로 rdf:rest+의 값이 아니어야 합니다.
G에서 rdf:nil을 제외한 모든 SHACL 목록의 멤버는
G에서 rdf:first에 대한 해당 목록의 값과,
그 뒤에 G에서 rdf:rest에 대한 값의 G 내 멤버들이 이어진 것으로 구성됩니다.
SHACL 목록 rdf:nil은 어떤 RDF 그래프에서도 멤버를 갖지 않습니다.
rdf:type에 대한 값과
해당 그래프에서 이러한 SHACL
상위 클래스인 값들을 해당 그래프에서 함께 포함하는 집합입니다.
일부 SHACL 구현은 rdfs:subClassOf
트리플을
매개변수화하여 SHACL 하위 클래스를 결정하는 트리플을 셰이프 그래프에서도 데이터 그래프와 함께 조회할 수 있다는 점에 유의하십시오.
6.4
rdfs:subClassOf 트리플을 위한 그래프를 참조하십시오.
이 문서 안에서는 다음 네임스페이스 접두사 정의가 사용됩니다:
| 접두사 | 네임스페이스 |
|---|---|
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을 나타냅니다.
비규범으로 표시된 섹션뿐 아니라, 이 명세의 모든 작성 지침, 다이어그램, 예제 및 참고는 비규범입니다. 이 명세의 그 밖의 모든 내용은 규범입니다.
이 문서에서 MAY, MUST, MUST NOT, SHOULD, 및 SHOULD NOT이라는 핵심어는 여기에 표시된 것처럼 모두 대문자로 나타나는 경우에만 BCP 14 [RFC2119] [RFC8174]에 설명된 대로 해석되어야 합니다.
이 문서는 SHACL Core 언어를 정의하며, 이는 간단히 SHACL이라고도 합니다. 이 명세는 다음에 대한 적합성 기준을 설명합니다:
이 문서에는 셰이프 그래프에서 셰이프와 다른 노드가 충족해야 하는 구문 규칙이 포함되어 있습니다.
(또한 sh:shapesGraph와 같은 일부 속성의 경우 데이터 그래프에서도 적용됩니다).
이러한 규칙은 일반적으로 셰이프에는 ...이 있어야 합니다 또는 X의 값은
리터럴입니다 또는 술어가 P인 트리플의 모든 객체는 IRI여야 합니다와 같은 형식입니다.
이러한 규칙의 전체 목록은 부록에서 확인할 수 있습니다.
이러한 규칙 중 하나라도 위반하는 노드를 잘못 형성된 노드라고 합니다.
이러한 규칙을 하나도 위반하지 않는 노드를 올바르게 형성된 노드라고 합니다.
셰이프 그래프는 다음 조건이 모두 성립할 때 잘 형성됨입니다:
owl:imports 문을 따라 결정됨)가
OWL 2 구문 명세의 섹션 3.4
[owl2-syntax]에서
정의한 제약을 만족해야 합니다.
즉, 다음과 같은 두 셰이프 그래프를 포함하지 않아야 합니다:
owl:versionIRI 값을 가짐), 또는
owl:versionIRI와
같은 값을 가진 owl:incompatibleWith 주석을 포함하는 경우.
SHACL은 RDF 및 RDFS 어휘를 사용하지만, 전체 RDFS 추론이 필요한 것은 아닙니다.
그러나 SHACL 프로세서는 함의를 포함하는 RDF 그래프에서 동작할 수 있습니다
[sparql12-entailment].
이는 SHACL 프로세서에 제출되기 전에 미리 계산되거나,
SHACL 처리의 일부로 즉석에서 수행될 수 있습니다(이때 데이터 그래프 또는 셰이프 그래프 중 어느 것도 수정하지 않습니다).
함의 처리를 지원하기 위해 SHACL에는
주어진 셰이프 그래프에 필요한 추론을 나타내는
sh:entailment 속성이 포함되어 있습니다.
sh:entailment 속성의 값은
IRI입니다.
이 속성의 일반적인 값은 [sparql12-entailment]에서 다룹니다.
SHACL 구현은 함의 체계를 지원할 수 있지만, 반드시 지원해야 하는 것은 아닙니다.
셰이프
그래프에 트리플이 하나라도 포함되어 있고, 그 술어가 sh:entailment이며 목적어가 E이고,
SHACL 프로세서가 주어진 데이터
그래프에 대해 E를 함의 체계로 지원하지 않는 경우,
프로세서는 실패를
반드시 알려야 합니다.
그렇지 않으면, SHACL 프로세서는 셰이프 그래프에 있는
sh:entailment의 모든 값에 대한 함의를 반드시 제공해야 하며,
모든 추론된 트리플은 검증 과정 중 데이터
그래프에 대한 모든 쿼리에서 반드시 반환되어야 합니다.
이 섹션은 비규범입니다.
이 섹션에서는 SHACL Core의 기본을 소개하는 간단한 예제를 단계별로 살펴봅니다. 데이터가 어떤 모습이어야 하는지 설명하는 방법과, SHACL 프로세서가 해당 데이터가 그 설명을 충족하는지 확인하는 방법을 배우게 됩니다.
여러 엔터티(Alice, Bob, Calvin)가 있고, 컴퓨터나 다른 사람에게 다음을 설명하고 싶다고 생각해 봅시다.
ex:Person이라는 클래스가 있습니다.
ex:Person의 모든 인스턴스는 최대 하나의 사회 보장 번호(SSN)를 가지며, 그 SSN은
올바른 형식의 텍스트(예: 123-45-6789)여야 합니다.
ex:Person의 모든 인스턴스는 하나 이상의 회사에서 일할 수 있지만, 해당 회사는
데이터에서 ex:Company로 타입 지정되어야 합니다.
ex:Person에는 SSN
(ex:ssn), 근무 소속(ex:worksFor), 그리고 필수 타입 지정
(rdf:type) 외의 다른 속성은 허용되지 않습니다.
다음은 설명하고 검증하려는 데이터입니다:
다음은 관심 도메인을 표현하는 방법을 보여 주는 자체 완결적인 예제입니다. SHACL 용어로 이것은 셰이프 그래프라고 하지만, 이것을 도메인 모델 또는 온톨로지로 생각할 수도 있습니다.
이를 분해해 봅시다:
sh:targetClass ex:Person은 "이 제약을 모든 사람에게 적용한다"는 뜻입니다.
sh:property 정의는 다음을 선언합니다:
sh:datatype xsd:string).
sh:maxCount 1).
sh:pattern "^\d{3}-\d{2}-\d{4}$").
sh:property 정의는 다음을 선언합니다:
ex:worksFor 속성을 가진다면, 그 값은 IRI여야 하며
ex:Company인 어떤 것을 가리켜야 합니다.
sh:closed true는 나열된 속성 외에는 허용되지 않음을 의미합니다(명시적으로
무시되는 속성은 제외).
sh:ignoredProperties ( rdf:type )는 rdf:type이 허용된 속성 목록에
없더라도 통과하도록 합니다.
셰이프 그래프를 사용하여 데이터 그래프에 대해 SHACL 검증을 실행하면, 검증기는 우리가 작성한 제약에 대해 각 Person을 검사합니다.
쉬운 영어로 말하면, 검증기는 다음을 발견합니다:
987-65-432A에는 숫자가 있어야
할 자리에 문자가 있습니다).
sh:maxCount는
하나만 허용된다고 합니다).
ex:UntypedCompany라는 것에서 일하지만, 그것은
ex:Company로 선언되어 있지 않습니다.
ex:birthDate를 가지고 있습니다.
다음은 이 예제에 대한 SHACL 검증 보고서가 어떻게 보일 수 있는지를 보여 줍니다(읽기 쉽도록 단순화됨):
보고서 읽는 방법:
sh:ValidationReport는 전체 보고서이며, sh:conforms false는
최소 하나의 위반이 있었다는 뜻입니다.
sh:ValidationResult는 발견된 하나의 문제입니다:
sh:resultSeverity — 문제가 얼마나 심각한지 알려 줍니다. 이 예제에서 모든
이슈는 sh:Violation(가장 높고 기본인 심각도)입니다.
sh:focusNode — 실패한 데이터 노드입니다.
sh:resultPath — 관련된 속성입니다.
sh:value — 실패를 유발한 실제 값입니다.
sh:sourceConstraintComponent — 어떤 종류의 제약이 깨졌는지 나타냅니다
(최대 개수, 패턴, 클래스 등).
sh:sourceShape — 제약을 정의한 셰이프입니다.
sh:resultMessage — 사람이 읽을 수 있는 설명입니다.
SHACL은 주로 셰이프를 표현하도록 설계되었지만, RDF Schema 네임스페이스에서
rdfs:Class 및 rdfs:subClassOf 같은 용어와 개념도 빌려옵니다.
어떤 사람들은 위의 원래 예제처럼 ex:Person과 ex:PersonShape를
별도 엔터티로 두어 이러한 개념을 분리해 두는 것을 선호합니다.
그러나 이들을 더 밀접하게 결합하고 sh:ShapeClass를 사용하여
클래스와 셰이프를 동시에 선언하는 것도 가능합니다.
또한 때로는 속성 셰이프가 빈 노드로 선언되는 것을 볼 수 있으며, IRI가 아닐 수도 있습니다. 이는 더 간결한 표기법이지만, 예를 들어 다른 그래프가 노드 셰이프를 재사용하면서 속성 셰이프를 비활성화하려는 경우처럼, 외부에서 해당 속성 셰이프를 쉽게 참조할 수 없다는 의미입니다.
다음 Turtle 예제는 이러한 두 가지 구문 변형이 실제로 어떻게 쓰이는지 보여 줍니다.
위의 셰이프 선언을 사용하여 SHACL에서 사용하는 형식적 용어 중 일부를 소개할 수 있습니다. 이는 이 명세의 나머지 부분을 읽는 데 도움이 될 수 있습니다.
셰이프
ex:PersonShape의 대상은
ex:Person 클래스의
모든 SHACL 인스턴스 집합입니다.
이는 sh:targetClass 속성을 사용하여 지정됩니다.
검증 중에 이러한 대상 노드는 해당 셰이프의 포커스 노드가 됩니다.
셰이프
ex:PersonShape는 노드 셰이프이며, 이는 포커스 노드에 적용된다는 뜻입니다.
이 셰이프는 예를 들어 sh:closed와
sh:ignoredProperties 매개변수를 사용하여 포커스 노드에 대한
제약을
선언합니다.
또한 노드
셰이프는 sh:property 속성을 사용하여
두 개의 다른 제약을 선언하며,
각각은 속성 셰이프에 의해 뒷받침됩니다.
이러한 속성 셰이프는 sh:datatype 및
sh:maxCount와 같은 매개변수를 사용하여 추가 제약을 선언합니다.
일부 속성 셰이프는
속성 값의 여러 측면을
제한하기 위해 여러
제약 컴포넌트의 매개변수를 지정합니다.
예를 들어 ex:ssn에 대한 속성 셰이프에서는 세 개의
제약 컴포넌트의 매개변수가 사용됩니다.
이러한 제약
컴포넌트의 매개변수는 sh:datatype, sh:pattern 및
sh:maxCount입니다.
각 포커스
노드에 대해 ex:ssn의
속성 값은
세 컴포넌트 모두에 대해 검증됩니다.
다음 소개는 비규범입니다.
다음 비공식 다이어그램은 SHACL 어휘의 일부 핵심 클래스에 대한 개요를 제공합니다.
각 상자는 클래스를 나타냅니다.
클래스 이름 아래의 상자들은 이들 클래스의 인스턴스가 가질 수 있는 자주 사용되는 속성의 작은 부분집합과
그 값 타입을 나열합니다.
화살표는 rdfs:subClassOf 트리플을 나타냅니다.
SHACL 어휘의 Turtle 직렬화에는 완전한 SHACL 어휘가 포함되어 있습니다.
s로,
다음 조건 중 하나 이상을 셰이프 그래프에서 충족합니다:
s는 SHACL 인스턴스로서 sh:NodeShape 또는
sh:PropertyShape의 인스턴스입니다.
s는 주어이며, 해당 트리플은
sh:targetClass, sh:targetNode,
sh:targetObjectsOf, sh:targetSubjectsOf 또는 sh:targetWhere
를 술어로 갖습니다.
s는 주어이며, 해당 트리플은 매개변수를 술어로 갖습니다.
s는 값으로서 셰이프를 요구하고 목록을 받지 않는 매개변수(예:
sh:node)에 속하거나,
구성원으로서 SHACL 목록에 속하며, 이 목록은 값으로서 셰이프를 요구하고 목록을 받는 매개변수(예: sh:or)에 속합니다.
위의 정의에는 잘 형성된 셰이프의
모든 구문 규칙이 포함되어 있지는 않다는 점에 유의하십시오.
그러한 규칙은 문서 전체에서 찾을 수 있으며 부록 A. SHACL 구문
규칙 요약에 정리되어 있습니다.
예를 들어, sh:targetClass의 값으로 리터럴을 가지는 셰이프는 잘못 형성된 것입니다.
비공식적으로, 셰이프는 속성의 값과 포커스 노드의 다른 특성을 바탕으로 포커스 노드를 검증하는 방법을 결정합니다. 예를 들어, 셰이프는 포커스 노드가 IRI여야 한다는 조건이나, 포커스 노드가 어떤 속성에 대해 특정 값을 가지고 그 속성에 대해 최소 개수의 값도 가져야 한다는 조건을 선언할 수 있습니다.
SHACL Core 언어는 두 가지 타입의 셰이프를 정의합니다:
sh:Shape는 SHACL 어휘에서 이 두 셰이프 타입의 SHACL 상위 클래스입니다.
그 하위 클래스인 sh:NodeShape와 sh:PropertyShape는 각각 노드 셰이프와
속성 셰이프의 SHACL 타입으로 사용할 수 있습니다.
셰이프는 제약 조건 컴포넌트의 매개변수를 사용하여 제약 조건을 선언할 수 있습니다.
제약 조건 컴포넌트는 IRI입니다. 각 제약 조건 컴포넌트에는 하나 이상의 필수 매개변수가 있으며, 각각은 속성입니다. 각 제약 조건 컴포넌트에는 0개 이상의 선택적 매개변수가 있으며, 각각은 속성입니다. 제약 조건 컴포넌트의 매개변수는 해당 컴포넌트의 필수 매개변수와 선택적 매개변수를 합한 것입니다.
예를 들어, 컴포넌트
sh:MinCountConstraintComponent는 특정 속성에 대해 노드가
최소한 일정 개수 이상의 값을 가져야 한다는 제한을
나타내기 위해 매개변수
sh:minCount를 선언합니다.
필수 매개변수 p1, ...
pn을 갖는 제약 조건 컴포넌트 C에 대해,
셰이프 그래프 SG의 셰이프
s는 SG에서 s가 pi에 대한 값으로 vi를
가질 때, 필수 매개변수 값
<p1,v1>, ... <pn,vn>을 가지며
종류가
C인 제약 조건을 선언합니다.
선택적 매개변수를 갖는 제약 조건 컴포넌트의 경우,
제약 조건 선언은 셰이프가 해당 컴포넌트의 모든 필수 및 선택적
매개변수에 대해 갖는 값으로 구성됩니다.
일부 제약 조건 컴포넌트는 단 하나의 매개변수만 선언합니다.
예를 들어 sh:ClassConstraintComponent에는
단일 매개변수 sh:class가 있습니다.
이러한 매개변수는 동일한 셰이프에서 여러 번 사용할 수 있으며,
그러한 매개변수의 각 값은 개별 제약 조건을 선언합니다.
이러한 선언은 논리곱으로 해석됩니다. 즉, 모든 제약 조건이 적용됩니다.
다음 예에서는 ex:customer의 값이
ex:Customer와 ex:Person 모두의 SHACL 인스턴스여야 함을
지정합니다.
sh:PatternConstraintComponent와 같은 일부 제약 조건
컴포넌트는 둘 이상의
매개변수를 선언합니다.
이러한 컴포넌트의 매개변수 중 하나라도 둘 이상의 값을 갖는 셰이프는 잘못된 형식입니다.
이 구문 규칙을 우회하는 한 가지 방법은 다음 예와 같이 제약 조건을 여러 (속성) 셰이프에 분산하는 것입니다.
제약 조건 컴포넌트는 검증기와 연결되며, 검증기는 매개변수를 사용하여 데이터를 검증하는 방법에 대한 지침(예를 들어 SPARQL 쿼리로 표현됨)을 제공합니다. RDF 항을 셰이프에 대해 검증하는 것은, 해당 셰이프가 제약 조건의 컴포넌트의 모든 필수 매개변수에 대해 값을 갖는 각 제약 조건에 대해, 각각의 컴포넌트와 연결된 검증기를 사용하여 해당 항을 검증하는 것을 포함합니다.
SHACL 코어에 포함된 제약 조건 컴포넌트 목록은 7. 코어 제약 조건 컴포넌트에 설명되어 있습니다. SHACL-SPARQL을 사용하여 추가적인 SPARQL 기반 제약 조건 컴포넌트를 선언할 수 있습니다.
데이터 그래프의 트리플을 사용하여 셰이프에 대해 검증되는 RDF 용어를 포커스 노드라고 합니다.
이 섹션의 나머지 부분은 비규범입니다.
셰이프에 대한 포커스 노드 집합은 다음과 같이 식별될 수 있습니다:
sh:node)의 매개변수에서 셰이프를 참조하는
모든 제약 안에서 지정됨
셰이프 그래프에서 셰이프의 대상 선언은
트리플로, 셰이프를 주어로, 이 문서에 설명된 특정 속성을
(예: sh:targetClass) 술어로 갖습니다.
또한 sh:shape 트리플은 데이터 그래프에서 대상을 선언할 수 있습니다.
대상 선언은 셰이프의 초점 노드를 생성하는 데 사용할 수 있습니다.
대상 선언의 대상은
이 절의 나머지 부분에 설명된 규칙을 데이터 그래프에 적용하여
생성된 RDF 용어의 집합입니다.
셰이프의 대상은
해당 셰이프에 선언된 개별
대상이
생성한 모든 RDF 용어의 합집합입니다. 이 대상은 셰이프에 대해 선언됩니다.
SHACL 코어에는 다음과 같은 종류의 대상이 포함됩니다:
이 서론의 나머지 부분은 비규범적입니다.
대상이 생성한 RDF 용어는 데이터 그래프에 노드로 존재할 필요가 없습니다.
셰이프의 검증 프로세스에 초점 노드가 입력으로 직접 제공되는 경우, 해당 셰이프의 대상은
무시됩니다.
여기에는 셰이프가
셰이프를 요구하는 제약 조건 매개변수(예:
sh:node) 중 하나의 값이고,
해당 제약 조건 컴포넌트(예:
sh:NodeConstraintComponent)를 검증하는 동안 초점 노드가 결정되는 경우도 포함됩니다.
이러한 경우 제공된 초점 노드는 셰이프의
대상에 포함될 필요가 없습니다.
노드
대상은 sh:targetNode 술어를 사용하여 지정됩니다.
셰이프에서
sh:targetNode의 각 값은 잘 형성된
노드 표현식입니다.
s가 셰이프이고 셰이프 그래프 SG 안에 있으며,
s가 SG에서 sh:targetNode에 대한
값
expr을 가진다면,
evalExpr(expr, data graph, s, {})의
출력 노드는 포커스 그래프로서 데이터 그래프
DG에 대한 대상입니다.
이 섹션의 나머지 부분은 비규범입니다.
아래 예제 데이터에서는 ex:Alice만 제공된 셰이프의 대상입니다:
클래스
대상은 sh:targetClass 술어로 지정됩니다.
셰이프에서
sh:targetClass의 각 값은 IRI입니다.
s가 셰이프이고 셰이프 그래프 SG 안에 있으며, s가
SG에서 sh:targetClass에 대한
값
c를 가진다면,
데이터 그래프 DG에서 c의 SHACL
인스턴스 집합은 SG의 s에 대해 DG에서 온
대상입니다.
이 섹션의 나머지 부분은 비규범입니다.
이 예제에서는 ex:Alice와 ex:Bob만 포커스 노드입니다.
SHACL 인스턴스 정의에 따르면,
클래스 계층을 따라가기 위해 필요한 모든 rdfs:subClassOf 선언은
데이터 그래프에 존재해야 합니다.
그러나 ex:Person a rdfs:Class 트리플은 어느 그래프에도 존재할 필요가 없습니다.
다음 예제에서는 선택된 포커스 노드가 ex:Who뿐입니다.
rdfs:subClassOf 트리플은 셰이프 그래프에서 질의될 수도 있다는 점에 유의하십시오
(6.4 rdfs:subClassOf
트리플을 위한 그래프 참조). 이 경우 위 예제의 rdfs:subClassOf 트리플은
데이터 그래프에
있을 필요가 없습니다.
비공식적으로, 셰이프 그래프에서 어떤 셰이프가 클래스로도 선언되어 있다면, 이 클래스의 모든 SHACL 인스턴스는 해당 셰이프의 대상입니다.
s가 RDF 그래프 G에서 sh:NodeShape 또는
sh:PropertyShape의 SHACL 인스턴스이고,
s가 G에서 rdfs:Class의 SHACL
인스턴스이기도 하며,
s가 IRI가
아니라면 s는 G에서 잘못 형성된 셰이프입니다.
s가 셰이프 그래프 SG에서 sh:NodeShape 또는
sh:PropertyShape의 SHACL 인스턴스이고,
s가 SG에서 rdfs:Class의 SHACL
인스턴스이기도 하다면,
데이터 그래프 DG에서 s의 SHACL 인스턴스 집합은
SG의 s에 대해 DG에서 온 대상입니다.
SHACL 네임스페이스에는 암시적 클래스 대상 패턴을 위한 구문적 축약으로 사용할 수 있는
전용 클래스 sh:ShapeClass가 포함되어 있습니다.
sh:ShapeClass는 sh:NodeShape와
rdfs:Class 모두의 rdfs:subClassOf입니다.
s가 셰이프 그래프 SG에서
sh:ShapeClass의 SHACL 인스턴스라면,
데이터 그래프 DG에서 s의 SHACL 인스턴스 집합은
SG의 s에 대해 DG에서 온 대상입니다.
일부 SHACL을 알지 못하는 구현은 sh:ShapeClass가
rdfs:Class의 하위 클래스라고 이해하지 못할 수 있음을 염두에 두십시오.
따라서 sh:ShapeClass를 사용하는 그래프에는 owl:imports sh: 문을
포함하는 것이 권장됩니다(필수는 아님).
이 섹션의 나머지 부분은 비규범입니다.
다음 예제에서 ex:Alice는 셰이프 그래프에서
클래스이면서 셰이프인 ex:Person의 SHACL 인스턴스이기 때문에 포커스 노드입니다.
위 예제의 다음 변형에서는 ex:Person이
sh:ShapeClass의 인스턴스로 선언되며,
해석은 동일합니다.
주어
대상은
sh:targetSubjectsOf 술어로 지정됩니다.
셰이프에서
sh:targetSubjectsOf의 값은 IRI입니다.
s가 셰이프이고 셰이프 그래프 SG 안에 있으며, s가
SG에서 sh:targetSubjectsOf에 대한
값
p를 가진다면,
데이터 그래프 DG에서 p를 술어로 가지는 트리플의
주어인 노드들의 집합은
SG의 s에 대해 DG에서 온 대상입니다.
이 섹션의 나머지 부분은 비규범입니다.
위 예제에서는 ex:Alice만 주어진 셰이프에 대해 검증됩니다.
이는 ex:knows를 술어로 가지는
트리플의 주어이기 때문입니다.
목적어
대상은
sh:targetObjectsOf 술어로 지정됩니다.
셰이프에서
sh:targetObjectsOf의 값은
IRI입니다.
s가 셰이프이고 셰이프 그래프 SG 안에 있으며, s가
SG에서 sh:targetObjectsOf에 대한
값
p를 가진다면,
데이터 그래프 DG에서 p를
술어로 가지는 트리플의
목적어인 노드들의 집합은
SG의 s에 대해 DG에서 온 대상입니다.
이 섹션의 나머지 부분은 비규범입니다.
위 예제에서는 ex:Bob만 주어진 셰이프에 대해 검증됩니다.
이는 ex:knows를 술어로 가지는
트리플의 목적어이기 때문입니다.
where 대상은 sh:targetWhere
술어로 지정됩니다.
셰이프에서
sh:targetWhere의 각 값은 잘 형성된 셰이프입니다.
s가 셰이프이고 셰이프 그래프 SG 안에 있으며, s가
SG에서 sh:targetWhere에 대한
값
w를 가진다면,
데이터 그래프 DG 안에서 w에
부합하는 노드의 집합은
SG의 s에 대해 DG에서 온 대상입니다.
이 섹션의 나머지 부분은 비규범입니다.
이 예제에서 ex:Bob만 ex:AdultPerson의 포커스 노드입니다.
이는 그가 sh:targetWhere 셰이프가 정의한 두 제약에 부합하기 때문입니다.
sh:class 제약에 따라, 그는 ex:Person의 SHACL
인스턴스이고
그의 ex:age는 18 이상입니다.
그러나 ex:AdultPerson 셰이프가 모든 성인은 ex:votedFor에 대한
하나의 값을 가져야 한다고 명시하므로,
ex:Bob은 ex:AdultPerson에 부합하지 않습니다.
sh:targetWhere는 셰이프에 대해 필요충분조건을 제공하는 "정의"로
해석될 수 있다는 점에 유의하십시오.
따라서 예를 들어 주어진 조건 집합을 충족하는 모든 노드를 수집하는
"분류" 작업에 잠재적으로 사용할 수 있습니다.
주의할 점으로, where 대상 계산의 성능은 구현마다 다를 수 있습니다. 최악의 경우, 엔진은 데이터 그래프의 모든 노드를 하나씩 필터링하기 위해 순회해야 합니다.
명시적
셰이프 대상은 sh:shape
술어를 사용하여 지정합니다.
sh:shape의 각
값은 IRI입니다.
이 절의 나머지 부분은 비규범적입니다.
sh:shape는 sh:targetNode와 다르지만, 둘 다
개별 노드를
셰이프와 연결하는 데 사용할 수 있습니다.
sh:shape는 특정 주어 노드에서 목적어 셰이프를 가리킵니다.
또한 sh:targetNode 트리플은 셰이프 그래프에서 조회하는 반면,
sh:shape 트리플은 데이터 그래프에 존재해야 합니다.
아래 예제 데이터에서는 ex:Alice만 제공된 셰이프의 대상입니다:
셰이프는
셰이프 그래프에서 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이 기본값입니다.
다음 예제는 이를 설명합니다.
다음 예제는 위 셰이프 그래프의 변형이지만, 구상화를 사용하여 개별 제약의 심각도를 지정합니다:
셰이프는 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에 관한 섹션을 참조하십시오.
이전 섹션의 예제는 이 메커니즘을 사용하여 두 번째 검증 결과에 두 개의 메시지를 제공합니다. 다음 예제는 구상화를 사용하여 메시지를 선언하는 변형입니다.
셰이프는
sh:deactivated 속성에 대해 최대 하나의 값만 가질 수 있습니다.
sh:deactivated의 값은
노드 표현식이며,
유일한 출력 노드로 true 또는 false를 가져야
합니다.
expr을 셰이프에서 sh:deactivated의 값이라고 하겠습니다.
만약
evalExpr(expr, 데이터 그래프, 초점 노드, {})
가 유일한
출력 노드로 true를 생성하면 해당 셰이프를 비활성화된 셰이프라고 합니다.
비활성화된 셰이프는 검증 중에 무시됩니다.
셰이프의 모든 제약 조건을 비활성화하는 것 외에도 개별 제약 조건을 비활성화할 수 있습니다. 이는 구체화를 사용하여 수행합니다.
셰이프를 주어로,
매개변수(예: sh:minCount)를 술어로 갖는 트리플은
sh:deactivated 속성의 값을 갖는 구체화자를 최대 하나만 가질 수 있습니다.
expr을 셰이프를 주어로, 매개변수를 술어로 갖는 트리플의 구체화자에서 sh:deactivated의 값이라고 하겠습니다.
만약
evalExpr(expr, 데이터 그래프, 초점 노드, {})
가 유일한
출력 노드로 true를 생성하면 해당 트리플을 사용하는 제약 조건을 비활성화된 제약 조건이라고 합니다.
비활성화된 제약 조건은 검증 중에 무시됩니다.
이 절의 나머지 부분은 비규범적입니다.
SHACL 코어에서 sh:deactivated에 유효한 값은
상수 리터럴 노드 표현식인
true와 false뿐입니다.
이 기능의 사용 사례에는 셰이프 재사용과 디버깅이 포함됩니다.
다른 그래프나 파일의 셰이프를 특정 셰이프 그래프로 가져오는 경우,
가져온 셰이프에 대해 로컬 셰이프 그래프에서 sh:deactivated를 true로 설정하여
현재 애플리케이션의 맥락에 적용되지 않는 셰이프를
제외할 수 있습니다.
이를 통해 원래 작성자의 특정 가정에 동의하지 않더라도 다른 사람이 개발한 SHACL 그래프를
재사용할 수 있습니다.
셰이프 작성자가 다른 사람이 셰이프를 비활성화하거나 수정해야 할 가능성을 예상한다면,
실제 셰이프에 빈 노드 대신 IRI를
사용하는 것이
좋습니다. 예를 들어, ex:PersonShape 셰이프에서
ex:name 속성에 대한 속성 셰이프는 다음 IRI를 가질 수 있습니다:
ex:PersonShape-name.
sh:deactivated의 또 다른 일반적인 사용 사례는 셰이프를 개발하고 테스트하는 동안
특정 셰이프를 일시적으로 비활성화하는 것입니다.
다음 예제는 sh:deactivated를 사용하여 셰이프를 비활성화하는 방법을 보여줍니다.
다른 그래프에서 셰이프를 가져오는 경우, sh:deactivated true 트리플은
가져오기를 수행하는 그래프에 존재하게 됩니다.
다음 데이터에서는 인스턴스가 ex:name에 대한 값을 전혀 가지고 있지 않더라도
제약 위반이 보고되지 않습니다.
다음 변형은 구상화를 사용하여 같은 속성 셰이프의 다른 제약에는 영향을 주지 않고
sh:minCount 제약만 비활성화합니다.
노드 셰이프는 셰이프 그래프의
셰이프로,
sh:path를 술어로 가지는
트리플의 주어가
아닌 것입니다.
노드
셰이프를 sh:NodeShape의
SHACL 인스턴스로 선언하는 것이 권장되지만, 필수는 아닙니다.
sh:NodeShape의
SHACL 인스턴스는 속성 sh:path에 대한
값을
가질 수 없습니다.
비공식적으로, 노드 셰이프는 포커스 노드와 관련하여 충족해야 하는 제약을 지정합니다. 속성 셰이프와 달리, 노드 셰이프는 주로 속성 값이 아니라 포커스 노드 자체에 적용됩니다.
속성 셰이프는 셰이프 그래프의
셰이프로,
sh:path를 술어로 가지는
트리플의 주어인 것입니다.
셰이프는 sh:path에 대해
최대 하나의 값을
가집니다.
속성 셰이프에서
sh:path의 값은
잘
형성된
SHACL 속성 경로입니다.
속성 셰이프를 sh:PropertyShape의
SHACL 인스턴스로 선언하는 것이 권장되지만, 필수는 아닙니다.
sh:PropertyShape의
SHACL 인스턴스는 속성 sh:path에 대해 하나의
값을
가집니다.
속성 셰이프는
속성 sh:values에 대해 최대 하나의 값을 가지며, 이 값은
잘
형성된 노드
표현식입니다.
속성 셰이프는 속성
sh:defaultValue에 대해 최대 하나의 값을 가지며, 이
값은 잘 형성된 노드 표현식입니다.
속성 셰이프는
sh:path에 대한
값이
술어 경로인 경우에만
sh:values 및/또는 sh:defaultValue에 대한
값을 가질 수
있습니다.
비공식적으로, 속성 셰이프는 노드와 관련하여 충족해야 하는 제약 조건을 지정합니다. 이러한 노드는
초점
노드에서 속성 또는 sh:path를 사용하여 지정한 다른 SHACL 속성 경로를 따라
도달할 수 있는 노드와,
sh:values를 사용하여 지정한 노드 표현식을 평가하여 생성된 노드를
포함합니다.
이러한 노드가 없으면 대신 sh:defaultValue를 사용하여 지정한 노드 표현식을
평가합니다.
정확한 정의는 6.10.2 속성
셰이프의 값 노드를 참조하세요.
SHACL 코어는 상수 노드 표현식(IRI 및 리터럴)만 정의한다는 점에
유의하세요. 따라서 SHACL 코어에서 sh:values와 sh:defaultValue는 상수
값만 생성할 수 있습니다.
[shacl12-node-expr] 및 [shacl12-sparql]와 같은 확장은 추가적인 종류의
노드 표현식을 정의합니다.
잘 형성된 속성 셰이프와 노드 셰이프의 정의는 이 두 노드 집합을 서로소로 만든다는 점에 유의하십시오.
다음 예제는 속성 셰이프의 몇 가지 구문 변형을 설명합니다.
속성 경로는 속성 셰이프의 값
노드를 도출하기 위해 sh:path에서 사용할 수 있습니다.
SHACL에는 다음 SPARQL 속성
경로 부분집합을 나타내기 위한 RDF 용어가 포함됩니다:
PredicatePath, InversePath, SequencePath,
AlternativePath,
ZeroOrMorePath, OneOrMorePath 및 ZeroOrOnePath.
다음 하위 절에서는 올바른 형식의 SHACL 속성 경로에 대한 구문 규칙과
SPARQL 1.2
속성 경로에 대한 매핑 규칙을 제공합니다.
이 규칙은 경로 매핑
path(p,G)을 RDF 그래프 G의 RDF
용어 p에 대해 정의하며, p는 G에서 SHACL 속성 경로입니다.
두 SHACL 속성 경로가 정확히 동일한 SPARQL 속성 경로에 매핑되면 동등한 경로로 간주됩니다.
복합 경로는 IRI가 아닌 모든
SHACL 속성 경로, 즉 술어 경로가 아닌 경로입니다.
RDF 그래프의 노드는 다음 하위
섹션의 구문 규칙 중 정확히 하나를 만족하는 경우 잘 형성된 SHACL 속성
경로 p입니다.
노드 p가 빈
노드이고 p의 어떤 경로 매핑이 직접 또는 전이적으로 p를 참조한다면,
p는 잘 형성된 SHACL 속성 경로가 아닙니다.
다음 예제는 몇 가지 유효한 SHACL 속성 경로와 그에 대응하는 SPARQL 1.2 표현을 보여 줍니다.
술어 경로는 IRI입니다.
p가 술어 경로라면, path(p,G)는
p를 iri로 가지는 SPARQL PredicatePath입니다.
시퀀스 경로는 빈 노드로, 최소 두 개의 구성원을 가진 SHACL 목록이며, 각 구성원은 잘 형성된 SHACL 속성 경로입니다.
p가 G에서 목록 구성원
v1, v2, ..., vn을 가진
시퀀스 경로라면,
path(p,G)는 path(v1,G)를 elt1로,
v2의 목록 노드에 대한 경로 매핑 결과를 elt2로 하는
SPARQL SequencePath입니다.
비공식 참고: 이러한 SHACL 목록의 노드는
rdf:first 및 rdf:rest 이외의
다른 속성에 대한 값을
가지지 않는 것이 좋습니다.
대안
경로는 G에서 정확히 하나의 트리플의 주어인 빈
노드입니다.
이 트리플은 sh:alternativePath를 술어로, L을 목적어로 가지며,
L은 최소 두 개의 구성원을 가진
SHACL
목록이고,
L의 각 구성원은 잘 형성된 SHACL 속성 경로입니다.
p가 G에서 대안 경로라면,
그 SHACL 목록 L의 구성원
v1, v2, ..., vn에 대해,
path(p,G)는 path(v1,G)를 elt1로 가지고,
이어서 v2에 대한 AlternativePath를 elt2로,
..., path(vn,G)까지 이어지는 SPARQL AlternativePath입니다.
역방향 경로는
G에서 정확히 하나의 트리플의 주어인
빈 노드입니다.
이 트리플은 sh:inversePath를 술어로 가지며, 목적어 v는 잘 형성된 SHACL
속성 경로입니다.
p가 G에서 역방향 경로라면, path(p,G)는
path(v,G)를 elt로 가지는 SPARQL InversePath입니다.
0개 이상
경로는 G에서 정확히 하나의 트리플의 주어인
빈 노드입니다.
이 트리플은 sh:zeroOrMorePath를 술어로 가지며, 목적어 v는 잘 형성된 SHACL
속성 경로입니다.
p가 G에서 0개 이상 경로라면,
path(p,G)는 path(v,G)를 elt로 가지는
SPARQL ZeroOrMorePath입니다.
1개 이상
경로는 G에서 정확히 하나의 트리플의 주어인
빈 노드입니다.
이 트리플은 sh:oneOrMorePath를 술어로 가지며, 목적어 v는 잘 형성된 SHACL
속성 경로입니다.
p가 G에서 1개 이상 경로라면,
path(p,G)는 path(v,G)를 elt로 가지는
SPARQL OneOrMorePath입니다.
0개 또는 1개
경로는 G에서 정확히 하나의 트리플의 주어인
빈 노드입니다.
이 트리플은 sh:zeroOrOnePath를 술어로 가지며, 목적어 v는 잘 형성된 SHACL
속성 경로입니다.
p가 G에서 0개 또는 1개 경로라면,
path(p,G)는 path(v,G)를 elt로 가지는
SPARQL ZeroOrOnePath입니다.
이 절에서는 노드 표현식의 개념을 소개합니다. SHACL 코어는 다음 기능에서 노드 표현식을 지원합니다:
sh:values 및 sh:defaultValue에서 속성 셰이프의
값 노드를 도출합니다.sh:targetNode에서 셰이프의 대상을 동적으로 계산합니다.
sh:deactivated에서 특정
조건에 따라 일부 셰이프를 비활성화합니다.SHACL 코어에만 관심이 있는 독자는 일반적으로 이 절을 건너뛸 수 있습니다. 코어는 상수 IRI와 리터럴만 노드 표현식으로 지원하므로, 노드 표현식의 사용 사례는 기존의 SHACL 코어 사용 사례와 동일합니다.
evalExpr(expr, focusGraph, focusNode, scope) -> outputNodes
여기서
expr은 셰이프 그래프의 노드 표현식입니다.
평가 중에 엔진은 셰이프 그래프에서 expr과 관련된 트리플에 접근할 수 있습니다.focusGraph는 그래프이며, 초점 그래프라고 합니다. 이는 노드 표현식
평가를 위한 기본 쿼리 그래프입니다.focusNode는 노드이며, 입력 초점 노드라고 합니다. 이 변수에는
값이 없을 수도 있습니다.scope는 (키) 용어를 개별 (값) 용어에 대응시키는 맵입니다.
빈 맵은 {}로 표기합니다.
SHACL 코어 명세는 다음 두 하위 절의 노드 표현식 함수만 정의합니다. [shacl12-node-expr]는 노드 표현식의 전반적인 설계에 관한 추가 배경 정보를 제공하며, 포괄적인 노드 표현식 함수 라이브러리를 포함합니다. [shacl12-sparql]와 같은 다른 명세에서는 빈 노드를 사용하는 추가 함수를 도입합니다. 따라서 노드 표현식은 SHACL의 확장 지점 역할을 합니다.
검증은 데이터 그래프와 셰이프 그래프를 입력으로 받아 생성합니다. 이때 검증 보고서에는 검증 결과가 포함됩니다. 적합성 검사는 검증의 간소화된 버전으로, 불리언 결과를 생성합니다. 검증을 수행할 수 있는 시스템을 프로세서라고 하며, 동사인 처리는 검증 과정을 가리키는 데 사용되기도 합니다.
SHACL은 RDF 검증 보고서 어휘를 정의하며, 이를 사용할 수 있는 것은 검증 보고서를 RDF로 생성하는 프로세서입니다. 이 RDF는 결과 그래프입니다. 이 명세는 SHACL 결과 어휘를 다음의 규범적 정의에 사용합니다. 검증기는 다음과 연관됩니다. 제약 조건 구성 요소입니다. SHACL 구현 중 다음의 모든 필수 속성을 생성할 수 있는 구현만 검증 보고서 어휘에 관한 표준을 준수합니다.
셰이프 그래프는 RDF 그래프로서, 제공하는 역할을 하는 것은 셰이프와 관련 정보이며, 이를 SHACL 검증 과정에 제공하여 데이터 그래프를 셰이프에 대해 검증할 수 있도록 합니다.
sh:ShapesGraph 클래스는 사용해도 됩니다. 이는 rdf:type으로,
다음 IRI에 적용됩니다. 해당 그래프가 일반적으로 수행하는 역할은 셰이프 그래프입니다.
그래프 유형 클래스(예: sh:DataGraph 및 sh:ShapesGraph)는
상호 배타적이지 않은 역할을 나타내며, 하나의 그래프에 유형을 지정해도 됩니다.
이러한 클래스 중 둘 이상으로 지정할 수 있습니다.
셰이프 그래프는 주어진 검증에 대해
여러 셰이프 그래프를 결합한 결과일 수 있으며,
예를 들어 owl:imports 또는 sh:shapesGraph를 통해 결합할 수 있습니다.
구성 방식에 관계없이, 셰이프 그래프는 검증에 사용될 때 반드시
고정된 상태를 유지해야 하며, 이는 검증 과정 내내 적용됩니다.
6.7 검증을 참조하시면
자세한 내용을 확인할 수 있습니다.
이 절의 나머지 부분은 비규범적입니다.
셰이프 그래프는 재사용 가능한 검증 모듈이 될 수 있으며, 상호 참조에 사용할 수 있는 술어는 owl:imports입니다.
검증 전 단계로서, SHACL 프로세서는 원래 제공된 셰이프 그래프를 확장하는 것이 좋습니다. 이를 위해 모든
참조된 셰이프 그래프를 전이적으로 따라가 가져오며,
이때 사용하는 것은 owl:imports 술어입니다.
가져온 IRI를 해석할 때, 검색된 그래프에 가져온 IRI를 다음의
목적어로 사용하는 트리플이 있다면,
owl:versionIRI,
프로세서는 해당 트리플의 주어를 가져온 그래프의 셰이프 그래프 IRI로 취급하는 것이 좋습니다.
이는 추가 owl:imports 문을 따라가기 위한 것입니다.
형식적으로, 프로세서는 속성 경로 ^owl:versionIRI?/owl:imports를 반복적으로 사용하여
가져오기를 해석함으로써, 버전 IRI로 버전이 지정된 셰이프 그래프를 가져올 수 있도록 하는 것이 좋습니다.
다음 예제에서 셰이프 그래프가 가져오는 것은
<http://example.com/shapes/company/v2>입니다.
프로세서가 해당 IRI의 그래프를 검색하면,
해당 IRI가 다음의 owl:versionIRI로 선언되어 있음을 발견합니다.
<http://example.com/shapes/company>입니다.
그러면 프로세서는 <http://example.com/shapes/company>를 사용하여 해당 그래프를 식별합니다.
이는 추가 owl:imports 문을 따라갈 때 적용되며, 이 경우 가져오는 것은
<http://example.com/shapes/base>입니다.
{
"@graph": [
{
"@id": "http://example.com/shapes/myapp",
"owl:imports": {
"@id": "http://example.com/shapes/company/v2"
}
},
{
"@id": "ex:PersonShape",
"@type": "sh:NodeShape",
"sh:targetClass": { "@id": "ex:Person" },
"sh:property": {
"sh:path": { "@id": "ex:worksFor" },
"sh:class": { "@id": "ex:Company" }
}
}
]
}
{
"@graph": [
{
"@id": "http://example.com/shapes/company",
"owl:versionIRI": {
"@id": "http://example.com/shapes/company/v2"
},
"owl:imports": {
"@id": "http://example.com/shapes/base"
}
},
{
"@id": "ex:CompanyShape",
"@type": "sh:NodeShape",
"sh:targetClass": { "@id": "ex:Company" },
"sh:property": {
"sh:path": { "@id": "ex:name" },
"sh:minCount": 1,
"sh:datatype": { "@id": "xsd:string" }
}
}
]
}
결과 그래프는 변경 불가능한 셰이프 그래프를 구성하며, 검증에 사용됩니다.
owl:versionIRI로 버전이 지정된 셰이프 그래프를 가져올 때에는
호환되지 않는 버전을 가져오지 않도록 주의하는 것이 좋습니다. 특히 셰이프 그래프의 가져오기 폐포에는
포함하지 않는 것이 좋습니다. 동일한 계열의 서로 다른 버전인 두 그래프,
또는 한쪽이
다른 쪽에 대해 owl:incompatibleWith를 선언한 두 그래프가 이에 해당합니다. 이러한 셰이프 그래프는
형식이
올바르지 않은 것으로 간주됩니다. 형식이 올바른 셰이프
그래프의 정의에서 자세한 내용을 참조하세요.
셰이프 그래프에는 셰이프 선언 외에도 SHACL
프로세서를 위한 추가 정보(예: sh:entailment 문)가 포함될 수 있습니다.
모든 RDF 그래프는 데이터 그래프가 될 수 있습니다.
sh:DataGraph 클래스는 사용해도 됩니다. 이는 rdf:type으로,
다음 IRI에 적용됩니다.
해당 그래프가 일반적으로 사용되는 용도는 데이터 그래프입니다.
그래프 유형 클래스(예: sh:DataGraph 및 sh:ShapesGraph)는
상호 배타적이지 않은 역할을 나타내며, 하나의 그래프에 유형을 지정해도 됩니다.
이러한 클래스 중 둘 이상으로 지정할 수 있습니다.
예를 들어, 셰이프 그래프는 역할을 수행해도 됩니다. 이때 역할은
데이터
그래프이며,
셰이프 자체를 검증할 때 적용됩니다.
이 절의 나머지 부분은 비규범적입니다.
데이터 그래프는 SHACL 프로세서의 입력 중 하나로, 용도는 검증입니다. SHACL 프로세서는 이를 일반적인 RDF 그래프로 취급하며 그 특성에 대해 어떠한 가정도 하지 않습니다. 예를 들어, 메모리 내 그래프나 RDF 데이터셋 또는 SPARQL 엔드포인트의 명명된 그래프일 수 있습니다.
SHACL은 어떤 방법으로 얻은 RDF 그래프와도 사용할 수 있습니다. 예를 들어 파일 시스템, HTTP 요청 또는 RDF 데이터셋에서 얻을 수 있습니다. SHACL은 그래프에 해당 그래프로부터 함의되는 트리플이 포함되어 있는지에 대해 어떠한 가정도 하지 않으며, 이는 모든 RDF 함의 체계에 적용됩니다.
데이터 그래프에는 데이터와 관련된 모든 온톨로지 공리, 특히 모든
rdfs:subClassOf 트리플이 포함되어야 SHACL이 클래스 대상을 올바르게 식별하고 검증할 수 있습니다.
검증하는 것은 SHACL Core 제약 조건입니다.
데이터 그래프의 owl:imports는 실행되지 않으며, 이는 통제되지 않는 증가를 방지하기 위한 것입니다.
증가하는 것은 검증 작업입니다. 검증하려는 것이
여러 관련 온톨로지라면, 모두 SHACL 프로세서에 전달하세요(한꺼번에 또는 하나씩). 이때
owl:imports 링크에 의존하지 마세요.
SHACL은 데이터 그래프에서 owl:imports를 실행하지 않지만, 데이터 그래프 관리자는
실제로 의존하는 애플리케이션이 있음을 유념하는 것이 좋습니다.
이들은 owl:imports의 동작을 가져오기 지시문으로 사용합니다. 특히 일부 애플리케이션은
구문적으로 직접적인
X a owl:Ontology .의 존재에 의존할 수 있으며, 이 경우 X owl:imports Y .는
owl:imports 문을
Y를 로드하는 지시문으로 처리합니다. OWL 2
웹 온톨로지 언어 매핑:
RDF 그래프로의 매핑, 3.1.1절에서 자세한 내용을 참조하세요. 따라서 다음 형식의 문을 사용할 때에는
X a sh:DataGraph ., X a owl:Ontology .도
포함하는 것이 좋습니다.
결과 그래프는 RDF 그래프이며, 이를 출력하는 것은 검증입니다.
결과 그래프는 반드시 다음을 포함해야 합니다. 검증 보고서이며, 또한 포함해도 됩니다. 그 밖의 요소를 정의하는 것은 SHACL 1.2 프로파일링의 어휘입니다.
SHACL 1.2 프로파일링 어휘의 모든 요소는 SHACL 네임스페이스 내에 포함되므로 추가적인 RDF 리소스는 필요하지 않습니다. SHACL 1.2 Core에 이미 필요한 리소스만 있으면 됩니다.
SHACL의 일부 기능(예:
7.1.1 sh:class,
3.1.3.2 클래스 기반 대상
(sh:targetClass) 및
3.1.3.3 암시적 클래스 대상
및 sh:ShapeClass)은 다음 개념에 의존합니다.
이는 SHACL 유형이며, 이를 통해 노드가
다음에 해당하는지 판단합니다. SHACL 인스턴스이며, 주어진 클래스에 대한 것입니다.
기본적으로 이는 rdfs:subClassOf 및 rdf:type 트리플을 조회하여 판단하며,
조회 위치는 데이터 그래프입니다.
그러나 일부 경우에는 이것으로 충분하지 않습니다. rdfs:subClassOf 트리플이 흔히 저장되는
위치는
인스턴스 데이터가 아니라 클래스 및/또는 셰이프 정의의 일부이기 때문입니다.
SHACL 프로세서는 제공하는 것이 좋습니다. 매개변수 subClassOfInShapesGraph이며,
이 값이 true로 설정되면,
다음 정의를 변경하는 것이 좋습니다. SHACL 유형의 정의를 변경하여 rdfs:subClassOf 트리플을
조회하는 위치에
다음을 포함합니다. 셰이프 그래프를 추가하며, 기존 위치는 데이터 그래프입니다.
rdf:type 트리플은 항상 다음에 있어야 합니다. 데이터 그래프입니다.
데이터
그래프에는 SHACL 프로세서에 하나 이상의 그래프를 제안하는 데 사용하는 트리플이 포함될 수 있으며,
술어는 sh:shapesGraph입니다.
모든 값,
즉 sh:shapesGraph의 값은 IRI입니다. 이 IRI가 나타내는 그래프는 포함하는 것이
좋습니다. 포함 위치는 셰이프 그래프이며, 이를 통해 검증하는 것은 데이터
그래프입니다.
sh:shapesGraph의 값은 다음의 값일 수 있습니다. owl:versionIRI이며,
따라서 버전 IRI로부터 셰이프 그래프 IRI를 해석하는 동일한 전략이 적용됩니다. 이는 셰이프 그래프에서 설명한 전략입니다.
다음 예제에서 SHACL 프로세서는 합집합을 사용하는 것이 좋습니다. 대상은
ex:graph-shapes1 및 ex:graph-shapes2 그래프(그리고 해당
owl:imports)이며, 이를 셰이프 그래프로 사용하여 주어진 그래프를 검증합니다.
셰이프 그래프는 sh:dataGraph 술어를 사용하여 SHACL 프로세서에 하나 이상의
데이터
그래프를 제안하는 트리플을 포함할 수 있다. sh:dataGraph의 각 값은 IRI이다. 이는 해당 셰이프 그래프가 검증하려는
그래프를 나타낸다. SHACL 프로세서는 데이터 그래프가 명시적으로 제공되지 않은 경우 이 값을 사용하여 데이터 그래프를 결정할 수 있다. sh:shapesGraph와 달리, sh:dataGraph가 참조하는 그래프의
owl:imports 문은 따르지 않는다. 이는 데이터 그래프에서 owl:imports를
처리하는 방식과 일치한다.
다음 예제에서 셰이프 그래프는 다음 데이터 그래프를 검증하기 위한 것임을 나타낸다: ex:bridges-2026.
검증은 어떤 입력으로부터 다음으로의 매핑입니다. 검증 결과로의 매핑이며, 다음 단락에서 정의합니다.
셰이프 그래프에 대한 데이터 그래프의 검증: 주어진 데이터 그래프와 셰이프 그래프에 대해, 검증 결과는 다음 결과의 합집합입니다. 검증의 대상은 데이터 그래프이며, 기준은 모든 셰이프입니다. 이들이 속한 것은 셰이프 그래프입니다.
셰이프에 대한 데이터 그래프의 검증: 주어진 데이터 그래프와 셰이프에 대해, 이 셰이프가 속한 것은 셰이프 그래프이며, 검증 결과는 다음 결과의 합집합입니다. 검증의 대상은 모든 초점 노드이며, 이들은 대상에 속합니다. 이는 셰이프의 대상이며, 위치는 데이터 그래프입니다.
셰이프에 대한 초점 노드의 검증: 주어진 초점 노드가 속한 데이터 그래프와, 주어진 셰이프가 속한 셰이프 그래프에 대해, 검증 결과는 다음 결과의 합집합입니다. 검증의 대상은 초점 노드이며, 기준은 모든 제약 조건입니다. 이를 선언한 것은 셰이프입니다. 단, 셰이프가 이미 비활성화된 경우에는, 이때의 검증 결과는 비어 있습니다.
제약 조건에 대한 초점 노드의 검증:
주어진 초점
노드가 속한 데이터 그래프와, 주어진 제약 조건의 종류가
C이며 이 제약 조건이 속한 셰이프 그래프에 대해,
검증 결과를 정의하는 것은 검증기이며, 이 검증기가 속한 것은 제약 조건
구성 요소 C입니다.
이러한 검증기는 일반적으로 다음을 입력으로 받습니다. 초점 노드, 구체적인
값으로서
매개변수의 값이며 이는 C에 속하고,
해당 제약
조건의 위치는 셰이프 그래프입니다. 그리고 값
노드도 받으며, 이는 셰이프의 값 노드이고 해당 셰이프가 제약 조건을 선언합니다.
검증 중에는 데이터 그래프와 셰이프 그래프가 반드시 변경 불가능한 상태를 유지해야 합니다. 즉, 검증 종료 시 두 그래프는 반드시 검증 시작 시의 그래프와 동일해야 합니다. SHACL 프로세서는 그래프를 변경해서는 안 됩니다. 이 그래프는 셰이프 그래프 또는 데이터 그래프를 구성하는 데 사용한 그래프이며, 저장된 그래프의 변경을 허용하는 RDF 저장소의 일부인 경우에도 마찬가지입니다. SHACL 프로세서는 저장해도 됩니다. 자체적으로 생성한 그래프이며, 예를 들어 검증 결과가 포함된 그래프입니다. 이 작업은 RDF 저장소의 기존 그래프를 변경해도 됩니다. 다만 셰이프 그래프 또는 데이터 그래프를 구성하는 데 사용한 그래프는 변경할 수 없습니다. 따라서 SHACL 처리는 멱등적입니다.
검증과 적합성 검사는 실패를 초래할 수 있습니다. 예를 들어, 특정 SHACL 프로세서는 재귀적 셰이프를 허용하지만 실패를 보고할 수 있습니다. 데이터 내에서 순환을 감지한 경우입니다. 리소스 고갈로 인해 실패가 보고될 수도 있습니다. 실패는 구현별 채널을 통해 알립니다.
만약 셰이프 그래프에 형식이 올바르지 않은 노드가 포함되어 있다면, 검증 과정의 결과는 정의되지 않습니다. SHACL 프로세서는 생성하는 것이 좋습니다. 실패를 이 경우에 생성합니다. 또한 6.9.1.4 구문 검사: 셰이프 그래프 (sh:shapesGraphWellFormed)를 참조하세요.
다음 속성은 이른바 셰이프를 요구하는 제약 조건 매개변수이며, SHACL Core에 속합니다:
다음 속성은 이른바 리스트를 받는 제약 조건 매개변수이며, SHACL Core에 속합니다:
또한, sh:class, sh:datatype, sh:nodeKind,
sh:rootClass
및 sh:uniqueValuesFor는 리스트를 받는 제약 조건 매개변수가 됩니다. 해당 값이
다음인 경우입니다. SHACL 리스트입니다.
RDF 그래프 G의 셰이프 s1이 참조하는 셰이프가 s2이고,
이 셰이프가 G에 있는 경우란 s2가 다음의 값인 경우입니다. 리스트를 받지 않고
셰이프를 요구하는 어떤 제약 조건 구성 요소의 매개변수이거나, s2가 구성원인 경우이며,
이때의 값은
리스트를 받고 셰이프를 요구하는 어떤
제약 조건 구성 요소의 매개변수에 대한 값입니다.
또는 s2가 값으로서 sh:targetWhere에 지정된 경우입니다.
RDF 그래프 G의 셰이프가 재귀적
셰이프인 것은 G에서 다음과 같이 연결되는 경우입니다.
자신과 연결되며, 그 연결은 다음의 전이 폐포에 의합니다. 참조 관계이며 G 내의 관계입니다.
검증에서 재귀적 셰이프를 사용하는 것은 SHACL에서 정의하지 않으며 SHACL 프로세서 구현에 맡깁니다. 예를 들어, SHACL 프로세서는 재귀 시나리오를 지원하거나 감지 시 실패를 생성할 수 있습니다. 감지하는 것은 재귀입니다.
이 절의 나머지 부분은 비규범적입니다.
위의 재귀 정책은 다양한 구현 전략을 지원하기 위해 선택되었습니다. 재귀를 정의하지 않음으로써, 구현은 재귀를 지원하지 않도록 선택할 수 있으며, 이에 따라 순환을 지원할 필요 없이 정적인 SPARQL 쿼리 집합을 (SPARQL 엔드포인트에) 실행할 수 있습니다. 작업 그룹은 다른 구현이 재귀를 지원할 수 있으며 일부 셰이프 그래프가 이러한 특정 특성에 의존할 수 있음을 인지하고 있습니다. 향후 작업, 예를 들어 W3C 커뮤니티 그룹의 작업을 통해 정의될 것으로 기대합니다. 재귀가 명확히 정의된 특정 SHACL 방언을 정의하는 것입니다.
초점 노드의 적합 여부는 셰이프에 대해, 다음 조건을 만족하는 경우에만 성립합니다. 다음 결과 집합에서, 검증의 대상은 초점 노드이며 기준은 셰이프입니다. 집합에 어떠한 검증 결과도 포함되지 않아야 하며, 이때 해당하는 심각도 수준은 불허 수준 집합에 속하는 것입니다. 또한 어떠한 실패도 해당 검증에서 보고되지 않아야 합니다.
불허 심각도 수준 집합을 결정하는 것은 검증 과정이며, 적합성
검사는 그 과정의 일부입니다.
6.9.1.2
적합성 불허 집합 (sh:conformanceDisallows)을 참조하세요.
동일한 집합이 검증 자체와 검증 중 수행하는 모든 적합성 검사에 적용되며,
중첩된 검사도 포함됩니다.
기본적으로 불허 심각도 수준 집합에는 sh:Warning과
sh:Info가 포함됩니다.
예를 들어, 값 노드는 다음의 셰이프에 적합하지 않습니다.
sh:node의 셰이프이며, 해당 셰이프에 대한 검증이
심각도 sh:Warning의 검증 결과를 생성하는 경우입니다.
적합성 검사가 생성하는 것은
true이며, 이는 주어진 초점 노드가
적합한 경우에만
해당합니다.
기준은 주어진 셰이프이며, 그 외에는 false를 생성합니다.
모든 셰이프를 요구하는 제약 조건 매개변수,
즉 SHACL Core의 해당 매개변수는
적합성 검사에 의존한다는 점에 유의하세요.
이러한 경우, 검증 결과는 다음의 결과를 결정하는 데 사용됩니다.
적합성 검사의 결과이며, 이 검증 결과는
이를 둘러싼 검증 과정의 결과와 분리되어 일반적으로 동일한
검증 보고서에 포함되지 않습니다.
(다만 sh:detail의 값으로 포함되는 경우는 있을 수 있습니다.)
데이터 그래프는 속성을 사용해도 됩니다.
sh:conformsToShapesGraph를 사용하여 자신의 적합 여부를 나타내며, 기준은 주어진 셰이프 그래프입니다.
값은 IRI이며, 식별하는 것은 셰이프 그래프입니다.
이 속성에는 rdfs:domain sh:DataGraph와 rdfs:range sh:ShapesGraph가 있습니다.
셰이프 그래프에 대한 적합성 절을 참조하세요. SHACL 1.2 프로파일링에서 이 속성의 사용에 관한 자세한 내용을 확인할 수 있습니다.
검증 보고서는 다음의 결과입니다. 검증 과정의 결과이며, 보고하는 것은 적합성과 다음의 집합입니다. 모든 검증 결과의 집합입니다. 검증 보고서는 SHACL 검증 보고서 어휘로 기술하며, 이 절에서 정의합니다. 이 어휘는 구조적 정보를 표현하는 RDF 속성을 정의하며, 해당 정보는 지침을 제공할 수 있습니다. 데이터 그래프의 위반을 식별하거나 수정하는 방법에 관한 지침입니다.
SHACL 준수 프로세서는 반드시 다음을 반환할 수 있어야 합니다. 결과 그래프이며, 그 안의 검증 보고서에는 필요한 모든 검증 결과가 포함되어야 합니다. 이는 이 명세에서 설명하는 결과입니다. SHACL 준수 프로세서는 선택적 인수를 지원해도 됩니다. 이를 통해 반환되는 결과 수를 제한할 수 있습니다. 이러한 유연성은 예를 들어 일부 대규모 데이터셋 검증 사용 사례에서 필요합니다.
다음 그래프는 데이터 그래프를 검증한 검증 보고서의 예를 나타내며, 해당 데이터 그래프는 셰이프 그래프에 적합합니다.
다음 그래프는 데이터 그래프를 검증한 검증 보고서의 예를 나타내며,
해당 데이터 그래프는 셰이프 그래프에 적합하지 않습니다.
sh:resultMessage의 구체적인 값은 SHACL에서 의무화하지 않으며,
구현별 사항으로 간주한다는 점에 유의하세요.
SHACL 준수 프로세서는 다음을 반환하는 기능을 갖추어도 됩니다. 결과 그래프이며, 그 안의 검증 보고서는 추가 항목에 연결되고, 이를 설명하는 것은 SHACL 1.2 프로파일링의 어휘입니다.
다음의 결과는, 검증 과정의 결과는 정확히 하나의 SHACL 인스턴스를 가진
RDF 그래프이며, 인스턴스의 클래스는 sh:ValidationReport입니다.
검증 보고서 절을 참조하세요. SHACL 1.2
프로파일링에서 확장된 검증 결과에 관한 자세한 내용을 설명하며, 여기에 포함되는 것은
sh:ValidationReport의 인스턴스, 검증 입력의 세부 정보 및 검증 시스템의
세부 정보입니다.
결과 그래프의 각 sh:ValidationReport SHACL 인스턴스에는 정확히 하나의
sh:conforms 속성 값이 있으며, 이 값의 데이터타입은
xsd:boolean입니다.
이 값은 다음의 결과를 나타냅니다. 적합성 검사입니다.
각 검증 과정은 불허 심각도
수준 집합, 즉 적합성 불허 집합을 사용합니다.
기본 집합은 sh:Violation, sh:Warning 및
sh:Info로 구성됩니다.
검증 엔진은 이 집합을 사용자 정의하는 메커니즘을 제공해도 됩니다.
결과 그래프의 각 sh:ValidationReport SHACL 인스턴스는 하나 이상의 값을 가져도
됩니다.
이는 sh:conformanceDisallows 속성의 값입니다. 모든
sh:conformanceDisallows 값은 반드시 IRI여야 합니다.
검증 과정에서 기본 집합 이외의 집합을 사용했다면, 다음의 값은
sh:conformanceDisallows의 값이며,
반드시 해당 집합의 구성원과 정확히 일치해야 합니다.
sh:conformanceDisallows의 값이 없다면, 기본 집합을
사용한 것입니다.
집합에 속한 심각도 수준을 가진 sh:ValidationResult가 하나라도 있다면,
즉 불허 심각도 수준 집합에 속한다면, 반드시 sh:conforms의
값은
관련 sh:ValidationReport 인스턴스에서 false여야 합니다.
생성되는 모든 검증 결과에 대해, 이를 생성하는 것은 검증 과정이며,
(다음 맥락에서 언급된 결과는 제외합니다. 적합성
검사입니다.)
결과 그래프의 sh:ValidationReport SHACL 인스턴스에는
sh:result 속성 값이 있습니다.
각 sh:result 값은 SHACL 인스턴스이며, 그 클래스는
sh:ValidationResult입니다.
SHACL 검증 엔진은 다음 여부를 검사하도록 엄격히 요구되지는 않습니다. 셰이프 그래프의 형식이 올바른지 여부입니다.
이러한 검사를 수행하는 구현(예: 셰이프 그래프가
시스템에 설치될 때,
또는 검증 전이나 검증 중)은 속성을 사용하는 것이 좋습니다.
sh:shapesGraphWellFormed를 사용하여
검증 보고서의 이용자에게 이 사실을 알립니다.
결과 그래프의 sh:ValidationReport SHACL 인스턴스가
true를 값으로 가지며,
해당 속성이 sh:shapesGraphWellFormed라면, 프로세서는 다음을 확신한 것입니다. 셰이프 그래프는 다음에 사용된 그래프이며,
검증 과정에서 그 형식이 올바르다는 것입니다.
결과 그래프의 sh:ValidationReport SHACL 인스턴스는 값을 가져도 됩니다. 해당 속성은
sh:usedDataGraph입니다.
값은 IRI이며, 식별하는 것은 데이터 그래프입니다.
이를 검증한 것은 프로세서이며, 이를 통해 보고서를 생성했습니다.
데이터 그래프의 버전 IRI도 값으로 사용해도 됩니다. 해당
속성의 값입니다.
결과 그래프의 sh:ValidationReport SHACL 인스턴스는 값을 가져도 됩니다. 해당 속성은
sh:usedShapesGraph입니다.
값은 IRI이며, 식별하는 것은 셰이프 그래프입니다.
이를 사용한 것은 프로세서이며, 사용 시점은 검증
과정 중입니다.
셰이프 그래프의 버전 IRI도 값으로 사용해도 됩니다. 해당
속성의 값입니다.
결과 그래프의 sh:ValidationReport SHACL 인스턴스는 값을 가져도 됩니다. 해당 속성은
sh:usedConfiguration입니다.
값은 sh:ProcessorConfiguration의 인스턴스로, 상태 및
설정을 기술하는 대상은
프로세서이며, 보고서를 생성한 프로세서입니다.
SHACL 프로세서는 검증 동작을 변경해서는 안 됩니다. 변경의 근거가
sh:ProcessorConfiguration 인스턴스의 내용인 경우입니다.
sh:ProcessorConfiguration은 프로세서 구성의 클래스입니다.
이 클래스의 인스턴스는 SHACL 프로세서의 상태와 설정을 기술하며,
시점은 검증 보고서를 생성한 때입니다.
sh:ProcessorConfiguration 인스턴스의 속성은 이
명세에서 정의하지 않습니다.
구현은 이 클래스의 인스턴스에 필요한 모든 속성을 자유롭게 정의할 수 있습니다. 예를 들어 프로세서 이름, 프로세서 버전, 최대 재귀 깊이 또는 기타 런타임 매개변수 등이 있습니다.
SHACL은 sh:ValidationResult를 sh:AbstractResult의 하위 클래스로 정의하여
개별 SHACL 검증 결과를 보고합니다.
SHACL 구현은 다른 SHACL 하위 클래스를 사용할 수 있으며, 상위 클래스는
sh:AbstractResult입니다. 예를 들어,
성공적으로 완료된 제약 조건 검사나 누적된 결과를 보고하는 데 사용할 수 있습니다.
이 절의 나머지 하위 절에서 설명하는 모든 속성은
sh:ValidationResult에 지정할 수 있습니다.
sh:focusNode, sh:resultSeverity 및
sh:sourceConstraintComponent
속성만이 모든 검증 결과에 필수인 속성입니다.
각 검증 결과에는 sh:focusNode 속성 값이 정확히 하나 있으며,
이는 다음과 같습니다. 초점 노드로서 해당 결과를 유발한 노드입니다.
이는 초점 노드로서, 검증 결과가 생성될 때
검증된 노드입니다.
검증 결과에는 sh:resultPath 속성 값이 있을 수 있으며, 이는 형식이 올바른 SHACL
속성 경로를 가리킵니다.
다음에 의해 생성된 결과의 경우, 속성 셰이프가 생성한 결과에서 이 SHACL 속성
경로는 다음과 동등합니다. 값으로서 셰이프의 sh:path 값이며,
달리 명시되지 않는 한 그렇습니다.
sh:path p가 공백 노드라면, sh:resultPath는
깊은 복사본으로서 결과 그래프 내의 p 복사본입니다.
검증 결과에는 다음의 값으로 포함될 수 있습니다. 해당 속성은
sh:value이며,
결과를 유발한 RDF 용어를 최대 하나 포함할 수 있습니다.
SHACL Core 구성 요소의 검증기에 대한 텍스트 정의는 이
값을 구성하는 방법을 지정합니다. 흔히 이 값은 값 노드이며, 위반한 것은
제약 조건입니다.
검증 결과에는 유일한 값으로 포함될 수 있습니다. 해당 속성은
sh:sourceShape이며,
포함되는 것은 셰이프로서, 주어진 sh:focusNode가 검증될 때
기준이 된 셰이프입니다.
검증 결과에는 다음 속성의 값이 정확히 하나 있습니다.
sh:sourceConstraintComponent이며,
이 값은 IRI입니다.
해당 제약 조건 구성 요소가 결과를 유발한 것입니다.
예를 들어, 다음의 값에 기반한 제약 조건을 위반하여 생성된 결과라면,
sh:minCount의 값이며,
출처 제약 조건 구성 요소는 sh:MinCountConstraintComponent입니다.
sh:detail 속성은 (상위) 결과를 하나 이상의 SHACL 인스턴스와 연결할 수 있으며,
해당 클래스는
sh:AbstractResult입니다. 이 인스턴스는 (상위) 결과의 원인에 관한 추가
세부 사항을 제공할 수 있습니다.
SHACL 프로세서의 기능에 따라, 예를 들어 다음의 위반이 포함될 수 있습니다.
sh:node를 통한 적합성 검사의 일부로 평가된 제약 조건의 위반입니다.
검증 결과에는 sh:resultMessage 속성의 값이 있을 수 있으며,
예를 들어 사람에게 추가적인 텍스트 세부 정보를 전달하는 데 사용합니다.
sh:resultMessage에는 여러 값이 있을 수 있지만, 두 값에
동일한 언어 태그가 있어서는 안 됩니다.
이러한 값은 검증 엔진이 sh:message의 값을 기반으로 생성하며,
해당 제약 조건은
셰이프 그래프에 있습니다. 셰이프의 메시지 선언을 참조하세요.
구체화를 사용하여 선언한 메시지는 이를 둘러싼
셰이프에서 선언한 메시지보다 우선합니다.
제약 조건에 셰이프 그래프 내의 sh:message 값이 전혀
없는 경우,
SHACL 프로세서는 다른 값을 자동으로 생성해도 됩니다.
sh:resultMessage의 값입니다.
각 검증 결과에는 정확히 하나의 값이 있으며, 해당 속성은
sh:resultSeverity이고 이 값은 IRI입니다.
값은 다음 규칙에 따라 (순서대로) 결정됩니다:
sh:severity의 값이며,
해당 위치는 구체화자입니다. 다음 중 어느 트리플의 구체화자든 해당하며, 포함하는 것은 매개변수입니다. 이는 제약 조건의
매개변수이며,
해당 제약 조건이 결과를 유발했습니다.sh:severity의 값이며,
해당 속성을 가진 셰이프는 다음에 속합니다. 셰이프
그래프에 속하며 해당 셰이프가 결과를 유발했습니다.sh:Violation이며, sh:severity가 지정되지 않은 경우입니다.
셰이프나 제약 조건에 지정되지 않은 경우에 해당합니다.데이터 그래프에는 의도적으로 일부 정보만 포함될 수 있습니다. 그 대상은 일부 노드이며, 예를 들어 관심 영역 밖의 "외부" 리소스에 연결하는 경우, 또는 나머지 트리플이 아직 입력되지 않았지만 나중에 입력될 것으로 예상되는 노드에 연결하는 경우입니다. SHACL은 다음에서 사용할 수 있는 두 속성을 정의합니다. 데이터 그래프에서 이러한 노드를 불완전한 것으로 선언하는 데 사용합니다:
sh:incomplete는 다음 여부를 나타냅니다. 주어가 불완전한지(true) 또는 완전한지
(false) 여부입니다.
다음 값, 즉 sh:incomplete의 값은 리터럴이며, 데이터타입은
xsd:boolean입니다.
sh:incompleteURIStart의 값이 true이면, 다음을 가진 모든 노드를 선언합니다.
해당 IRI가 주어의 IRI로 시작하는 노드이며,
이 노드들은 불완전합니다(주어 자체는 제외). 단, 달리 명시된 경우는 제외하며, 사용하는 것은
sh:incomplete false입니다.
다음 값, 즉
sh:incompleteURIStart의 값은 리터럴이며, 데이터타입은
xsd:boolean입니다.
다음 주어, 즉 트리플의 주어이며 그 술어가
sh:incompleteURIStart인 경우, 이는 IRI입니다.
불완전성 값은 다음 노드
n에 대해 다음의 값입니다.
sh:incomplete의 값으로,
n에 대한 값이며 위치는 데이터 그래프입니다. 여기에 더해 값 노드도 포함하며,
n이 초점 노드인 각 속성 셰이프
p에 대한 것입니다.
이 셰이프가 속한 셰이프 그래프에서 sh:incomplete를 값으로 가지며,
해당 속성은 sh:path입니다.
여기서 n은 다음에 속합니다. 셰이프의 대상이며 해당 셰이프는
p입니다. 또는 다음의 셰이프의 대상에 속하며, 해당 셰이프는
p를 값으로 갖고 해당 속성은 sh:property입니다.
이를 통해 다음을 선언할 수 있습니다. 노드가 불완전함을 셰이프 그래프에서 선언하며,
sh:values 또는 sh:defaultValue를 사용합니다.
(6.10.2 값
노드: 속성 셰이프의 값 노드를 참조하세요.)
노드 n이 불완전한 것은 false가 포함되지 않은 경우입니다.
포함 여부를 판단하는 것은
불완전성 값으로, n의 값이며, 또한 적어도
다음 조건 중 하나를 만족해야 합니다:
true가 다음에 포함됩니다. 불완전성 값이며, 해당 노드는
n입니다.
n은 IRI이며,
다음으로 시작하지만 동일하지는 않습니다. IRI로서,
어떤 주어의 IRI이며 해당 주어는 true를 유일한 값으로 갖습니다.
해당 속성은
sh:incompleteURIStart이고, 위치는 데이터 그래프입니다.
특히, 노드에 true와 false가 모두
다음에 포함되어 있다면, 불완전성 값에 포함된 경우 해당 노드는 아닙니다. 불완전한 노드가 아닙니다.
불완전한 노드의 존재는 검증 결과를 변경하지 않습니다.
해당 결과에는
sh:conforms의 값도 포함되며, 이는 검증
보고서의 값입니다.
이 절의 나머지 부분은 비규범적입니다.
SHACL 기반 도구는 불완전한 데이터 트리플을 사용해도 됩니다. 이를 통해 변경하는 것은 표시 방식이며, 불완전한 데이터로 인해 발생한 검증 결과의 표시 방식입니다. 특히, 도구는 다음을 수행해도 됩니다:
sh:minCount 위반을 시각적으로 숨기거나 낮은 수준으로 표시하며, 대상은 불완전한 초점 노드입니다.sh:class 위반을 시각적으로 숨기며, 대상은 불완전한
값 노드입니다.
위 목록이 모든 경우를 망라하지는 않습니다.
다른 예로는 sh:node와 sh:qualifiedMinCount가 있습니다.
다음 예제에서 ex:Bob은 불완전한 것으로 선언되며, 사용하는 것은
sh:incomplete입니다.
그의 이메일 주소가 아직 입력되지 않았기 때문입니다.
ex:Bob과 ex:Carla는 모두 sh:minCount 제약 조건을 위반하지만,
도구는 ex:Bob의 위반을 숨기도록 선택할 수 있으며,
ex:Carla의 위반은 정상적으로 표시합니다.
다음 예제에서 데이터 그래프는 다른 곳에서 기술된 회사에 연결하며, 해당 위치는
다른 그래프입니다.
sh:incompleteURIStart를 사용하여 모든 IRI, 즉
이러한 회사의 IRI를 불완전한 것으로 선언하여,
누락된 rdf:type 트리플을 반드시 표시하지 않아도 되도록 합니다.
sh:class 위반으로
최종 사용자에게 표시하는 것을 말합니다.
따라서 ex:Alice의 위반은 숨겨질 수 있습니다.
ex:Bob의 위반은 정상적으로 표시됩니다. 그의 고용주가
sh:incomplete false를 사용하여 완전한 것으로 선언되었기 때문입니다.
ex:Carla는 적합합니다. 그녀의 고용주가 ex:Company라고 명시되어 있기 때문입니다.
sh:incompleteURIStart의 주어 자체는 집합에 포함되지 않습니다.
불완전한 IRI의 집합입니다.
IRI는 문자열로 비교하므로, 예를 들어 주어
<http://example.org/comp>는 다음에도 적용됩니다.
<http://example.org/company/X>입니다.
따라서 / 또는 다음과 같은 구분자로 끝나는 주어를 사용하는 것이 좋습니다.
#이며, 네임스페이스와 같은 방식입니다.
다음 예제에서 셰이프 그래프는 다음 상태를 가진 모든 사람을 선언합니다.
ex:WorkInProgress 상태이며, 불완전한 것으로 선언합니다.
속성 셰이프에 sh:path sh:incomplete가 있으며,
제약 조건은 없지만 해당 sh:values는 다음을 생성합니다. 값 노드이며,
true를 생성합니다.
이는 각 초점 노드에 대한 것이고 해당 셰이프는 ex:WorkInProgressShape입니다.
이로 인해
true가 다음 중 하나가 됩니다. 불완전성 값입니다.
ex:Dave와 ex:Erin은 모두 sh:minCount 제약 조건을 위반하지만,
도구는 ex:Dave의 위반을 숨기도록 선택할 수 있습니다.
sh:values를 사용해도, 명시적인 sh:incomplete false가 다음에 있으면, 데이터 그래프에 있으면 여전히 우선합니다.
이때 false도 다음에 포함되기 때문입니다. 불완전성 값입니다.
대신 sh:defaultValue true를 사용하면 true를 추가하는 대상은 다음뿐입니다. 초점 노드로서 다음 값이 없는 노드이며,
해당 속성은 sh:incomplete이고, 위치는
데이터 그래프입니다.
불완전성을 셰이프 그래프에서 선언하려면
SHACL 프로세서가 sh:values와 sh:defaultValue를 지원해야 합니다.
검증기는 대부분의 제약 조건 구성 요소에서 다음 개념을 사용합니다. 값 노드이며, 다음 두 하위 절에서 정의합니다.
다음의 경우, 속성 셰이프가 값을 가지며, 해당 속성은
sh:path이고 값은 p일 때,
다음 집합, 값 노드의 집합은 다음 단계에 따라 생성됩니다:
p입니다.
e가 다음의 값이라면, sh:values의 값이며 해당 위치는 속성 셰이프이고,
이때 추가하는 것은 출력 노드이며, 다음의 출력 노드입니다.
evalExpr(e, 데이터 그래프, 초점 노드, {}).
d가 다음의 값이라면, sh:defaultValue의 값이며,
해당 위치는 속성 셰이프이고,
이때 추가하는 것은 출력 노드이며, 다음의 출력 노드입니다.
evalExpr(d, 데이터 그래프, 초점 노드, {}).
이 절에서는 모든 SHACL 코어 처리기가 반드시 지원해야 하는 내장 SHACL 코어 제약 조건 컴포넌트를 정의합니다. 각 제약 조건 컴포넌트의 정의에는 해당 IRI와 매개변수 표가 포함됩니다. 달리 명시하지 않는 한, 이러한 모든 매개변수는 필수 매개변수입니다. 해당 매개변수 표에 열거된 구문 규칙 중 하나라도 위반하는 셰이프는 잘못 형성된 셰이프입니다.
각 제약 조건 컴포넌트에는 해당 컴포넌트와 연결된 검증기를 설명하는 텍스트 정의도
포함됩니다.
이러한 텍스트 정의에서는 제약 조건의 매개변수 값을 $paramName 형식의 변수로 참조합니다.
여기서 paramName은 매개변수의 IRI에서
sh: 네임스페이스 뒤에 오는 부분입니다.
예를 들어, sh:ClassConstraintComponent의 텍스트 정의에서는
$class 변수를 사용하여 sh:class의 값을 참조합니다.
SHACL 코어에서 매개변수 값이라는 용어는 매개변수의 값을
의미합니다.
즉, 셰이프
그래프에서 주어가
셰이프이고
술어가 매개변수(예: sh:class)인 트리플의 목적어를
의미합니다.
이 문서를 작성하는 시점에서 워킹 그룹은 SHACL 코어 외부에 SHACL 방언을 정의하려고 합니다.
이 방언에서는
매개변수 값이라는 용어에 노드 표현식도 허용됩니다.
모든 제약 조건 컴포넌트가 매개변수 값이라는 용어를 사용하는 것은 아니며,
대신 값이라는 용어를
참조하기도 합니다.
예를 들어, sh:node의 값은 결코 노드 표현식이
될 수 없습니다. 이는
빈 노드의 처리를 복잡하게 만들기 때문입니다.
SHACL 코어의 상수 IRI와 리터럴 이외의 노드 표현식은 [shacl12-node-expr]에서 정의합니다.
이러한 검증기는 해당 구성 요소에서 생성하는 유일한 검증 결과를 정의한다는 점에 유의하십시오. 또한, 검증기는 항상 새로운 결과 노드를 생성합니다. 즉, 텍스트 정의에서 다음과 같이 명시하는 경우 "...검증 결과가 있습니다..." 이는 결과 그래프의 별개의 새 노드를 가리킵니다.
이 절의 나머지 부분은 비규범적입니다.
SHACL 코어에 포함할 제약 조건 컴포넌트는 [shacl-ucr] 문서에서 수집한 요구사항을 기반으로 선정했습니다. 가능한 한 많은 일반적인 사용 사례를 다루는 것과 코어 언어의 규모를 관리 가능한 수준으로 유지하는 것 사이의 균형에 특별히 주의를 기울였습니다. 코어 언어만으로 모든 사용 사례를 표현할 수 있는 것은 아닙니다. 대신 SHACL-SPARQL [shacl12-sparql]은 확장 메커니즘을 제공합니다. 향후 제3자가 재사용 가능한 추가 제약 조건 컴포넌트 라이브러리를 유지 관리할 것으로 예상됩니다.
달리 명시하지 않는 한, 코어 제약 조건 컴포넌트는 속성 셰이프와 노드
셰이프 모두에서 사용할 수 있습니다.
일부 제약 조건 매개변수에는 이를 사용하는 노드 셰이프를
잘못 형성된
상태로 만드는 구문 규칙이 적용됩니다.
예를 들어 sh:minCount는 속성 셰이프에서만 지원됩니다.
이 절의 제약 조건 컴포넌트는 값 노드의 유형을 제한하는 데 사용할 수 있다는 공통점이 있습니다. sh:or를 사용하여 여러 값 유형의 대안을 표현할 수 있다는 점에 유의하세요.
sh:class가 지정하는 조건은 각 값 노드가 주어진 유형의 SHACL 인스턴스여야 한다는
것입니다.
제약 조건 컴포넌트 IRI:
sh:ClassConstraintComponent
| 속성 | 요약 및 구문 규칙 |
|---|---|
sh:class |
모든 값 노드의 유형입니다.
셰이프에서
sh:class의 값은 IRI
또는 모든 구성원이
IRI인 올바르게
형성된 SHACL
목록인 빈 노드입니다.
|
이 절의 나머지 부분은 비규범적입니다.
sh:class의 여러 값은 논리곱으로 해석된다는 점에 유의하세요.
즉, 값은 모든 클래스의 SHACL 인스턴스여야 합니다.
합집합 의미 체계를 사용하려면 목록을 사용하세요.
다음 예제는 sh:class에 목록 기반 구문을 사용하는 방법을 보여줍니다.
이는 ex:pet 속성의 값이 고양이 또는 개여야 함을 의미합니다.
sh:datatype은 각 값 노드의 데이터 유형과 관련하여 충족해야 하는 조건을
지정합니다.
제약 조건 컴포넌트 IRI:
sh:DatatypeConstraintComponent
| 속성 | 요약 및 구문 규칙 |
|---|---|
sh:datatype |
모든 값 노드에 허용되는 데이터 유형(예: xsd:integer)입니다.
셰이프는
sh:datatype에 대해 최대 하나의 값만 가질 수 있습니다.
셰이프에서
sh:datatype의 값은 IRI
또는 모든 구성원이
IRI인 올바르게
형성된 SHACL
목록인 빈 노드입니다.
|
$datatype을 매개변수 값으로 두며, 이는
sh:datatype에 대한 값입니다.
datatypes를 IRI의
집합으로 두고,
다음 조건을 충족하도록 합니다.
$datatype이 IRI인
경우
이 집합에는 정확히 해당 IRI만 포함되며,
$datatype이 빈 노드 SHACL 목록인 경우
이 집합에는
해당 목록의 구성원만 정확히 포함됩니다.datatypes의 어느 항목과도 일치하지 않으면,
검증 결과가 존재하며, 해당 값 노드를
sh:value로 갖습니다.이 절의 나머지 부분은 비규범적입니다.
sh:datatype의 값은 일반적으로 xsd:string과 같은 데이터
유형입니다.
다음 예제는 목록 기반 구문을 보여주며, 모든
rdfs:label 값이 xsd:string 또는 rdf:langString이어야 함을 의미합니다.
sh:nodeKind는 각 값 노드의 RDF 노드 종류가 충족해야 하는 조건을
지정합니다.
제약 조건 컴포넌트 IRI:
sh:NodeKindConstraintComponent
| 속성 | 요약 및 구문 규칙 |
|---|---|
sh:nodeKind |
모든 값 노드의 노드 종류(IRI, 빈 노드, 리터럴, 트리플 용어 또는 이들의 조합)입니다.
셰이프는
sh:nodeKind에 대해 최대 하나의 값만 가질 수 있습니다.
셰이프에서
sh:nodeKind의 값은 IRI 또는 모든 IRI를 구성원으로 갖는
올바르게 형성된 SHACL
목록인 빈 노드입니다.
sh:nodeKind의 값이 IRI이면, 셰이프에서 해당 값은
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.
|
$nodeKind를 sh:nodeKind의 매개변수 값이라고
하겠습니다.
nodeKinds를 IRI의
집합이라고
하겠습니다. 이 집합은
$nodeKind가 IRI이면
정확히 해당 IRI 하나로만 구성되고,
$nodeKind가 빈 노드인 SHACL 목록이면
정확히 해당 목록의
구성원으로만 이루어집니다.nodeKinds 중 어느 것과도 일치하지 않는 각 값 노드에 대해
해당 값 노드를 sh:value로 갖는 검증 결과가 존재합니다.
모든 IRI는 sh:IRI,
sh:BlankNodeOrIRI 및 sh:IRIOrLiteral에만 일치합니다.
모든 빈 노드는 sh:BlankNode,
sh:BlankNodeOrIRI 및 sh:BlankNodeOrLiteral에만 일치합니다.
모든 리터럴은 sh:Literal,
sh:BlankNodeOrLiteral 및 sh:IRIOrLiteral에만 일치합니다.
모든 트리플 용어는
sh:TripleTerm에만 일치합니다.
이 절의 나머지 부분은 비규범적입니다.
다음 예제는 모든 주어에서 ex:knows의 값이 반드시 IRI여야 함을
나타냅니다.
다음 예제는 목록 기반 구문을 보여주며, 모든 주어에서
ex:knows의 값이
IRI 또는 빈 노드여야 함을 의미합니다.
다음 제약 조건 컴포넌트는 주어진 초점 노드의 값 노드 수에 대한 제한을 나타냅니다.
sh:minCount는 조건을 충족하는 값 노드의 최소 개수를
지정합니다.
최소 기수 값이 0이면 이 제약 조건은 항상 충족되므로
생략할 수 있습니다.
제약 조건 컴포넌트 IRI:
sh:MinCountConstraintComponent
| 속성 | 요약 및 구문 규칙 |
|---|---|
sh:minCount |
최소 기수입니다.
노드 셰이프는
sh:minCount에 대한 값을 가질 수 없습니다.
속성 셰이프는
sh:minCount에 대해 최대 하나의 값만 가질 수 있습니다.
속성 셰이프에서
sh:minCount의 값은 데이터 유형이
xsd:integer인 리터럴입니다.
|
이 절의 나머지 부분은 비규범적입니다.
sh:maxCount는 조건을 충족하는 값 노드의 최대 개수를
지정합니다.
제약 조건 컴포넌트 IRI:
sh:MaxCountConstraintComponent
| 속성 | 요약 및 구문 규칙 |
|---|---|
sh:maxCount |
최대 기수입니다.
노드 셰이프는
sh:maxCount에 대한 값을 가질 수 없습니다.
속성 셰이프는
sh:maxCount에 대해 최대 하나의 값만 가질 수 있습니다.
속성 셰이프에서
sh:maxCount의 값은 데이터 유형이
xsd:integer인 리터럴입니다.
|
이 절의 나머지 부분은 비규범적입니다.
다음 제약 조건 컴포넌트는 값 노드가 충족해야 하는 값 범위 조건을 지정하며, 해당 값 노드는
비교할 수 있어야 합니다.
비교에는 <, <=, > 및 >=와 같은 연산자를 사용합니다.
다음 예제는 이러한 제약 조건 컴포넌트의 일반적인 사용 사례를 보여줍니다.
sh:minExclusive는 각 값 노드가 초과해야 하는 배타적 최솟값을 지정합니다.
제약 조건 컴포넌트 IRI:
sh:MinExclusiveConstraintComponent
| 속성 | 요약 및 구문 규칙 |
|---|---|
sh:minExclusive |
배타적 최솟값입니다.
셰이프에서 sh:minExclusive의 값은
리터럴입니다.
셰이프는
sh:minExclusive에 대해 최대 하나의 값만 가질 수 있습니다.
|
이 절의 나머지 부분은 비규범적입니다.
값 노드를 지정된 범위와 비교할 수 없는 경우에도 검증 결과가 발생합니다. 예를 들어 문자열을 정수와 비교하는 경우입니다.
sh:minInclusive는 각 값 노드가 크거나 같아야 하는 포괄적 최솟값을 지정합니다.
제약 조건 컴포넌트 IRI:
sh:MinInclusiveConstraintComponent
| 속성 | 요약 및 구문 규칙 |
|---|---|
sh:minInclusive |
포괄적 최솟값입니다.
셰이프에서 sh:minInclusive의 값은
리터럴입니다.
셰이프는
sh:minInclusive에 대해 최대 하나의 값만 가질 수 있습니다.
|
sh:maxExclusive는 각 값 노드가 미만이어야 하는 배타적 최댓값을 지정합니다.
제약 조건 컴포넌트 IRI:
sh:MaxExclusiveConstraintComponent
| 속성 | 요약 및 구문 규칙 |
|---|---|
sh:maxExclusive |
배타적 최댓값입니다.
셰이프에서 sh:maxExclusive의 값은
리터럴입니다.
셰이프는
sh:maxExclusive에 대해 최대 하나의 값만 가질 수 있습니다.
|
sh:maxInclusive는 각 값 노드가 작거나 같아야 하는 포괄적 최댓값을 지정합니다.
제약 조건 컴포넌트 IRI:
sh:MaxInclusiveConstraintComponent
| 속성 | 요약 및 구문 규칙 |
|---|---|
sh:maxInclusive |
포괄적 최댓값입니다.
셰이프에서 sh:maxInclusive의 값은
리터럴입니다.
셰이프는
sh:maxInclusive에 대해 최대 하나의 값만 가질 수 있습니다.
|
이 절의 제약 조건 컴포넌트는 값 노드의 문자열 표현에 대한 조건을 지정한다는 공통점이 있습니다.
sh:minLength는 조건을 충족하기 위해 각 값 노드가
가져야 하는 최소 문자열 길이를 지정합니다.
이는 모든 리터럴과 IRI에
적용할 수 있지만, 빈 노드에는 적용할 수 없습니다.
제약 조건 컴포넌트 IRI:
sh:MinLengthConstraintComponent
| 속성 | 요약 및 구문 규칙 |
|---|---|
sh:minLength |
최소 길이입니다.
셰이프에서
sh:minLength의 값은 데이터 유형이
xsd:integer인 리터럴입니다.
셰이프는
sh:minLength에 대해 최대 하나의 값만 가질 수 있습니다.
|
$minLength를 sh:minLength의 매개변수 값이라고
하겠습니다.
각 값 노드 v에 대해,
v의 문자열 표현의 길이(SPARQL STRLEN 함수에서 정의한 길이)가
v의 문자열 표현(SPARQL str 함수에서 정의한 표현)의
길이가 $minLength보다 짧거나 v가 빈 노드이면,
v를 sh:value로 갖는 검증 결과가
존재합니다.
이 절의 나머지 부분은 비규범적입니다.
sh:minLength의 값이 0이면
문자열 길이에 제한이 없지만, 값 노드가 빈 노드이면 여전히 제약 조건을 위반합니다.
sh:maxLength는 조건을 충족하기 위해 각 값 노드가
가져야 하는 최대 문자열 길이를 지정합니다.
이는 모든 리터럴과 IRI에
적용할 수 있지만, 빈 노드에는 적용할 수 없습니다.
제약 조건 컴포넌트 IRI:
sh:MaxLengthConstraintComponent
| 속성 | 요약 및 구문 규칙 |
|---|---|
sh:maxLength |
최대 길이입니다.
셰이프에서
sh:maxLength의 값은 데이터 유형이
xsd:integer인 리터럴입니다.
셰이프는
sh:maxLength에 대해 최대 하나의 값만 가질 수 있습니다.
|
$maxLength를 sh:maxLength의 매개변수 값이라고
하겠습니다.
각 값 노드 v에 대해,
v의 문자열 표현의 길이(SPARQL STRLEN 함수에서 정의한 길이)가
v의 문자열 표현(SPARQL str 함수에서 정의한 표현)의
길이가 $maxLength보다 길거나 v가 빈 노드이면,
v를 sh:value로 갖는 검증 결과가
존재합니다.
이 절의 나머지 부분은 비규범적입니다.
sh:pattern은 각 값 노드가 조건을
충족하기 위해 일치해야 하는 정규 표현식을 지정합니다.
제약 조건 컴포넌트 IRI:
sh:PatternConstraintComponent
| 속성 | 요약 및 구문 규칙 |
|---|---|
sh:pattern |
모든 값 노드가 일치해야 하는 정규 표현식입니다.
셰이프에서
sh:pattern의 값은 데이터 유형이
xsd:string인 리터럴입니다.
셰이프에서
sh:pattern의 값은 SPARQL REGEX
함수의 유효한 패턴 인수입니다.
|
sh:flags |
선택적 플래그 문자열이며, SPARQL 1.2 REGEX와 같이 해석됩니다.
셰이프에서
sh:flags의 값은 데이터 유형이
xsd:string인 리터럴입니다.
|
$pattern을 sh:pattern의 매개변수 값이라고
하겠습니다.
$flags를 sh:flags의 매개변수 값이라고
하겠습니다.
각 값 노드가
빈 노드이거나,
문자열 표현(SPARQL str 함수에서 정의한 표현)이
정규 표현식 $pattern(SPARQL REGEX 함수에서 정의한 표현식)과 일치하지 않으면,
해당 값 노드를 sh:value로 갖는 검증 결과가 존재합니다.
$flags에 값이 있으면 일치는 반드시
$flags를 세 번째 인수로 사용하는 SPARQL REGEX 함수의 3개 인수 변형에 대한
정의를 따라야 합니다.
이 절의 나머지 부분은 비규범적입니다.
이 기능은 이 기능과 유사한 편의 기능에 관한 워킹 그룹의 결정을 기다리는 "위험 상태"에 있습니다. 워킹 그룹은 아직 코어에 포함할 기능과 다른 문서에 포함할 기능의 경계를 어디에 둘지 확신하지 못하고 있습니다. 원래 쟁점 177에서 논의되었습니다.
true로 설정하면 sh:singleLine은 값 노드에 줄바꿈이 포함되어서는 안 된다고 지정합니다.
제약 조건 검증 외에도 사용자 인터페이스 빌더는 이 정보를 활용하여
(단일 행) 텍스트 필드와 (여러 행) 텍스트 영역 중 하나를 선택할 수 있습니다.
제약 조건 컴포넌트 IRI:
sh:SingleLineConstraintComponent
| 속성 | 요약 및 구문 규칙 |
|---|---|
sh:singleLine |
이 제약 조건을 활성화하려면 true로 설정합니다.
셰이프에서
sh:singleLine의 값은 데이터 유형이
xsd:boolean인 리터럴입니다.
셰이프는
sh:singleLine에 대해 최대 하나의 값만 가질 수 있습니다.
|
이 절의 나머지 부분은 비규범적입니다.
이 예제에서 셰이프의 유효한 대상 노드는
rdfs:label에 대해 단일 행 값만 포함할 수 있습니다.
rdfs:comment의 값에는 줄바꿈이 명시적으로 허용되며,
이는 폼 빌더에
해당 값을 여러 행(텍스트 영역) 입력 위젯에서 편집해야 함을 알려줍니다.
sh:languageIn이 지정하는 조건은 각 값 노드에 허용되는 언어 태그가 주어진 언어 태그 목록으로 제한된다는
것입니다.
제약 조건 컴포넌트 IRI:
sh:LanguageInConstraintComponent
| 속성 | 요약 및 구문 규칙 |
|---|---|
sh:languageIn |
[BCP47]에 따른 기본 언어 범위 목록입니다.
셰이프에서
sh:languageIn의 각 값은 SHACL
목록입니다.
이러한 목록의 각 구성원은
데이터 유형이 xsd:string인 리터럴입니다.
셰이프는
sh:languageIn에 대해 최대 하나의 값만 가질 수 있습니다.
|
이 절의 나머지 부분은 비규범적입니다.
다음 예제 셰이프는 ex:prefLabel의 모든 값이
영어 또는 마오리어일 수 있다고 명시합니다.
예제 인스턴스에서 ex:Berg는 모든 레이블에 대해
제약 조건 위반을 발생시킵니다.
sh:uniqueLang 속성을 true로 설정하면 어떤 두 값 노드도 동일한 언어 태그를 사용할
수 없다고 지정하며,
텍스트 방향이 있는 경우 이를 함께 고려합니다.
제약 조건 컴포넌트 IRI:
sh:UniqueLangConstraintComponent
| 속성 | 요약 및 구문 규칙 |
|---|---|
sh:uniqueLang |
이 제약 조건을 활성화하려면 true로 설정합니다.
셰이프에서
sh:uniqueLang의 값은 데이터 유형이
xsd:boolean인 리터럴입니다.
속성
셰이프는 sh:uniqueLang에 대해 최대 하나의 값만 가질 수 있습니다.
노드 셰이프는
sh:uniqueLang에 대한 값을 가질 수 없습니다.
|
이 절의 나머지 부분은 비규범적입니다.
이 절의 제약 조건 컴포넌트는 SHACL 목록인 값 노드에 적용됩니다. 이러한 컴포넌트는 SHACL 목록의 구조, 길이 및 구성원에 대한 조건을 지정합니다.
sh:memberShape는 SHACL
목록인 값 노드의 모든 구성원이 주어진 노드 셰이프를 준수해야 한다고
지정합니다.
제약 조건 컴포넌트 IRI:
sh:MemberShapeConstraintComponent
| 속성 | 요약 및 구문 규칙 |
|---|---|
sh:memberShape |
SHACL 목록의 모든 구성원이 준수해야 하는 셰이프입니다.
sh:memberShape의
값은 올바르게 형성된 노드
셰이프여야 합니다.
|
이 절의 나머지 부분은 비규범적입니다.
값 노드 v의 구성원 중 $memberShape를 준수하지 않는 각 구성원 m은
v에 대한 검증 결과에서 별도의
sh:detail로 보고하는 것이 좋습니다.
v가 유효한 SHACL 목록이 아니라면,
이를 최상위 검증 결과로 보고하고 개별 구성원의
검증을 시도하지 않는 것이 좋습니다.
검증 결과에서 sh:detail을 생성하는 방법의 예제는 SHACL 테스트 스위트의
sh:memberShape 테스트 사례에서 확인할 수 있습니다: memberShape-001.ttl.
다음 예제에서 ex:speakerOrder 속성의 모든 값은 구성원이 IRI인
SHACL 목록이어야 합니다.
sh:minListLength는 SHACL 목록인 값
노드가 가져야 하는 최소 구성원 수를 지정합니다.
제약 조건 컴포넌트 IRI:
sh:MinListLengthConstraintComponent
| 속성 | 요약 및 구문 규칙 |
|---|---|
sh:minListLength |
SHACL 목록의 최소 구성원 수입니다.
셰이프에서 sh:minListLength의
값은 데이터 유형이 xsd:integer인 리터럴입니다.
셰이프에서
sh:minListLength의 값은
0 이상의 정수입니다.
셰이프는
sh:minListLength에 대해 최대 하나의 값만 가질 수 있습니다.
|
이 절의 나머지 부분은 비규범적입니다.
다음 예제에서 ex:skills 속성의 모든 값은
구성원이 하나 이상인 SHACL 목록이어야 합니다.
sh:minListLength에 대한 추가 테스트 사례는 SHACL 테스트 스위트에서 확인할 수 있습니다: minListLength-001.ttl.
sh:maxListLength는 SHACL 목록인 값
노드가 가질 수 있는 최대 구성원 수를 지정합니다.
제약 조건 컴포넌트 IRI:
sh:MaxListLengthConstraintComponent
| 속성 | 요약 및 구문 규칙 |
|---|---|
sh:maxListLength |
SHACL 목록의 최대 구성원 수입니다.
셰이프에서 sh:maxListLength의
값은 데이터 유형이 xsd:integer인 리터럴입니다.
셰이프에서
sh:maxListLength의 값은
0 이상의 정수입니다.
셰이프는
sh:maxListLength에 대해 최대 하나의 값만 가질 수 있습니다.
|
이 절의 나머지 부분은 비규범적입니다.
다음 예제에서 ex:hobbies 속성의 모든 값은
구성원이 최대 2개인 SHACL 목록이어야 합니다.
sh:maxListLength에 대한 추가 테스트 사례는 SHACL 테스트 스위트에서 확인할 수 있습니다: maxListLength-001.ttl.
sh:uniqueMembers는 SHACL 목록인 값
노드가 고유한 구성원을 가져야 하는지 지정합니다.
제약 조건 컴포넌트 IRI:
sh:UniqueMembersConstraintComponent
| 속성 | 요약 및 구문 규칙 |
|---|---|
sh:uniqueMembers |
SHACL 목록의 구성원이 고유해야 하는지 지정하는 불리언 값입니다.
셰이프에서 sh:uniqueMembers의
값은 데이터 유형이 xsd:boolean인 리터럴입니다.
셰이프는
sh:uniqueMembers에 대해 최대 하나의 값만 가질 수 있습니다.
|
이 절의 나머지 부분은 비규범적입니다.
목록 v의 중복된 각 구성원 m은
v에 대한 검증 결과에서 별도의 sh:detail로
보고하는 것이 좋습니다.
목록 v가 유효한 SHACL 목록이 아니라면,
이를 최상위 검증 결과로 보고하고
구성원의 고유성 검증을 시도하지 않는 것이 좋습니다.
검증 결과에서 sh:detail을 생성하는 방법의 예제는 SHACL 테스트 스위트의
sh:uniqueMembers 테스트 사례에서 확인할 수 있습니다: uniqueMembers-001.ttl.
다음 예제에서 ex:preferences 속성의 모든 값은
각 SHACL 목록 내에서 구성원 값이 고유한 SHACL 목록이어야 합니다.
이 절의 제약 조건 컴포넌트는 다른 속성이나 속성 경로와 관련하여 값 노드 집합에 대한
조건을 지정합니다.
sh:lessThan과 sh:lessThanOrEquals는 속성 셰이프에서만 사용할 수
있습니다.
sh:equals는 모든 값 노드의 집합이
sh:equals로 지정한 SHACL 속성
경로를 통해 초점 노드에서 도달할 수 있는 노드의 집합과
같아야 한다는 조건을 지정합니다.
제약 조건 컴포넌트 IRI:
sh:EqualsConstraintComponent
| 속성 | 요약 및 구문 규칙 |
|---|---|
sh:equals |
비교할 속성 경로입니다.
셰이프에서
sh:equals의 값은 올바르게 형성된 SHACL 속성 경로입니다.
|
이 절의 나머지 부분은 비규범적입니다.
다음 예제는 셰이프에서 sh:equals를 사용하여
특정 초점 노드의 ex:firstName과
ex:givenName에 대한 값 집합이 같아야 한다는 조건을 지정하는 방법을 보여줍니다.
다음 예제는 SHACL 속성 경로를
sh:path와 sh:equals 모두의
값으로 사용할 수 있음을 보여줍니다.
이 예제에서 Bob의 배우자 이름이 문신의 문구와 다르거나 그 반대인 경우 경고가 보고됩니다. Bob에게 배우자와 문신이 모두 없거나, 둘 다 있고 이름과 문구가 정확히 동일한 노드 집합과 일치하면 경고가 생성되지 않습니다.
sh:disjoint는 값 노드의 집합이
sh:disjoint의 값인
SHACL 속성 경로를 통해 초점 노드에서
도달할 수 있는 노드의 집합과 서로소여야 한다는 조건을
지정합니다.
제약 조건 컴포넌트 IRI:
sh:DisjointConstraintComponent
| 속성 | 요약 및 구문 규칙 |
|---|---|
sh:disjoint |
값을 비교할 속성 경로입니다.
셰이프에서
sh:disjoint의 값은 올바르게 형성된 SHACL 속성 경로입니다.
|
이 절의 나머지 부분은 비규범적입니다.
다음 예제는 셰이프에서 sh:disjoint를 사용하여
특정 초점 노드의 ex:prefLabel과
ex:altLabel이 어떤 값도 공유해서는 안 된다는 조건을 지정하는 방법을 보여줍니다.
sh:subsetOf는 모든 값 노드에
또한 도달할 수 있어야 한다는 조건을 지정합니다.
즉, 초점 노드에서 sh:subsetOf로 지정한
SHACL 속성
경로를 통해서도 도달할 수 있어야 합니다.
제약 조건 컴포넌트 IRI:
sh:SubsetOfConstraintComponent
| 속성 | 요약 및 구문 규칙 |
|---|---|
sh:subsetOf |
비교할 속성 경로입니다.
셰이프에서
sh:subsetOf의 값은 올바르게 형성된 SHACL 속성 경로입니다.
|
이 절의 나머지 부분은 비규범적입니다.
다음 예제는 셰이프에서 sh:subsetOf를 사용하여
어떤 사람의 가장 좋아하는 자녀가 실제 자녀 중 하나여야 한다는 조건을 지정하는 방법을 보여줍니다.
sh:lessThan는 각 값 노드가
모든
노드보다 작아야 한다는 조건을 지정합니다. 이러한 노드는 초점 노드에서
sh:lessThan의 값인 SHACL 속성 경로를
통해 도달할 수 있습니다.
제약 조건 컴포넌트 IRI:
sh:LessThanConstraintComponent
| 속성 | 요약 및 구문 규칙 |
|---|---|
sh:lessThan |
값을 비교할 속성 경로입니다.
셰이프에서
sh:lessThan의 값은 올바르게 형성된 SHACL 속성 경로입니다.
노드 셰이프는
sh:lessThan에 대한 값을 가질 수 없습니다.
|
이 절의 나머지 부분은 비규범적입니다.
다음 예제는 셰이프에서 sh:lessThan을 사용하여
ex:startDate의 모든 값이 ex:endDate의 값보다 "이전"이어야 한다고 지정하는 방법을 보여줍니다.
sh:lessThanOrEquals는 각 값 노드가
모든 노드보다 작거나 같아야 한다는 조건을 지정합니다.
이러한 노드는 초점 노드에서
sh:lessThanOrEquals의 값인 SHACL 속성 경로를
통해 도달할 수 있습니다.
제약 조건 컴포넌트 IRI:
sh:LessThanOrEqualsConstraintComponent
| 속성 | 요약 및 구문 규칙 |
|---|---|
sh:lessThanOrEquals |
값을 비교할 속성 경로입니다.
셰이프에서
sh:lessThanOrEquals의 값은 올바르게 형성된 SHACL 속성 경로입니다.
노드
셰이프는 sh:lessThanOrEquals에 대한 값을 가질 수 없습니다.
|
$lessThanOrEquals를 sh:lessThanOrEquals의 값이라고 하고,
$path를
셰이프 그래프에서 $lessThanOrEquals가 나타내는
SHACL 속성 경로라고 하겠습니다.
$otherNodes를 $path를 통해 초점 노드에서 도달할 수 있는 노드의 집합이라고 하겠습니다.
값 노드와 $otherNodes의 구성원으로 이루어진 각 쌍에서
첫 번째 값이 두 번째 값보다 작거나 같지 않거나 (SPARQL의
<= 연산자 기준),
두 값을 비교할 수 없는 경우,
해당 값 노드를 sh:value로 갖는 검증 결과가 존재합니다.
이 절의 나머지 부분은 비규범적입니다.
다음 예제는 셰이프에서 sh:lessThanOrEquals를 사용하여
ex:startDate의 값이 ex:endDate의 값보다 늦지 않아야 한다고 지정하는 방법을 보여줍니다.
sh:lessThan과 달리 프로젝트는 시작한 날에 종료될 수도 있습니다.
이 절의 제약 조건 컴포넌트는 일반적인 논리 연산자인 논리곱, 논리합, 부정 및 배타적 논리합의 변형을 구현합니다.
sh:not은 각 값 노드가 주어진 셰이프를
준수해서는 안
된다는 조건을 지정합니다.
이는 부정 및 논리 "NOT" 연산자에 해당합니다.
제약 조건 컴포넌트 IRI:
sh:NotConstraintComponent
| 속성 | 요약 및 구문 규칙 |
|---|---|
sh:not |
부정할 셰이프입니다.
셰이프에서
sh:not의 값은 올바르게 형성된 셰이프여야 합니다.
|
이 절의 나머지 부분은 비규범적입니다.
다음 예제는 셰이프에서 sh:not을 사용하여
특정 초점 노드가 ex:property의 값을 가져서는 안 된다는 조건을 지정하는 방법을 보여줍니다.
sh:and는 각 값 노드가 제공된 모든
셰이프를 준수해야 한다는 조건을 지정합니다.
이는 논리곱 및 논리 "AND" 연산자에 해당합니다.
제약 조건 컴포넌트 IRI:
sh:AndConstraintComponent
| 속성 | 요약 및 구문 규칙 |
|---|---|
sh:and |
값 노드를 검증할 셰이프의 SHACL 목록입니다.
셰이프에서
sh:and의 각 값은 SHACL 목록입니다.
이러한 목록의 각 구성원은 올바르게
형성된 셰이프여야 합니다.
|
이 절의 나머지 부분은 비규범적입니다.
sh:and의 값은 셰이프의 SHACL 목록이지만,
해당 셰이프의 순서는 검증 결과에 영향을 미치지 않는다는 점에 유의하세요.
단축 평가 의미 체계를 사용하는 구현에서는 순서가
검증 효율성에 영향을 미칠 수 있습니다.
평가하기 쉽거나 실패할 가능성이 높은 제약 조건을
목록의 앞쪽에 배치하는 것이 좋습니다.
다음 예제는 셰이프에서 sh:and를 사용하여
특정 초점 노드가 ex:property의 값을 정확히 하나 가져야 한다는 조건을 지정하는 방법을 보여줍니다.
이는 최소 개수를 지정하는 별도의 이름 있는 셰이프(ex:SuperShape)와
최대 개수를 추가로 지정하는
속성 셰이프의 논리곱을 통해 구현됩니다.
여기에서 볼 수 있듯이 sh:and를 사용하여 셰이프 간의
특수화 메커니즘을 구현할 수 있습니다.
sh:or는 각 값 노드가 제공된 셰이프 중 하나 이상을
준수해야 한다는 조건을 지정합니다.
이는 논리합 및 논리 "OR" 연산자에 해당합니다.
제약 조건 컴포넌트 IRI: sh:OrConstraintComponent
| 속성 | 요약 및 구문 규칙 |
|---|---|
sh:or |
값 노드를 검증할 셰이프의 SHACL 목록입니다.
셰이프에서
sh:or의 각 값은 SHACL 목록입니다.
이러한 목록의 각 구성원은 올바르게
형성된 셰이프여야 합니다.
|
이 절의 나머지 부분은 비규범적입니다.
sh:or의 값은 셰이프의 SHACL 목록이지만,
해당 셰이프의 순서는 검증 결과에 영향을 미치지 않는다는 점에 유의하세요.
단축 평가 의미 체계를 사용하는 구현에서는 순서가
검증 효율성에 영향을 미칠 수 있습니다.
평가하기 쉽거나 성공할 가능성이 높은 제약 조건을
목록의 앞쪽에 배치하는 것이 좋습니다.
다음 예제는 셰이프에서 sh:or를 사용하여
특정 초점 노드가 ex:firstName의 값을 하나 이상
또는 ex:givenName의 값을 하나 이상 가져야 한다는 조건을 지정하는 방법을 보여줍니다.
다음 예제는 속성 셰이프에서 sh:or를
사용하여 주어진
속성 ex:address의 값이 데이터 유형
xsd:string인 리터럴
또는 ex:Address 클래스의 SHACL 인스턴스일 수 있음을 지정하는 방법을 보여줍니다.
SHACL의 모든 제약 조건은 실행 시 논리곱으로 결합된다는 점에 유의하세요. 다음 예제를 살펴보겠습니다:
올바른 해석은 (shapeA OR shapeB) AND (shapeC
OR shapeD)입니다.
대상 노드는 shapeA 또는 shapeB를 준수해야 하며, 동시에
shapeC 또는 shapeD도 준수해야 합니다.
sh:xone은 각 값 노드가 제공된 셰이프 중 정확히
하나를 준수해야 한다는 조건을 지정합니다.
제약 조건 컴포넌트 IRI:
sh:XoneConstraintComponent
| 속성 | 요약 및 구문 규칙 |
|---|---|
sh:xone |
값 노드를 검증할 셰이프의 SHACL 목록입니다.
셰이프에서
sh:xone의 각 값은 SHACL 목록입니다.
이러한 목록의 각
구성원은 올바르게
형성된 셰이프여야 합니다.
이러한
각 목록은 가급적 하나 이상의
구성원을 가져야 합니다.
|
이 절의 나머지 부분은 비규범적입니다.
sh:xone의 값은 셰이프의 SHACL 목록이지만,
해당 셰이프의 순서는 검증 결과에 영향을 미치지 않는다는 점에 유의하세요.
다음 예제는 셰이프에서 sh:xone을 사용하여
다음 조건을 지정하는 방법을 보여줍니다.
특정 초점 노드는 ex:fullName의 값을 갖거나,
ex:firstName과 ex:lastName의 값을 가져야 하지만, 둘 다 가져서는 안 됩니다.
이 절의 제약 조건 컴포넌트는 값 노드를 특정 셰이프에 대해 검증하여 복잡한 조건을 지정하는 데 사용할 수 있습니다.
sh:node는 각 값 노드가 주어진 노드 셰이프를 준수해야 한다는 조건을 지정합니다.
제약 조건 컴포넌트 IRI:
sh:NodeConstraintComponent
| 속성 | 요약 및 구문 규칙 |
|---|---|
sh:node |
모든 값 노드가 준수해야 하는 노드 셰이프입니다.
셰이프에서
sh:node의 값은 올바르게 형성된 노드
셰이프여야 합니다.
|
이 절의 나머지 부분은 비규범적입니다.
다음 예제는 속성 셰이프에서 sh:node를 사용하는 방법을 보여줍니다.
ex:address 속성의 모든 값은
셰이프
ex:AddressShape가 나타내는 제약 조건을 충족해야 합니다.
다음 예제는 노드 셰이프에서 sh:node를 사용하는 방법을 보여줍니다.
이 예제는 우편번호에 대한 일반적인 기본 셰이프와
특정 국가에 대한 두 가지 특수화된 셰이프를 정의합니다.
sh:datatype xsd:string 및 sh:minLength 3과 같은 기본 제약 조건은
모든 우편번호에 적용됩니다.
sh:node 속성은 더 구체적인 셰이프를 더 일반적인 셰이프에 연결하는 데 사용되며,
이는 rdfs:subClassOf가 하위 클래스를 상위 클래스에 연결하는 방식과 유사합니다.
SHACL에서 재귀적 셰이프를 처리하는 방법은 6.7.3 재귀적 셰이프 처리를 참조하세요.
sh:property는 각 값 노드가
주어진 속성 셰이프를 가져야 한다고 지정하는 데 사용할 수 있습니다.
제약 조건 컴포넌트 IRI:
sh:PropertyConstraintComponent
| 속성 | 요약 및 구문 규칙 |
|---|---|
sh:property |
모든 값 노드가 가져야 하는 속성 셰이프입니다.
셰이프에서
sh:property의 각 값은 올바르게 형성된 속성 셰이프여야 합니다.
|
이 절의 나머지 부분은 비규범적입니다.
sh:property와
sh:node 사이에는 중요한 차이가 있다는 점에 유의하세요.
값 노드가 제약 조건을 위반하면 해당 값 노드에 대한
sh:node의 검증 결과는 하나만 존재하며,
sh:sourceConstraintComponent의 값으로 sh:NodeConstraintComponent를 갖습니다.
반면 sh:property에 대해서는 여러 검증 결과가 존재할 수 있으며,
이러한 결과는
속성 셰이프에 있는 제약 조건의 개별 제약 조건 컴포넌트를
sh:sourceConstraintComponent의 값으로 갖습니다.
다른 모든 검증 결과와 마찬가지로, sh:property를 통해
속성 셰이프에 도달할 때마다
검증 엔진은 새로운 검증 결과 노드를 반드시 생성해야 합니다.
여기에는 동일한 초점 노드가 동일한
속성 셰이프에 대해 검증되지만,
셰이프 그래프에서 서로 다른 경로를 통해 도달하는 경우도 포함됩니다.
sh:someValue는 하나 이상의 값 노드가
주어진 셰이프를
준수해야 한다는 조건을 지정합니다.
제약 조건 컴포넌트 IRI:
sh:SomeValueConstraintComponent
| 속성 | 요약 및 구문 규칙 |
|---|---|
sh:someValue |
하나 이상의 값 노드가 준수해야 하는 셰이프입니다.
셰이프에서
sh:someValue의 값은 올바르게 형성된 셰이프여야 합니다.
|
이 절의 나머지 부분은 비규범적입니다.
구현은 값 노드 중 하나가 준수하는 것으로 확인되면 값 노드의 처리를 중단할 수 있습니다. 값 노드 집합에 있는 노드의 순서는 정의되지 않으므로, 실패를 일으키는 노드에 반드시 도달한다는 보장은 없습니다. 따라서 처리의 예측 가능성을 높이기 위해 모든 값 노드를 검사했지만 성공하지 못한 경우를 제외하고는 실패를 알리지 않고 무시합니다.
다음 예제에서 ex:DuckFarmerShape를 준수하는 모든 노드는
ex:tendsAnimal에 대해 하나 이상의 값을
가져야 하며, 해당 값은 ex:Duck의 SHACL 인스턴스여야
합니다.
sh:someValue는
sh:qualifiedValueShape와 sh:qualifiedMinCount 1을 조합한 구문 설탕으로 볼 수 있습니다.
또한 sh:someValue는 주로 속성 셰이프에서 사용할 때 의미가 있다는 점에 유의하세요.
노드
셰이프에서 sh:someValue는
sh:node 또는 sh:property를 사용하는 것과 동일합니다.
sh:qualifiedValueShape는 지정된 수의 값 노드가 주어진 셰이프를 준수해야 한다는 조건을 지정합니다.
각 sh:qualifiedValueShape는 동일한 주어에 sh:qualifiedMinCount의 값 하나,
sh:qualifiedMaxCount의 값 하나 또는 두 속성의 값 하나씩을
가질 수 있습니다.
제약 조건 컴포넌트 IRI:
sh:QualifiedMinCountConstraintComponent,
sh:QualifiedMaxCountConstraintComponent
| 속성 | 요약 및 구문 규칙 |
|---|---|
sh:qualifiedValueShape |
지정된 수의 값 노드가 준수해야 하는 셰이프입니다.
셰이프에서
sh:qualifiedValueShape의 값은 올바르게
형성된 셰이프여야 합니다.
노드
셰이프는 sh:qualifiedValueShape의 값을 가질 수 없습니다.
이는 sh:QualifiedMinCountConstraintComponent와
sh:QualifiedMaxCountConstraintComponent의 필수
매개변수입니다.
|
sh:qualifiedValueShapesDisjoint |
이는 sh:QualifiedMinCountConstraintComponent와
sh:QualifiedMaxCountConstraintComponent의 선택적
매개변수입니다.
true로 설정하면 개수를 계산할 때 값 노드는
어떤 형제 셰이프도 준수해서는 안 됩니다.
셰이프에서
sh:qualifiedValueShapesDisjoint의 값은 데이터 유형이
xsd:boolean인 리터럴입니다.
|
sh:qualifiedMinCount |
셰이프를 준수하는 값 노드의 최소 개수입니다.
셰이프에서
sh:qualifiedMinCount의 값은 데이터 유형이
xsd:integer인 리터럴입니다.
이는 sh:QualifiedMinCountConstraintComponent의 필수 매개변수입니다.
|
sh:qualifiedMaxCount |
셰이프를 준수할 수 있는 값 노드의 최대 개수입니다.
셰이프에서
sh:qualifiedMaxCount의 값은 데이터 유형이
xsd:integer인 리터럴입니다.
이는 sh:QualifiedMaxCountConstraintComponent의 필수 매개변수입니다.
|
Q를 셰이프 그래프 G에 있는 셰이프로서,
한정 기수 제약 조건을 선언하는 셰이프라고 하겠습니다.
(즉, sh:qualifiedValueShape와 다음 중 하나 이상의 값을 가지며,
sh:qualifiedMinCount 또는 sh:qualifiedMaxCount입니다.)
ps를 G에서 Q를 sh:property의 값으로 갖는 셰이프의 집합이라고 하겠습니다.
Q가 sh:qualifiedValueShapesDisjoint의 값으로
true를 가지면,
Q의 형제 셰이프 집합은
ps의 각 셰이프에 대해 SPARQL 속성
경로
sh:property/sh:qualifiedValueShape의 모든 값으로 이루어진 집합에서
Q 자체의 sh:qualifiedValueShape 값을
제외한 집합으로 정의됩니다.
그렇지 않으면 형제 셰이프 집합은 비어 있습니다.
$qualifiedValueShape를 sh:qualifiedValueShape의 값이라고
하겠습니다.
$qualifiedMinCount를 sh:qualifiedMinCount의 매개변수 값이라고
하겠습니다.
C를 다음 조건을 충족하는 값 노드 v의 수라고 하겠습니다.
v가 $qualifiedValueShape를 준수하고,
v가 현재 셰이프의 어떤 형제 셰이프도 준수하지 않는 경우입니다.
즉, 현재 셰이프는 v가 검증되는 셰이프이며,
sh:qualifiedValueShape의 값으로 $qualifiedValueShape를 갖는 셰이프입니다.
앞서 언급한 적합성 검사 중 하나라도 실패를 발생시키면,
실패를 반드시 발생시켜야 합니다.
그렇지 않고 C가 $qualifiedMinCount보다 작으면
검증 결과가 존재합니다.
sh:qualifiedMinCount의 제약 조건 컴포넌트는
sh:QualifiedMinCountConstraintComponent입니다.
$qualifiedMaxCount를 sh:qualifiedMaxCount의 매개변수 값이라고
하겠습니다.
C는 위의 sh:qualifiedMinCount에서 정의한 것과 같습니다.
앞서 언급한 적합성 검사 중 하나라도 실패를 발생시키면,
실패를 반드시 발생시켜야 합니다.
그렇지 않고 C가 $qualifiedMaxCount보다 크면
검증 결과가 존재합니다.
sh:qualifiedMaxCount의 제약 조건 컴포넌트는
sh:QualifiedMaxCountConstraintComponent입니다.
이 절의 나머지 부분은 비규범적입니다.
다음 예제 셰이프는
ex:parent 속성이 정확히 두 개의 값을 가지며,
그중 하나 이상이 여성이어야 한다는 조건을 지정하는 데 사용할 수 있습니다.
다음 예제는 sh:qualifiedValueShapesDisjoint를 사용하여
손에 ex:digit 값이 최대 5개 있어야 한다는 조건(sh:maxCount로 표현)을
지정하고,
그중 정확히 하나는 ex:Thumb의 인스턴스이고 정확히 4개는
ex:Finger의 인스턴스여야 하며,
엄지손가락과 다른 손가락은 서로소여야 한다는 조건을 보여줍니다.
즉, 한 손에서 다른 손가락을 엄지손가락으로 중복 계산할 수 없습니다.
sh:reifierShape는 속성 셰이프를 하나 이상의 노드 셰이프에 연결하는 데 사용할 수
있습니다.
모든 재구체화자는 이러한 노드 셰이프를 준수해야 합니다.
제약 조건 컴포넌트 IRI:
sh:ReifierShapeConstraintComponent
| 속성 | 요약 및 구문 규칙 |
|---|---|
sh:reifierShape |
이 트리플의 재구체화자가 준수해야 하는 노드 셰이프입니다.
sh:reifierShape의 값은 올바르게 형성된 노드
셰이프여야 합니다.
sh:reifierShape의 값이 지정되면 sh:path의 값은
IRI로 제한됩니다.
|
sh:reificationRequired |
이는 sh:ReifierShapeConstraintComponent의 선택적
매개변수입니다.
true로 설정하면 데이터 그래프의 초점
노드와 경로 조합에 대해 하나 이상의 재구체화 값이 있어야 합니다.
셰이프에서
sh:reificationRequired의 값은 데이터 유형이
xsd:boolean인 리터럴입니다.
|
$reifierShape를 sh:reifierShape의 값이라고 하고,
$reificationRequired를 sh:reificationRequired의 값이라고 하겠습니다
(값이 있는 경우).
또한 $path를 속성 셰이프의 sh:path 값이라고 하겠습니다.
각 값 노드 v에 대해, t를 트리플 용어 (초점 노드,
$path, v)라고 하고,
t의 재구체화자는 데이터 그래프에
트리플 r rdf:reifies t가 포함되는 노드 r이라고 하겠습니다.
t의 각 재구체화자 r에 대해, r을 초점 노드로 하여
노드 셰이프 $reifierShape에 대해 검증한 결과
실패가 발생하면
실패를 반드시 발생시켜야 합니다.
그렇지 않고 t의 각 재구체화자 r이 $reifierShape를 준수하지 않으면,
v를 sh:value로 갖는 검증 결과가 존재합니다.
$reificationRequired가 true이고 t에 재구체화자가 없으면,
v를 sh:value로 갖는 검증 결과가 존재합니다.
이 절의 나머지 부분은 비규범적입니다.
이 예제에서 셰이프 ex:PersonShape는
ex:Person의 모든 인스턴스가
ex:age의 값을 셰이프 ex:ProvenanceShape를 준수하는 재구체화자로
재구체화해야 한다고 지정합니다. 즉, ex:date와
ex:author를 지정해야 합니다.
이 절에서는 다른 범주에 속하지 않는 코어 제약 조건 컴포넌트를 열거합니다.
RDF 데이터 모델은 매우 높은 유연성을 제공합니다.
원칙적으로 모든 노드는 어떤 속성에 대해서든 값을 가질 수 있습니다.
그러나 경우에 따라 노드에 적용할 수 있는 속성을 제한하는 조건을 지정하는 것이
유용합니다.
SHACL 코어 언어에는 sh:closed라는 속성이 포함되어 있으며, 이를 사용하여
각 값 노드가 해당 셰이프에 대해 sh:property로 지정된
속성 셰이프를 통해
명시적으로 열거된 속성에 대해서만 값을 갖도록 하는 조건을
지정할 수 있습니다.
제약 조건 컴포넌트 IRI:
sh:ClosedConstraintComponent
| 속성 | 요약 및 구문 규칙 |
|---|---|
sh:closed |
셰이프를 닫으려면 true로 설정합니다.
셰이프에서
sh:closed의 값은 데이터 유형이
xsd:boolean인 리터럴
또는 IRI sh:ByTypes입니다.
|
sh:ignoredProperties |
sh:property를 통해 명시적으로 열거된 속성 외에도 허용되는 속성의
선택적 SHACL 목록입니다.
셰이프에서
sh:ignoredProperties의 값은 SHACL
목록이어야 합니다.
이러한 목록의 각 구성원은
IRI여야 합니다.
|
$closed를 sh:closed의 매개변수 값이라고
하겠습니다.
$ignoredProperties를 sh:ignoredProperties의 값이라고
하겠습니다.
$closed가 true 또는 sh:ByTypes이고 P가
아래에 정의된 속성 집합이라면,
트리플 중
값 노드를
자신의
주어로 가지며 P에 속하지 않는 술어를 가진 각 트리플에 대해
검증 결과가 존재합니다.
$ignoredProperties에 값이 있다면 이 SHACL 목록의
구성원으로 열거된 속성도
값 노드에 허용됩니다.
검증 결과는 반드시
트리플의 술어를
sh:resultPath로,
트리플의 목적어를
sh:value로 가져야 합니다.
$closed가 true이면 P는 현재 셰이프에서
SPARQL 경로 sh:property/sh:path를 통해 도달할 수 있는
IRI 속성의 집합입니다.
$closed가 sh:ByTypes이면 P는
다음 알고리즘을 통해 값 노드에서 도달할 수 있는 IRI
속성의 집합에 rdf:type을 더한 것입니다:
function collectProperties(S)
SPARQL 경로를 통해 S에서 도달할 수 있는 모든 IRI 속성을 추가합니다
sh:property/sh:path
S가 셰이프 그래프에서 rdfs:Class의 SHACL 인스턴스인 경우 {
셰이프 그래프에서 (S rdfs:subClassOf ?o)와 일치하는 각 트리플에 대해
collectProperties(?o)
셰이프 그래프에서 (?s sh:targetClass S)와 일치하는 각 트리플에 대해
collectProperties(?s)
}
S가 셰이프 그래프에서 sh:NodeShape의 SHACL 인스턴스인 경우
셰이프 그래프에서 (S sh:node ?o)와 일치하는 각 트리플에 대해
collectProperties(?o)
데이터 그래프에서 값 노드의 각 rdf:type T에 대해
collectProperties(T)
S를 두 번 방문하지 않도록 하여
무한 루프를 방지해야 한다는 점에 유의하세요.
이 절의 나머지 부분은 비규범적입니다.
다음 예제는 셰이프에서 sh:closed를 사용하여
다음 조건을 지정하는 방법을 보여줍니다.
특정 초점 노드는 ex:firstName과
ex:lastName에 대해서만 값을 가질 수 있습니다.
"무시되는" 속성인 rdf:type도 허용됩니다.
sh:closed sh:ByTypes의 사용 사례에는 현재 값 노드 유형의
상위 클래스(rdfs:subClassOf를 통해)에 선언된 속성뿐 아니라,
sh:targetClass를 통해 해당 유형에 연결된 다른 셰이프와
sh:node를 통해 한 노드 셰이프에서 다른 노드 셰이프로 도달할 수 있는 셰이프도 포함됩니다.
sh:ByTypes의 예제는 테스트 사례 라이브러리에서 확인할 수 있습니다:
closed-003.ttl,
closed-004.ttl.
sh:hasValue는 하나 이상의 값 노드가
주어진 RDF 용어와 같아야 한다는 조건을 지정합니다.
제약 조건 컴포넌트 IRI:
sh:HasValueConstraintComponent
| 속성 | 요약 및 구문 규칙 |
|---|---|
sh:hasValue |
반드시 존재해야 하는 특정 값입니다. |
이 절의 나머지 부분은 비규범적입니다.
sh:in은 각 값 노드가 제공된 SHACL 목록의 구성원이어야 한다는 조건을 지정합니다.
제약 조건 컴포넌트 IRI: sh:InConstraintComponent
| 속성 | 요약 및 구문 규칙 |
|---|---|
sh:in |
허용되는 값을 구성원으로 갖는 SHACL
목록입니다.
셰이프에서
sh:in의 각 값은 SHACL 목록입니다.
셰이프는
sh:in에 대해 최대 하나의 값만 가질 수 있습니다.
이러한
각 목록은 가급적 하나 이상의 구성원을 가져야 합니다.
|
이 절의 나머지 부분은 비규범적입니다.
리터럴은 정확히 일치해야 합니다. 예를 들어 "04"^^xsd:byte는
"4"^^xsd:integer와 일치하지 않습니다.
sh:rootClass가 지정하는 조건은 각 값 노드가
주어진 클래스 또는 그 클래스의 (전이적) 하위 클래스여야 한다는 것입니다.
제약 조건 컴포넌트 IRI:
sh:RootClassConstraintComponent
| 속성 | 요약 및 구문 규칙 |
|---|---|
sh:rootClass |
모든 값 노드가 속해야 하는 클래스 계층의 루트입니다.
셰이프에서 sh:rootClass의 값은
IRI
또는 모든 구성원이
IRI인 올바르게
형성된 SHACL
목록인 빈 노드입니다.
|
이 절의 나머지 부분은 비규범적입니다.
sh:rootClass 제약 조건은 일반적으로
클래스를 값으로 가질 수 있는 속성 셰이프(예: sh:class rdfs:Class를 통해)에
사용되어 값 노드에 허용되는 하위 클래스 계층을 제한합니다.
주어진 클래스는 허용되는 클래스 계층의 상한 역할을 합니다.
sh:uniqueValuesFor는 값 노드의 하나 이상의 지정된
속성 값이 현재 셰이프의 모든 대상 노드 내에서
고유해야 한다는 조건을 지정합니다.
제약 조건 컴포넌트 IRI:
sh:UniqueValuesForConstraintComponent
| 속성 | 요약 및 구문 규칙 |
|---|---|
sh:uniqueValuesFor |
속성의 IRI 또는 각 구성원이 속성의 IRI인 SHACL 목록입니다. |
$uniqueValuesFor를 셰이프 S에서 sh:uniqueValuesFor의 값이라고 하겠습니다.
$properties를 다음과 같은 집합이라고 하겠습니다:
$uniqueValuesFor가 IRI이면
$properties = { $uniqueValuesFor }입니다.
$uniqueValuesFor가 SHACL 목록이면
$properties는 해당 목록의 구성원으로 이루어진 집합입니다.
$targetNodes를 S의 대상 노드라고 하겠습니다.
이 노드들은 초점 노드가 직접
제공되었더라도 S의 대상으로부터 결정됩니다.
예를 들어 S가 sh:node의 값인 경우에도 마찬가지입니다.
V에 대해,
$targetNodes에 있는 다른 노드가
$properties의 모든 속성에 대해 V와 정확히 동일한 값을
가진다면
검증 결과가 존재합니다.
V가 $properties의 어떤 속성에 대해서도 값을 갖지 않으면
검증 결과가 생성되지 않습니다.
이 절의 나머지 부분은 비규범적입니다.
리터럴은 정확히 일치해야 합니다. 예를 들어 "04"^^xsd:byte는
"4"^^xsd:integer와 일치하지 않습니다.
또한 sh:uniqueValuesFor는 이러한 값의 존재 자체를 요구하지 않으므로
흔히
sh:minCount 1 제약 조건과 함께 사용됩니다.
이 예제에서는 ex:Record2와
ex:Record3에 대해 두 건의 제약 조건 위반이 보고됩니다.
이는 두 노드가 ex:id에 대해 정확히 동일한 값을 가지며 동일한 대상인 셰이프에 속하기 때문입니다.
그러나 ex:id "One"에 대해서는 위반이 보고되지 않습니다. 이는
ex:UnrelatedNode가
ex:Record의 인스턴스가 아니므로 ex:SingleIdExampleShape의 대상이 아니기 때문입니다.
대상 노드의
계산은 셰이프의 정의에만 의존한다는 점에 유의하세요. 예를 들어,
sh:uniqueValuesFor 제약 조건도 포함하는 셰이프의
sh:targetClass 선언에 의존합니다.
위 예제에서는 셰이프의 어떤 초점 노드도 지정된 두 속성의 동일한 조합을 갖지 않으므로 위반이 보고되지 않습니다.
이 절은 비규범적입니다.
앞선 절에서는 검증 조건을 나타내는 속성을 소개했지만, 이 절에서는 SHACL 처리기가 무시하는 속성을 다룹니다. 이러한 소위 검증에 사용되지 않는 속성의 사용은 전적으로 선택 사항이며 공식적인 해석 계약의 적용을 받지 않습니다. 이러한 속성은 폼 생성, 코드 생성 또는 RDF 파일의 예측 가능한 출력 등에 사용할 수 있습니다.
셰이프는 sh:name에 대해 하나 이상의 값을 가질 수 있으며,
이를 통해 셰이프가 정의하는 특성에 사람이 읽을 수 있는 이름을 부여할 수 있습니다.
즉, 속성 셰이프의 경우 속성 경로에,
노드 셰이프의 경우 대상으로 하는 리소스의 종류에 이름을 부여합니다:
sh:name은 속성 경로의 이름을 지정합니다.sh:name은 셰이프의 대상이 공유하는 특성,
즉 셰이프의 제약 조건이 설명하는 리소스의 종류에 이름을 부여합니다.
sh:name과 다른 레이블 속성(rdfs:label,
skos:prefLabel 등)은 서로 보완적인 관계입니다.
다른 레이블 속성은 셰이프 리소스 자체의 이름을 지정합니다.
sh:name은 셰이프 리소스가 아니라 앞서 설명한
셰이프의 정의적 특성에 이름을 부여하기 위한 것입니다.
sh:name의 값은
리터럴이며, 그 데이터
유형은
xsd:string, rdf:dirLangString 또는 rdf:langString입니다.
마찬가지로 셰이프는 sh:description에 대한 값을 가질 수 있으며,
이를 통해 동일한 정의적 특성을 사람이 읽을 수 있도록 설명할 수 있습니다:
sh:description은 셰이프 리소스 자체가 아니라
셰이프의 정의적 특성을 설명하기 위한 것입니다.
sh:description의 값은
리터럴이며, 그 데이터
유형은
xsd:string, rdf:dirLangString, rdf:langString 또는
rdf:HTML입니다.
sh:name과 sh:description은 모두
여러 값을 가질 수
있지만, 언어 태그마다 하나의 값만 갖는 것이 좋습니다.
셰이프는 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 검증 또는 적합성에 영향을 미치지 않습니다.
이 예제에서 첫 번째 sh:intent는 이미
sh:maxCount를 사용하여 표현되어 있습니다.
이 경우 텍스트 설명은 기술 지식이 상대적으로 적은 사람이 작성했거나,
SHACL을 이해하지 못하는 에이전트를 위해 의도적으로 중복해 두었을 수 있습니다.
두 번째 sh:intent는 SHACL에서 공식적으로 표현하기 어렵습니다.
(예를 들어 SPARQL 함수 NOW를 사용하지 않는 경우입니다.)
세 번째 sh:intent는 SHACL 엔진이 검증할 수 없습니다.
셰이프는 sh:agentInstruction에 대한 값을 가질 수 있으며, 이러한 값은
리터럴인 것이 좋습니다.
그 데이터 유형은 xsd:string,
rdf:langString 또는 rdf:dirLangString입니다.
이 속성은 자연어를 이해하는 소프트웨어 에이전트에게 전송할 수 있는 텍스트 지침을 나타내는 데 사용할 수 있습니다.
이 속성은 다음과 같은 유사한 텍스트 설명과 함께 사용할 수 있습니다:
rdfs:comment,
sh:description, rdfs:label, sh:name, sh:intent
및 sh:message.
이를 통해 소프트웨어 에이전트에게 셰이프의 의미 해석에 관한 지침을 제공할 수 있습니다.
셰이프는 sh:codeIdentifier에 대해 하나의 값을 가질 수 있으며,
이를 통해 API, 쿼리 언어 및 유사한 프로그래밍 방식의 접근에서
셰이프를 표현하는 데 사용할 이름을 제안할 수 있습니다.
sh:codeIdentifier의 값은 리터럴이며, 그 데이터
유형은 xsd:string입니다.
이 문자열은 정규 표현식 ^[a-zA-Z_][a-zA-Z0-9_]*$와 일치해야 합니다.
일반적인 사용 사례는 도형에서 GraphQL 쿼리
스키마를 생성하고, 속성 도형을 GraphQL 필드에 매핑하는 것입니다.
기본적으로 이러한 스키마 생성기는
sh:path의 로컬 이름을 사용할 수 있지만, sh:codeIdentifier가 있으면 이를 사용해야 합니다.
복합 경로의 경우 명시적인 sh:codeIdentifier를
사용하는 것이 강력히 권장됩니다.
Java, JavaScript 또는 Python 등의 API 생성기에도 유사한 요구 사항이 적용됩니다.
셰이프는 sh:codeType에 대해 하나의 값을 가질 수 있으며,
이를 통해 API, 쿼리 언어 및
유사한 프로그래밍 방식의 접근에서 셰이프를 표현할 때
값
노드의 유형을 제안할 수 있습니다.
sh:codeType의 값은 데이터
유형의 IRI입니다.
예를 들어 [rdf12-concepts]에 나열된 XML Schema 데이터 유형 중 하나입니다.
sh:datatype,
sh:nodeKind 및 sh:class와 같은 셰이프의 제약 조건은
데이터
그래프에 있는 용어를 설명하지만,
sh:codeType은 이러한 용어를 다루는 코드가 받아야 하는 유형을 설명합니다.
sh:codeType의 값은 이러한 제약 조건과 일치할 필요가 없습니다.
예를 들어 속성 셰이프는 sh:nodeKind sh:IRI와
sh:codeType xsd:string을 모두 선언할 수 있습니다.
일반적으로 제약 조건에서 유형을 도출하는 도구는 sh:codeType의 값이 있으면
이를 사용하는 것이 좋습니다.
sh:codeType은 각 값 노드에 개별적으로 적용되며,
단일 값이 예상되는지 값의 컬렉션이 예상되는지는 나타내지 않습니다.
제약 조건으로 코드가 기대하는 유형을 표현할 수 없는 경우 sh:codeType이 필요합니다.
예를 들어 파일 위치를 담는 속성은 IRI와
리터럴을 모두 허용할 수 있습니다.
이는 sh:nodeKind sh:IRIOrLiteral로 선언하지만, 코드는 두 경우 모두 문자열을 기대합니다.
sh:datatype xsd:string을 선언하면 모든 IRI 값에 대해 검증 결과가 발생하지만,
sh:codeType xsd:string은 검증에 영향을 주지 않으면서 코드가
문자열을 받도록 지정합니다.
sh:codeType은 특정 프로그래밍 언어와 무관합니다.
주어진 데이터 유형을 어떤 네이티브 유형으로 나타낼지와 값 노드를 해당 유형으로 변환하는 방법은
구현에 맡깁니다.
셰이프에는 값을 갖는
sh:unit 속성이 있을 수 있으며, 이 속성은
측정 단위, 통화 또는 값 노드에 관한 유사한 정보를 나타냅니다.
sh:unit의 값은 리터럴(데이터
유형이 xsd:string
또는 rdf:langString 또는 rdf:dirLangString인 경우)이나 IRI일 수 있습니다.
SHACL 1.2는 sh:unit의 구체적인 값을 규정하지 않는데, 작성 당시
(2026),
이들을 일관되게 나타낼 공식 W3C 표준이
없었고, W3C 외부에는 여러 표준이 존재했기 때문입니다.
SHACL 1.2에서는 다음 사항을 권장합니다:
sh:unit의 값은
UCUM에서 정의한 코드와 정확히 일치하는 xsd:string
리터럴일 수 있습니다.
예를 들어 sh:unit "cm"입니다.
sh:unit의 값은
ISO 4217에서 정의한 코드와
정확히 일치하는 xsd:string 리터럴일 수 있습니다.
예를 들어 sh:unit "AUD"입니다.
sh:unit의 값은 QUDT 또는
유사한 단위 어휘에서 정의한 IRI일 수 있습니다.
예를 들어 sh:unit qudt:CentiM입니다.
"in" 외에 "Zoll"@de를 사용할 수 있습니다.
이러한 구문 규칙은 의도적으로 유연하게 유지되지만, 특정 애플리케이션에서는
더 구체적인 규칙을 적용할 수 있습니다.
예를 들어 sh:unit 속성에 sh:class qudt:Unit 제약 조건을
선언할 수 있습니다.
SHACL 기반 사용자 인터페이스 도구는 sh:unit의 값을 사용하여 값을 표시할 수 있습니다.
사용자 로케일에 따라 이러한 도구는 단위를 자동으로 변환하거나,
실제 값이 저장되는 단위와 다른 단위로 데이터를 입력하도록 허용할 수도 있습니다.
이 예제에서 사용자 인터페이스는 높이를 다음과 같이 표시할 수 있습니다:
180.5 cm (71 in)
또는 미국 방문자에게는 다음과 같이 표시할 수 있습니다:
71 in (180.5 cm)
SHACL 코어는 sh:unit의 구체적인 의미 체계를 지정하지 않지만,
일부 SHACL 기반 확장에서는 검증을 포함한 다른 목적으로 단위를 사용할 수 있습니다.
예를 들어 속성이 sh:unit "K"를 선언한 모든 리터럴에
sh:minInclusive 0 제약 조건을 적용하는 셰이프를 정의할 수 있습니다.
다음은 위 예제를 변형한 것으로, 노드 셰이프를 사용하여 단위뿐 아니라 최솟값과 같은 제약 조건도 포함하는 "유로화 가격"의 재사용 가능한 정의를 캡슐화합니다.
속성 셰이프는 값을
sh:order 속성에 하나 지정하여
양식 생성 등의 목적으로 속성 셰이프의 상대적 순서를 나타낼 수 있습니다.
sh:order의 값은 리터럴이며, 데이터
유형은 xsd:decimal 또는
xsd:integer입니다.
sh:order는 유효성 검사 목적으로 사용되지 않습니다.
속성 셰이프에 존재하는 경우, sh:order는 사용자 인터페이스에서
속성 셰이프를 오름차순으로 정렬하는 데 사용하는 것이 권장됩니다. 예를 들어 순서 값이 작은 속성을
순서 값이 큰 속성보다
위쪽이나 앞쪽(왼쪽에서 오른쪽으로 쓰는 언어에서는 왼쪽)에 배치할 수 있습니다.
sh:order는 목록에 있는 요소의 상대적 순서를 지정하는
일반적인 메커니즘을 제공합니다.
sh:order는 SHACL 검증에 영향을 미치지 않지만,
어떤 유형의 주어에도 사용할 수 있으며 다른 명세에서는 더 강한 의미 체계를 가질 수 있습니다.
속성 셰이프는 sh:group 속성을 사용하여
sh:PropertyGroup 클래스의 SHACL 인스턴스에 연결할 수 있으며,
이를 통해 해당 셰이프가 관련 속성 셰이프 그룹에 속함을 나타낼 수 있습니다.
각 그룹에는 폼 생성을 위한 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을 사용하는 것이
좋습니다.
국제화를 지원하고 양방향 텍스트를 올바르게 처리할 수 있도록
언어 태그와 필요한 경우 방향성 마커를 사용하는 것이 권장됩니다.
이 절에서는 SHACL의 모든 규범적 구문 규칙을 열거합니다.
이 절은 이 명세의 다른 부분에서 자동으로 생성되며, 규칙의 맥락이 불분명한 경우
해당 설명으로 돌아갈 수 있도록 하이퍼링크를 제공합니다.
다음 셰이프
그래프에서 이러한 규칙을 위반하는 노드는 형식이 올바르지 않습니다.
sh:shapesGraph 및 sh:shape에 대한 규칙과 같은 일부 규칙은 대신
다음 데이터
그래프의 트리플에 적용됩니다.
권고합니다를 사용하여 명시된 규칙은 권고 사항입니다:
이러한 규칙만 위반하는 노드는 형식이 올바르지 않은 것은 아니지만, 처리기는 경고를 보고할 수 있습니다.
sh:incomplete 및 sh:incompleteURIStart에 대한 규칙과 같은 일부 규칙은 대신
다음 데이터
그래프의 트리플에 적용됩니다.
| 구문 규칙 ID | 구문 규칙 내용 |
|---|---|
| SHACL-list | 다음 SHACL 목록은 RDF 그래프 G에서 IRI 또는
공백 노드로서,
rdf:nil이거나 (단, rdf:nil에 값이
rdf:first와 rdf:rest 어느 쪽에도 없어야 합니다), 또는 정확히 하나의 값을
G의 rdf:first 속성에 대해 가지며 정확히 하나의 값을
G의 rdf:rest 속성에 대해 갖고 이 값 역시 다음 그래프의 SHACL 목록이며,
G,
해당 목록 자체가 다음 그래프에서 속성 경로 rdf:rest+의 값이 되지 않는 것입니다:
G.
|
| 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가 SHACL 인스턴스이고, 그 클래스가 sh:NodeShape 또는
sh:PropertyShape이며,
RDF 그래프 G에서 그러하고 s가 또한 SHACL 인스턴스이고,
그 클래스가
G의 rdfs:Class이며 s가 IRI가
아니라면,
s는 형식이 올바르지 않은 G의 셰이프입니다.
|
| targetSubjectsOf-nodeKind | 다음 값, 즉
셰이프의 sh:targetSubjectsOf 값은 IRI입니다.
|
| targetObjectsOf-nodeKind | 다음 값, 즉
셰이프의 sh:targetObjectsOf 값은 IRI입니다.
|
| targetWhere-node | 셰이프의 sh:targetWhere의 각 값은 형식이 올바른 셰이프입니다.
|
| shape-nodeKind | 각 값, 즉
sh:shape의 값은 IRI입니다.
|
| severity-maxCount | 셰이프는 최대 하나의 값을 sh:severity 속성에 대해 가질 수 있으며, 이는 셰이프 그래프에 적용됩니다. |
| severity-nodeKind | sh:severity의 각 값은 IRI입니다.
|
| severity-reifier-maxCount |
T를 다음 트리플의 집합으로 둡니다. 이들은 제약 조건을 나타내며, 해당 제약
조건은 셰이프에
있습니다.
다음 셰이프 그래프는 최대 하나의 값을 다음 속성에 대해 지정할 수 있습니다:
sh:severity
이는 다음 구체화자에 적용되며, 이들이 구체화하는 트리플은 T에 있습니다.
|
| message-datatype | sh:message의 값은 리터럴이며, 해당 데이터 타입은
xsd:string, rdf:dirLangString, rdf:langString 또는
rdf:HTML입니다.
|
| message-reifier-maxCount |
T를 다음 트리플의 집합으로 둡니다. 이들은 제약 조건을 나타내며, 해당 제약
조건은 셰이프에
있습니다.
다음 셰이프 그래프는 최대 하나의 값을 다음 속성에 대해 지정할 수 있습니다:
sh:message
이는 다음 구체화자에 적용되며, 이들이 구체화하는 트리플은 T에 있습니다.
|
| deactivated-maxCount | 셰이프는 sh:deactivated 속성에 대해 최대 하나의 값을 가질 수 있습니다. |
| deactivated-datatype | sh:deactivated의 값은 노드 표현식이며,
true 또는 false 중 하나를 (유일한) 출력 노드로 가져야 합니다.
|
| deactivated-reifier-maxCount | 다음 트리플은 셰이프를 주어로,
다음 매개변수 (sh:minCount 등)를 술어로 가지며, 최대 하나의
구체화자를 가질 수 있고, 이 구체화자는 값을 다음 속성에 대해 갖습니다:
sh:deactivated.
|
| NodeShape-path-maxCount | SHACL 인스턴스로서 sh:NodeShape에 속하는 것은 가질 수 없습니다:
어떠한 값도
sh:path 속성에 대해서는 허용되지 않습니다.
|
| PropertyShape | 다음 속성 셰이프는 셰이프이며, 다음 셰이프 그래프에 있고
다음 주어에 해당합니다. 해당 트리플은 sh:path를 술어로 갖습니다. |
| path-maxCount | 셰이프는 최대 하나의 값을 sh:path에 대해 갖습니다. |
| path-node | 다음 값, 즉
속성 셰이프의 sh:path 값은 형식이 올바른
SHACL 속성 경로입니다.
|
| PropertyShape-path-minCount | SHACL 인스턴스로서 sh:PropertyShape에 속하는 것은 하나의
값을
sh:path 속성에 대해 갖습니다.
|
| path-values | 다음 속성 셰이프는 최대 하나의 값을 다음 속성에 대해 갖습니다:
sh:values. 그리고 이 값은 형식이 올바른 노드 표현식입니다.
|
| path-defaultValue | 다음 속성 셰이프는 최대 하나의 값을 다음 속성에 대해 갖습니다:
sh:defaultValue. 그리고 이 값은 형식이 올바른 노드 표현식입니다.
|
| path-values-iri | 다음 속성 셰이프는 다음에 대해서만 값을 가질 수 있습니다:
sh:values 및/또는 sh:defaultValue. 단, 해당 값, 즉
sh:path의 값이 술어 경로인 경우에만 가능합니다.
|
| path-metarule | RDF 그래프의 노드는 형식이 올바른 SHACL 속성
경로 p입니다. 단, 다음 하위 절의 구문 규칙 중 정확히 하나를
충족해야 합니다. |
| path-non-recursive | 노드 p는 다음 경우 형식이 올바른 SHACL 속성 경로가 아닙니다: p가 공백
노드이고 p의 경로 매핑 중 하나라도 직접 또는 전이적으로 p를 참조하는 경우입니다. |
| path-predicate | 다음 술어 경로는 IRI입니다. |
| 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 |
다음 0회 이상 경로는 공백 노드이며, 다음 주어에 해당합니다: 정확히 하나의 트리플이 G에서 이를 주어로 갖습니다.
이 트리플은 sh:zeroOrMorePath를 술어로 가지며, 그 목적어 v는 형식이 올바른 SHACL
속성 경로입니다.
|
| path-one-or-more |
다음 1회 이상 경로는 공백 노드이며, 다음 주어에 해당합니다: 정확히 하나의 트리플이 G에서 이를 주어로 갖습니다.
이 트리플은 sh:oneOrMorePath를 술어로 가지며, 그 목적어 v는 형식이 올바른 SHACL
속성 경로입니다.
|
| path-zero-or-one |
다음 0회 또는 1회 경로는 공백 노드이며, 다음 주어에 해당합니다: 정확히 하나의 트리플이 G에서 이를 주어로 갖습니다.
이 트리플은 sh:zeroOrOnePath를 술어로 가지며, 그 목적어 v는 형식이 올바른 SHACL
속성 경로입니다.
|
| IRIExpression-syntax | RDF 그래프의 노드는 형식이 올바른 IRI 표현식입니다. 단, 해당 노드가 IRI여야 합니다. |
| LiteralExpression-syntax | RDF 그래프의 노드는 형식이 올바른 리터럴 표현식입니다. 단, 해당 노드가 리터럴이어야 합니다. |
| shapesGraph-nodeKind | 모든 값, 즉
sh:shapesGraph의 값은 IRI입니다
|
| dataGraph-nodeKind | sh:dataGraph의 각 값은 IRI이다 |
| incomplete-datatype | 다음 값, 즉
sh:incomplete의 값은 리터럴이며 데이터 타입은 xsd:boolean입니다.
|
| incompleteURIStart-datatype | 다음 값, 즉
sh:incompleteURIStart의 값은 리터럴이며 데이터 타입은 xsd:boolean입니다.
|
| incompleteURIStart-subject | 다음 주어, 즉 트리플의 주어로서 술어가
sh:incompleteURIStart인 경우는 IRI입니다.
|
| class-nodeKind | 셰이프의 sh:class 값은 IRI
또는 공백 노드이며, 후자는 형식이 올바른 SHACL 목록으로서 모든 구성원이 IRI입니다.
|
| datatype-maxCount | 셰이프는 sh:datatype에 대해 최대 하나의 값을 갖습니다. |
| datatype-nodeKind | 셰이프의 sh:datatype 값은 IRI
또는 공백 노드이며, 후자는 형식이 올바른 SHACL 목록으로서 모든 구성원이 IRI입니다.
|
| nodeKind-maxCount | 셰이프는 sh:nodeKind에 대해 최대 하나의 값을 갖습니다. |
| nodeKind-nodeKind | 셰이프의 sh:nodeKind 값은 IRI 또는
공백 노드이며, 후자는 형식이 올바른 SHACL 목록으로서 모든 구성원이 IRI입니다.
|
| 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 함수. |
| 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보다 크거나 같은 정수이다. |
| minListLength-maxCount | 셰이프는 sh:minListLength에 대해 최대 하나의 값을 가진다. |
| maxListLength-datatype | 셰이프에서 sh:maxListLength의 값은 데이터타입이 xsd:integer인 리터럴이다.
|
| maxListLength-minInclusive | 셰이프에서 sh:maxListLength의 값은 0보다 크거나 같은 정수이다. |
| maxListLength-maxCount | 셰이프는 sh:maxListLength에 대해 최대 하나의 값을 가진다. |
| uniqueMembers-datatype | 셰이프에서 sh:uniqueMembers의 값은 데이터타입이 xsd:boolean인 리터럴이다.
|
| uniqueMembers-maxCount | 셰이프는 sh:uniqueMembers에 대해 최대 하나의 값을 가진다. |
| 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 | 각 구성원, 즉 해당 목록의 구성원은 형식이 올바른 셰이프여야 합니다. |
| xone-minListLength | 이러한 각 목록에 대해 권고합니다: 최소 하나의 구성원을 갖도록 합니다. |
| 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 | 이러한 각 목록에 대해 권고합니다: 최소 하나의 구성원을 갖도록 합니다. |
| rootClass-nodeKind |
셰이프의 sh:rootClass 값은 IRI
또는 공백 노드이며, 후자는 형식이 올바른 SHACL 목록으로서 모든 구성원이 IRI입니다.
|
| uniqueValuesFor-node | 다음 IRI로서 속성의 IRI이거나, 다음 SHACL 목록으로서 각 구성원이 IRI로서 속성의 IRI인 목록입니다. |
이 절은 비규범적입니다.
SHACL 1.2 개요의 SHACL-SHACL 부록 [shacl12-overview]에서는 다른 SHACL 셰이프 그래프를 검증하는 데 사용할 수 있는 SHACL 그래프를 설명하며, 이를 통해 다양한 SHACL 명세를 준수하려는 RDF 데이터와 관련된 많은 구문적 제약 조건을 적용할 수 있습니다.
SHACL-SHACL 셰이프 그래프는 명세별로 제공되며, 개요의 부록에 명시된 대로 http://www.w3.org/ns/shacl-shacl에서 통합된 '합집합' 형태로도 제공됩니다.
이 절에서는 SHACL 코어의 모든 규범적 검증기를 열거합니다. 이 절은 이 명세의 다른 부분에서 자동으로 생성되며, 검증기의 문맥이 명확하지 않은 경우 해당 본문으로 돌아갈 수 있도록 하이퍼링크가 제공됩니다.
| 제약 조건 구성 요소별 검증기 |
|---|
sh:ClassConstraintComponent:
$class를 sh:class의 매개변수 값으로 둡니다.
classes를 다음 조건을 만족하는 IRI의
집합으로
둡니다.
$class가 IRI인 경우,
집합에는 정확히 해당 IRI만 포함되며,
$class가 빈 노드인 SHACL 목록인 경우,
집합에는
정확히 해당 목록의 구성원만 포함됩니다.값 노드 중 리터럴이거나, 리터럴이 아니면서 SHACL 인스턴스가 아닌 경우, 즉 데이터 그래프에서 classes의 어떤 클래스에도 속하지 않는 경우,
각 노드에 대해 검증 결과가 존재하며, 해당 값 노드가
sh:value로 지정됩니다.
|
sh:DatatypeConstraintComponent:
$datatype을 매개변수 값으로 둡니다. 이는
sh:datatype에 대한 값입니다.
datatypes를 다음 조건을 만족하는 IRI의
집합으로
둡니다.
$datatype이 IRI인 경우,
집합에는 정확히 해당 IRI만 포함되며,
$datatype이 빈 노드인 SHACL 목록인 경우,
집합에는
정확히 해당 목록의 구성원만 포함됩니다.값 노드 중 리터럴이 아니거나, 리터럴이지만 데이터 유형이 datatypes의 어느 항목과도 일치하지 않는 경우,
각 노드에 대해 검증 결과가 존재하며, 해당 값 노드가
sh:value로 지정됩니다.리터럴의 데이터 유형은 SPARQL 1.2의 datatype 함수에 따라 결정됩니다. 리터럴은 해당 리터럴의 데이터 유형이 동일한 IRI를 가지며, SPARQL 1.2에서 지원하는 데이터 유형의 경우 유형이 잘못된 리터럴이 아니라면 해당 데이터 유형과 일치합니다. |
sh:NodeKindConstraintComponent:
$nodeKind를 매개변수 값으로 둡니다. 이는
sh:nodeKind에 대한 값입니다.
nodeKinds를 다음 조건을 만족하는 IRI의
집합으로
둡니다.
$nodeKind가 IRI인 경우,
집합에는 정확히 해당 IRI만 포함되며,
$nodeKind가 빈 노드인 SHACL 목록인 경우,
집합에는
정확히 해당 목록의 구성원만 포함됩니다.값 노드 중 nodeKinds의 어느 항목과도 일치하지 않는 각 노드에 대해
검증 결과가 존재하며, 해당 값 노드가
sh:value로 지정됩니다.
모든 IRI는 sh:IRI,
sh:BlankNodeOrIRI 및 sh:IRIOrLiteral과만 일치합니다.
모든 빈 노드는 sh:BlankNode,
sh:BlankNodeOrIRI 및 sh:BlankNodeOrLiteral과만 일치합니다.
모든 리터럴은 sh:Literal,
sh:BlankNodeOrLiteral 및 sh:IRIOrLiteral과만 일치합니다.
모든 트리플 항은 sh:TripleTerm과만 일치합니다.
|
sh:MinCountConstraintComponent:
$minCount를 매개변수 값으로 둡니다. 이는
sh:minCount에 대한 값입니다.
값
노드의 수가 $minCount보다 작으면
검증 결과가 존재합니다.
|
sh:MaxCountConstraintComponent:
$maxCount를 매개변수 값으로 둡니다. 이는
sh:maxCount에 대한 값입니다.
값
노드의 수가 $maxCount보다 크면
검증 결과가 존재합니다.
|
sh:MinExclusiveConstraintComponent:
$minExclusive를 매개변수 값으로 둡니다. 이는
sh:minExclusive에 대한 값입니다.
각 값 노드 v에 대해,
SPARQL 표현식 $minExclusive < v가 true를 반환하지 않으면
검증 결과가 존재하며, v가
sh:value로 지정됩니다.
|
sh:MinInclusiveConstraintComponent:
$minInclusive를 매개변수 값으로 둡니다. 이는
sh:minInclusive에 대한 값입니다.
각 값 노드 v에 대해,
SPARQL 표현식 $minInclusive <= v가 true를 반환하지 않으면
검증 결과가 존재하며, v가
sh:value로 지정됩니다.
|
sh:MaxExclusiveConstraintComponent:
$maxExclusive를 매개변수 값으로 둡니다. 이는
sh:maxExclusive에 대한 값입니다.
각 값 노드 v에 대해,
SPARQL 표현식 $maxExclusive > v가 true를 반환하지 않으면
검증 결과가 존재하며, v가
sh:value로 지정됩니다.
|
sh:MaxInclusiveConstraintComponent:
$maxInclusive를 매개변수 값으로 둡니다. 이는
sh:maxInclusive에 대한 값입니다.
각 값 노드 v에 대해,
SPARQL 표현식 $maxInclusive >= v가 true를 반환하지 않으면
검증 결과가 존재하며, v가
sh:value로 지정됩니다.
|
sh:MinLengthConstraintComponent:
$minLength를 매개변수 값으로 둡니다. 이는
sh:minLength에 대한 값입니다.
각 값 노드 v에 대해,
문자열 표현의 길이(SPARQL STRLEN 함수에 따라 정의됨)를
v의 문자열 표현(SPARQL str 함수에 따라 정의됨)에 적용했을 때
$minLength보다 작거나, v가 빈 노드이면
검증 결과가 존재하며, v가
sh:value로 지정됩니다.
|
sh:MaxLengthConstraintComponent:
$maxLength를 매개변수 값으로 둡니다. 이는
sh:maxLength에 대한 값입니다.
각 값 노드 v에 대해,
문자열 표현의 길이(SPARQL STRLEN 함수에 따라 정의됨)를
v의 문자열 표현(SPARQL str 함수에 따라 정의됨)에 적용했을 때
$maxLength보다 크거나, v가 빈 노드이면
검증 결과가 존재하며, v가
sh:value로 지정됩니다.
|
sh:PatternConstraintComponent:
$pattern을 매개변수 값으로 둡니다. 이는
sh:pattern에 대한 값입니다.
$flags를 매개변수 값으로 둡니다. 이는 sh:flags에 대한 값입니다.
각 값 노드에 대해,
해당 노드가 빈 노드이거나
문자열 표현(SPARQL str 함수에 따라 정의됨)이
정규 표현식 $pattern(SPARQL REGEX 함수에 따라 정의됨)과 일치하지 않으면
검증 결과가 존재하며, 해당 값 노드가
sh:value로 지정됩니다.
$flags에 값이 있으면 일치 여부 판정은 반드시
SPARQL REGEX 함수의 인수 3개 변형 정의를 따라야 하며, $flags를
세 번째 인수로 사용해야 합니다.
|
sh:SingleLineConstraintComponent:
$singleLine을 매개변수 값으로 둡니다. 이는
sh:singleLine에 대한 값입니다.
$singleLine이 true이면, 각 값 노드 중
어휘 형식에 다음 문자 중 하나라도 포함된 리터럴에 대해
U+000A(줄 바꿈), U+000B(세로 탭), U+000C(폼 피드) 또는 U+000D
(캐리지 리턴),
검증 결과가 존재합니다.
|
sh:LanguageInConstraintComponent:
$languageIn을 sh:languageIn의 값으로 둡니다.
각 값 노드에 대해,
해당 노드가 리터럴이 아니거나, 언어 태그가
$languageIn의 구성원인 기본 언어 범위 중 어느 것과도
SPARQL langMatches 함수에서 정의한 필터링 방식에 따라 일치하지 않으면
검증 결과가 존재하며, 해당 값 노드가
sh:value로 지정됩니다.
|
sh:UniqueLangConstraintComponent:
$uniqueLang을 매개변수 값으로 둡니다. 이는
sh:uniqueLang에 대한 값입니다.
$uniqueLang이 true이면,
최소 두 개의 값 노드에서 사용되는 비어 있지 않은 각 언어 태그에 대해
검증 결과가 존재합니다.
데이터 유형이 rdf:dirLangString인 값 노드의 경우,
기본 방향도 고유성
조건에 포함됩니다.
예를 들어 "1"@ar--rtl과 "1"@ar--ltr은 서로 다르며,
"1"@ar--rtl과 "1"@ar도 서로 다릅니다.
|
sh:MemberShapeConstraintComponent:
$memberShape를 매개변수 값으로 둡니다. 이는
sh:memberShape에 대한 값입니다.
각 값 노드 v는 반드시
SHACL 목록이어야 합니다. v가 SHACL 목록이 아니면
검증 결과가 존재하며, v가
sh:value로 지정됩니다.
SHACL 목록 v의 구성원 m 중 하나라도
$memberShape를 준수하지 않으면,
검증 결과가 존재하며, v가
sh:value로 지정됩니다.
|
sh:MinListLengthConstraintComponent:
$minListLength를 매개변수 값으로 둡니다. 이는
sh:minListLength에 대한 값입니다.
각 값 노드 v는 반드시
SHACL 목록이어야 합니다. v가 SHACL 목록이 아니면
검증 결과가 존재하며, v가
sh:value로 지정됩니다.
목록 v의 구성원 수가 $minListLength보다 작으면
검증 결과가 존재하며, v가
sh:value로 지정됩니다.
|
sh:MaxListLengthConstraintComponent:
$maxListLength를 매개변수 값으로 둡니다. 이는
sh:maxListLength에 대한 값입니다.
각 값 노드 v는 반드시
SHACL 목록이어야 합니다. v가 SHACL 목록이 아니면
검증 결과가 존재하며, v가
sh:value로 지정됩니다.
목록 v의 구성원 수가 $maxListLength보다 크면
검증 결과가 존재하며, v가
sh:value로 지정됩니다.
|
sh:UniqueMembersConstraintComponent:
$uniqueMembers를 매개변수 값으로 둡니다. 이는
sh:uniqueMembers에 대한 값입니다.
각 값 노드 v는 반드시
SHACL 목록이어야 합니다. v가 SHACL 목록이 아니면
검증 결과가 존재하며, v가
sh:value로 지정됩니다.
$uniqueMembers가 true이고 목록 v에 중복된
구성원이 있으면
검증 결과가 존재하며, v가
sh:value로 지정됩니다.
|
sh:EqualsConstraintComponent:
$equals를 sh:equals의 값으로, $path를
SHACL 속성 경로로 둡니다. 이 경로는
도형 그래프에서 $equals로 표현됩니다.
$otherNodes를 노드의 집합으로 둡니다. 이 노드들은 초점 노드에서
$path를 통해 도달할 수 있습니다.
값
노드 중
$otherNodes에 존재하지 않는 각 노드에 대해
검증 결과가 존재하며, 해당 값 노드가
sh:value로 지정됩니다.
$otherNodes의 각 노드
중
값
노드에 속하지 않는 노드에 대해
검증 결과가 존재하며, 해당 노드가 sh:value로 지정됩니다.
|
sh:DisjointConstraintComponent:
$disjoint를 sh:disjoint의 매개변수 값으로, $path를
SHACL 속성 경로로 둡니다. 이 경로는
도형 그래프에서 $disjoint로 표현됩니다.
$otherNodes를 노드의 집합으로 둡니다. 이 노드들은 초점 노드에서
$path를 통해 도달할 수 있습니다.
$otherNodes에도 포함된 각 값 노드에 대해
검증 결과가 존재하며, 해당 값 노드가
sh:value로 지정됩니다.
|
sh:SubsetOfConstraintComponent:
$subsetOf를 sh:subsetOf의 값으로, $path를
SHACL 속성 경로로 둡니다. 이 경로는
도형 그래프에서 $subsetOf로 표현됩니다.
$otherNodes를 노드의 집합으로 둡니다. 이 노드들은 초점 노드에서
$path를 통해 도달할 수 있습니다.
$otherNodes에 존재하지 않는 각 값 노드에 대해
검증 결과가 존재하며, 해당 값 노드가
sh:value로 지정됩니다.
|
sh:LessThanConstraintComponent:
$lessThan을 sh:lessThan의 값으로, $path를
SHACL 속성 경로로 둡니다. 이 경로는
도형 그래프에서 $lessThan으로 표현됩니다.
$otherNodes를 노드의 집합으로 둡니다. 이 노드들은 초점 노드에서
$path를 통해 도달할 수 있습니다.
각 값 노드와 $otherNodes의 구성원으로 이루어진 쌍에 대해,
첫 번째 값이
두 번째 값보다 작지 않거나(SPARQL의
< 연산자 기준)
두 값을 비교할 수 없는 경우,
검증 결과가 존재하며, 해당 값 노드가
sh:value로 지정됩니다.
|
sh:LessThanOrEqualsConstraintComponent:
$lessThanOrEquals를 sh:lessThanOrEquals의 값으로,
$path를
SHACL 속성 경로로 둡니다. 이 경로는
$lessThanOrEquals로 표현되며, 도형 그래프에서 정의됩니다.
$otherNodes를 노드의 집합으로 둡니다. 이 노드들은 초점 노드에서
$path를 통해 도달할 수 있습니다.
각 값 노드와 $otherNodes의 구성원으로 이루어진 쌍에 대해,
첫 번째 값이
두 번째 값보다
작거나 같지 않거나(SPARQL의 <= 연산자 기준)
두 값을 비교할 수 없는 경우,
검증 결과가 존재하며, 해당 값 노드가
sh:value로 지정됩니다.
|
sh:NotConstraintComponent:
$not을 sh:not의 값으로 둡니다.
각 값 노드 v에 대해:
v를 도형 $not에 대해 적합성 검사한 결과
실패가
발생하면 반드시
실패를
생성해야 합니다.
그렇지 않고 v가 도형 $not을 준수하면
검증 결과가 존재하며, v가
sh:value로 지정됩니다.
|
sh:AndConstraintComponent:
$and를 sh:and의 값으로 둡니다.
각 값 노드 v에 대해:
v를 $and의 구성원에 대해 검사하여
적합성 검사에서 실패가 발생한 경우, 반드시
구성원
중 하나에서 발생한 실패를 생성해야 합니다.
그렇지 않고 v가 각 구성원을
준수하지
않으면
$and에 대해
검증 결과가 존재하며, v가
sh:value로 지정됩니다.
|
sh:OrConstraintComponent:
$or를 sh:or의 값으로 둡니다.
각 값 노드 v에 대해:
v를 $or의 구성원에 대해 검사하여
적합성 검사에서 실패가 발생한 경우, 반드시
구성원
중 하나에서 발생한 실패를 생성해야 합니다.
그렇지 않고 v가 준수하는 구성원이
$or에 하나도 없으면
검증 결과가 존재하며, v가
sh:value로 지정됩니다.
|
sh:XoneConstraintComponent:
$xone을 sh:xone의 값으로 둡니다.
각 값 노드 v에 대해
N을 도형의 수로 둡니다. 이 도형들은 구성원이며
$xone에 속하고,
v가 해당 도형을 준수합니다.
v를 구성원에 대해 적합성 검사한 결과
구성원
중 하나에서 실패가 발생하면
실패를
반드시 생성해야 합니다.
그렇지 않고 N이 정확히 1이 아니면
검증 결과가 존재하며, v가
sh:value로 지정됩니다.
|
sh:NodeConstraintComponent:
$node를 sh:node의 값으로 둡니다.
각 값 노드 v에 대해:
v를 $node에 대해 적합성 검사한 결과
실패가
발생하면 반드시
실패를
생성해야 합니다.
그렇지 않고 v가 $node를 준수하지 않으면
검증 결과가 존재하며, v가
sh:value로 지정됩니다.
|
sh:PropertyConstraintComponent:
$property를 sh:property의 값으로 둡니다.
각 값 노드 v에 대해:
v를 초점 노드로 하여 속성 도형 $property에 대해
검증한 결과 실패가 발생하면
실패를
반드시 생성해야 합니다.
그렇지 않으면 검증 결과는 v를 초점 노드로 하여 속성 도형 $property에 대해
검증한 결과입니다.
|
sh:SomeValueConstraintComponent:
$someValue를 sh:someValue의 값으로 둡니다.
어떤 값 노드에 대해서든
$someValue에 대한 적합성 검사 결과
실패가
발생하면, 적어도 하나의 값 노드가
$someValue를 준수하지 않는 한 실패를 반드시 생성해야 합니다.
그렇지 않고 어떤 값 노드도 $someValue를 준수하지 않으면
검증 결과가 존재합니다.
|
sh:QualifiedMinCountConstraintComponent:
$qualifiedValueShape를 sh:qualifiedValueShape의 값으로 둡니다.
$qualifiedMinCount를 매개변수 값으로 둡니다. 이는
sh:qualifiedMinCount에 대한 값입니다.
C를 다음 조건을 만족하는 값 노드 v의 수로 둡니다.
v가 $qualifiedValueShape를 준수하고,
v가 현재 도형의 어떤 형제 도형도
준수하지
않는 경우입니다.
즉, v가 검증되는 도형이며
sh:qualifiedValueShape의 값으로 $qualifiedValueShape를 갖는 도형입니다.
앞서 언급한 적합성 검사 중 하나라도 실패하면
실패를
반드시 생성해야 합니다.
그렇지 않고 C가 $qualifiedMinCount보다 작으면
검증 결과가 존재합니다.
sh:qualifiedMinCount의 제약 조건 구성 요소는
sh:QualifiedMinCountConstraintComponent입니다.
|
sh:QualifiedMaxCountConstraintComponent:
$qualifiedMaxCount를 매개변수 값으로 둡니다. 이는
sh:qualifiedMaxCount에 대한 값입니다.
C는 위의 sh:qualifiedMinCount에서 정의한 값으로 둡니다.
앞서 언급한 적합성 검사 중 하나라도 실패하면
실패를
반드시 생성해야 합니다.
그렇지 않고 C가 $qualifiedMaxCount보다 크면
검증 결과가 존재합니다.
sh:qualifiedMaxCount의 제약 조건 구성 요소는
sh:QualifiedMaxCountConstraintComponent입니다.
|
sh:ReifierShapeConstraintComponent:
$reifierShape를 sh:reifierShape의 값으로 두고,
$reificationRequired를 sh:reificationRequired의 값으로 둡니다.
(값이 있는 경우),
또한 $path를 값으로 둡니다. 이는 속성 도형의 sh:path에 대한
값입니다.
각 값 노드 v에 대해, t를 트리플 항(초점 노드,
$path, v)로 두고,
t의 재구체화자를 노드
r로 둡니다. 이 노드는 데이터 그래프에
트리플 r rdf:reifies t이 포함된 노드입니다.
t의 각 재구체화자 r에 대해, r을
초점
노드로 하여 노드 도형
$reifierShape에 대해 검증한 결과 실패가 발생하면
실패를
반드시 생성해야 합니다.
그렇지 않고 $reifierShape를 준수하지 않는
t의 각 재구체화자 r에 대해,
검증 결과가 존재하며, v가
sh:value로 지정됩니다.
$reificationRequired가 true이고 t에 재구체화자가 없으면
검증 결과가 존재하며, v가
sh:value로 지정됩니다.
|
sh:ClosedConstraintComponent:
$closed를 매개변수 값으로 둡니다. 이는
sh:closed에 대한 값입니다.
$ignoredProperties를 sh:ignoredProperties의 값으로 둡니다.
$closed가 true 또는 sh:ByTypes이고 P가
아래에 정의된 속성 집합이면,
트리플 중 값 노드를
주어로 갖고 P에 속하지 않는 술어를 갖는 각 트리플에 대해 검증 결과가 존재합니다.
$ignoredProperties에 값이 있으면 이 SHACL 목록의 구성원으로 열거된 속성도
값
노드에 대해 허용됩니다.
검증 결과는 반드시
트리플의 술어를
sh:resultPath로,
트리플의 목적어를 sh:value로 가져야 합니다.
$closed가 true이면, P는 IRI 속성의
집합입니다.
현재 도형에서 SPARQL 경로 sh:property/sh:path를 통해 도달할 수 있는 속성입니다.
$closed가 sh:ByTypes이면, P는 IRI 속성의
집합입니다.
값 노드에서 다음 알고리즘을 통해 도달할 수 있는 속성에 rdf:type을 추가한 집합입니다.
S를 두 번 방문하지 않도록 하여
무한 루프를 방지해야 합니다.
|
sh:HasValueConstraintComponent:
$hasValue를 매개변수 값으로 둡니다. 이는
sh:hasValue에 대한 값입니다.
RDF 항 $hasValue가 값 노드에 포함되지 않으면
검증 결과가 존재합니다.
|
sh:InConstraintComponent:
$in을 sh:in의 값으로 둡니다.
각 값 노드 중
$in의 구성원이 아닌 노드에 대해
검증 결과가 존재하며, 해당 값 노드가
sh:value로 지정됩니다.
|
sh:RootClassConstraintComponent:
$rootClass를 매개변수 값으로 둡니다. 이는
sh:rootClass에 대한 값입니다.
classes를 다음 조건을 만족하는 IRI의
집합으로
둡니다.
$rootClass가 IRI인 경우
집합에는 정확히 해당 IRI만 포함되며,
$rootClass가 빈 노드인 SHACL 목록인 경우,
집합에는
정확히 해당 목록의 구성원만 포함됩니다.각 값 노드 중 IRI가 아니거나, IRI이지만 classes의 어떤 클래스와도 동일하지 않고 SHACL 하위 클래스도 아닌 경우,
데이터 그래프에서
검증 결과가 존재하며, 해당 값 노드가
sh:value로 지정됩니다.
|
sh:UniqueValuesForConstraintComponent:
$uniqueValuesFor를 도형 S에서 sh:uniqueValuesFor의 값으로
둡니다.
$properties를 다음과 같은 집합으로 둡니다.
$uniqueValuesFor가 IRI이면
$properties = { $uniqueValuesFor }입니다.
$uniqueValuesFor가 SHACL 목록이면
$properties는 해당 목록의 구성원으로 이루어진 집합입니다.
$targetNodes를 S의 대상 노드로 둡니다.
이 노드들은 초점 노드가 직접
제공된 경우에도 S의 대상으로부터 결정됩니다.
예를 들어 S가 sh:node의 값인 경우가 이에 해당합니다.
각 값 노드 V에 대해, $targetNodes에 다른 노드가 존재하고,
그 노드가 $properties의 모든 속성에 대해 V와 정확히 동일한 값을
가지면
검증 결과가 존재합니다.
V가 $properties의 어떤 속성에 대해서도 값을 갖지 않으면
$properties에 대해 결과가 생성되지 않습니다.
|
이 절은 비규범적입니다.
대부분의 RDF 기반 기술과 마찬가지로 SHACL 처리기는 다양한 출처에서
결합된 그래프를 처리할 수 있습니다. 일부 애플리케이션은 개방형 "연결 데이터" 아키텍처를 사용하여
조직의 신뢰 네트워크 외부에 있는 출처에서 RDF 트리플을 동적으로 조합할 수 있습니다.
RDF에서는 누구나 모든 리소스에 관한 문장을 추가할 수 있으므로, 트리플이
셰이프 정의나 데이터 그래프의 노드에 원래 의도된 의미 체계를 변경하여 오해를 일으키는 결과를 초래할 수 있습니다.
이러한 상황은 신뢰할 수 있고 검증된 RDF 출처만 사용하고,
owl:imports 및 sh:shapesGraph를 통해 그래프가 동적으로 추가될 가능성을
제거함으로써 방지할 수 있습니다.
이 절은 비규범적입니다.
최초의 SHACL 코어 명세는 RDF 데이터 셰이프 워킹 그룹에서 작성했습니다. 해당 명세의 감사의 글 절을 참조하세요.
이 절은 비규범적입니다.
sh:targetNode, sh:deactivated 및
sh:defaultValue를 일반화하고, 노드 표현식을 지원하기 위해 sh:values를 도입했습니다.
sh:singleLine을 추가했습니다. 쟁점 177을 참조하세요.sh:someValue를 추가했습니다. 쟁점 178을 참조하세요.sh:ShapeClass를 추가했습니다.
쟁점 212를 참조하세요.
sh:closed에 새로운 값 sh:ByTypes를
추가했습니다. 쟁점 172를 참조하세요.sh:class와 sh:datatype의 값도 목록일 수 있으며,
이는 선택 사항의 합집합을 나타냅니다. 쟁점 160을 참조하세요.sh:nodeKind의 값도 목록일 수 있으며,
이는 선택 사항의 합집합을 나타냅니다. 쟁점 407을 참조하세요.
sh:reifierShape를 추가했습니다. 쟁점 300을 참조하세요.sh:conformanceDisallows 속성을
추가했습니다. 쟁점 453을 참조하세요.rdf:dirLangString 지원을
추가했습니다. 쟁점 737을 참조하세요.sh:rootClass를 추가했습니다. 쟁점 792를 참조하세요.sh:subsetOf를 추가했습니다.
쟁점 786을 참조하세요.
sh:DataGraph와 sh:ShapesGraph를 추가했습니다. 쟁점 169를 참조하세요.sh:uniqueValuesFor를
추가했습니다. 쟁점 661을 참조하세요.owl:versionIRI에 대한 지원을
추가하고, 올바르게 형성된 셰이프 그래프의 정의를 확장하여
[owl2-syntax]의 가져오기 폐쇄 제약 조건을 포함했습니다.
쟁점 830을 참조하세요.
sh:Trace와 sh:Debug를 추가했습니다. 3.1.4 셰이프 또는 제약 조건의 심각도 선언을 참조하세요.
sh:severity, sh:message 및 sh:deactivated를 선언할 수 있습니다.sh:usedDataGraph, sh:usedShapesGraph 및 sh:usedConfiguration과 클래스 sh:ProcessorConfiguration를 추가했습니다.
sh:conformsToShapesGraph를
추가했습니다.sh:nodeKind에 노드 종류
sh:TripleTerm을 추가했습니다.
sh:memberShape를 추가했습니다.sh:name과 sh:description의 의미를 변경했습니다. 이제
셰이프 자체가 아니라 셰이프의 정의적 특성, 즉 속성 셰이프의 속성 경로
또는 노드 셰이프의 대상 리소스 종류에 이름을 부여하고 이를 설명합니다.Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
sh:dataGraph 속성을 추가했다Referenced in:
Referenced in: