SHACL 1.2 SPARQL 확장

W3C 작업 초안

이 문서에 대한 자세한 정보
이 버전:
https://www.w3.org/TR/2026/WD-shacl12-sparql-20260709/
최신 공개 버전:
https://www.w3.org/TR/shacl12-sparql/
최신 편집자 초안:
https://w3c.github.io/data-shapes/shacl12-sparql/
이력:
https://www.w3.org/standards/history/shacl12-sparql/
커밋 이력
테스트 스위트:
https://w3c.github.io/data-shapes/data-shapes-test-suite/
최신 권고안:
https://www.w3.org/TR/2017/REC-shacl-20170720/#part2
편집자:
(TopQuadrant, Inc.)
(JPMorgan Chase & Co.)
(Swansea University)
이전 편집자:
Dimitris Kontokostas
피드백:
GitHub w3c/data-shapes (풀 리퀘스트, 새 이슈, 열린 이슈)
public-shacl@w3.org에 제목 줄 [shacl12-sparql] 사용 (아카이브)

개요

이 문서는 SHACL Shapes Constraint Language의 SPARQL 관련 확장을 정의합니다. SHACL의 Core 부분이 shapes의 기본 구문과 SHACL에서 지원되는 가장 일반적인 constraint components를 정의하는 반면, SPARQL 관련 확장은 SPARQL을 통해 Core의 표현력을 확장하는 기능을 다룹니다. 특히 이 문서는 constraints와 constraint components를 SPARQL을 사용하여 정의하는 방법과 SPARQL 기반 node expressions를 정의합니다.

이 문서의 상태

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

이 문서는 Data Shapes Working Group에서 Recommendation 트랙을 사용하여 Working Draft로 발행했습니다.

Working Draft로 발행되었다고 해서 W3C와 그 회원들이 이를 승인한다는 의미는 아닙니다.

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

이 문서는 W3C Patent Policy에 따라 운영되는 그룹에서 작성했습니다. W3C는 해당 그룹의 산출물과 관련하여 이루어진 모든 특허 공개의 공개 목록을 유지합니다. 해당 페이지에는 특허 공개를 위한 지침도 포함되어 있습니다. 개인이 해당 개인이 Essential Claim(s)를 포함한다고 믿는 특허에 대해 실제로 알고 있는 경우, Essential Claim(s) 해당 정보를 W3C Patent Policy의 6절에 따라 공개해야 합니다.

이 문서는 2025년 8월 18일 W3C Process Document의 적용을 받습니다.

SHACL 명세

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

명세는 다음과 같습니다.

작업 초안:

SHACL 1.2 Core
SHACL의 Core를 정의합니다
SHACL 1.2 SPARQL 확장
SHACL의 SPARQL 관련 확장을 정의합니다
SHACL 1.2 Node Expressions
SHACL에서 focus nodes를 결정하는 데 사용되는 graph expressions를 정의합니다
SHACL 1.2 Rules
SHACL의 rule 기반 추론 방법을 정의합니다
SHACL 1.2 UI
User Interface 생성을 위한 SHACL의 사용을 정의합니다
SHACL 1.2 Profiling
SHACL 데이터를 포함한 데이터 profiling을 위한 SHACL의 사용을 정의합니다

Working Group Note 초안:

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

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

1. 소개

이 문서는 SHACL(Shapes Constraint Language)의 SPARQL 관련 기능을 명시합니다.

1.1 용어

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

이 문서에서 정의하는 SHACL SPARQL Extensions는 때때로 SHACL-SPARQL이라고 합니다.

RDF 1.2 Concepts and Abstract Syntax의 일부에 링크된 용어는 그곳에서 정의된 대로 SHACL-SPARQL에서 사용됩니다. SPARQL 1.2 Query Language의 일부에 링크된 용어는 그곳에서 정의된 대로 SHACL-SPARQL에서 사용됩니다. SHACL 1.2 Core의 일부에 링크된 용어는 그곳에서 정의된 대로 SHACL-SPARQL에서 사용됩니다. 특정 용어가 이 문서에서 나타나는 모든 경우에 대해 정의를 제공하려면 한 번의 링크로 충분합니다.

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

기본 RDF 용어
이 문서는 RDF graph, RDF triple, IRI, literal, blank node, RDF graph의 node, datatype, RDF term, 그리고 RDF triples의 subject, predicate, 그리고 object 라는 용어를 RDF 1.2 Concepts and Abstract Syntax [rdf12-concepts]에 정의된 대로 사용합니다.
Binding, Solution
binding은 (variable, RDF term)의 쌍이며, [sparql12-query]에서의 용어 사용과 일치합니다. solution은 각 variable이 고유해야 하는 bindings의 집합입니다. 비공식적으로, solution은 흔히 SPARQL query의 결과 테이블 본문에서 한 행으로 이해됩니다.

1.2 문서 규약

SHACL의 구문은 RDF입니다. 이 문서의 예제는 Turtle [rdf12-turtle]을 사용합니다. RDF/XML과 같은 다른 RDF 직렬화도 실제로 사용될 수 있습니다. 독자는 triples와 같은 기본 RDF 개념 [rdf12-concepts] 및 SPARQL [sparql12-query]에 익숙해야 합니다.

이 문서에서는 다음 namespace prefix bindings가 사용됩니다.

Prefix Namespace
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가 사용됩니다.

{
  "@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 vocabulary 자체를 정의하는 graph의 URI는 위 namespace와 동일합니다. 즉, #를 포함합니다. 예를 들어 owl:imports를 통한 SHACL vocabulary 참조는 #를 포함해야 합니다.

문서 전체에서 Turtle의 RDF graphs를 포함하는 색상 구분 상자가 나타납니다. 이러한 Turtle 문서 조각은 위에 제시된 prefix bindings를 사용합니다.

SHACL Definitions는 파란색 상자에 나타납니다.

SPARQL 또는 TEXTUAL DEFINITIONS
# This box contains SPARQL or textual definitions.

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

$ marker를 사용하는 SPARQL variables는 SPARQL query 실행 전에 pre-bound되거나, $PATH의 경우 substituted되는 외부 bindings를 나타냅니다 (3.3 SPARQL 기반 Constraint Components를 사용한 검증에서 설명함).

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

1.3 적합성

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

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

이 문서는 SHACL Core를 확장하는 SHACL-SPARQL 언어를 정의합니다. 이 명세는 다음에 대한 적합성 기준을 설명합니다.

또한 SHACL Core의 적합성 절에서 well-formedness에 관한 논의도 참조하세요.

2. SPARQL 기반 Constraints

SHACL-SPARQL은 SPARQL SELECT query에 기반한 제한을 표현하는 데 사용할 수 있는 constraint component를 지원합니다.

Constraint Component IRI: sh:SPARQLConstraintComponent

매개변수:
속성 요약
sh:sparql 평가할 SPARQL query를 선언하는 SPARQL 기반 constraint.

SPARQL 기반 constraints의 구문 규칙검증 과정은 이 절의 나머지 부분에서 정의됩니다.

2.1 SPARQL 기반 Constraint의 예

이 절은 비규범입니다.

다음 예제는 SPARQL 기반 constraint의 구문을 보여 줍니다.

SPARQL query는 constraint를 위반하는 value variable의 모든 bindings에 대해 result set solutions를 반환합니다. 해당 result set의 각 solution마다 하나의 validation result가 있으며, 이는 뒤에서 설명하는 mapping rules를 적용합니다. 이 예제에서 각 validation resultthis variable에 대한 bindingsh:focusNode로, ex:germanLabelsh:resultPath로, 그리고 위반하는 값을 sh:value로 갖게 됩니다.

다음 예제는 위와 유사한 시나리오를 보여 주지만, property shape를 사용합니다.

2.2 SPARQL 기반 Constraints의 구문

Shapes는 sh:sparql property에 대한 values를 가질 수 있으며, 이러한 values는 IRIs 또는 blank nodes입니다. 이러한 values를 SPARQL 기반 constraints라고 합니다.

SPARQL 기반 constraintssh:select property에 대해 정확히 하나의 value를 갖습니다. sh:select의 value는 datatype xsd:stringliteral입니다. class sh:SPARQLConstraint는 SHACL vocabulary에서 정의되며, 이러한 constraints의 type으로 사용할 수 있습니다 (하지만 type이 필수는 아닙니다). prefix 처리 규칙을 사용하여, sh:select의 value는 유효한 SPARQL 1.2 SELECT query입니다. sh:select의 value에서 파생된 SPARQL query는 SELECT clause에서 variable thisprojects합니다.

다음 두 properties는 shapes에서의 사용과 유사합니다.

SPARQL 기반 constraintssh:message property에 대한 values를 가질 수 있으며, 이들은 datatype xsd:string, rdf:dirLangString, rdf:langString, 또는 rdf:HTML을 가진 literals입니다. 같은 language tag를 가진 sh:message value가 둘 이상 있거나, datatype xsd:string의 value가 여러 개 있어서는 안 됩니다. SPARQL 기반 constraintssh:deactivated property에 대해 최대 하나의 value를 가질 수 있습니다 그리고 이 value는 true 또는 false입니다. SPARQL 기반 constraintssh:severity property에 대해 최대 하나의 value를 가질 수 있으며, 이 value는 IRI입니다.

property shapes의 맥락에서 사용되는 SELECT queries는 shape가 사용하는 path의 placeholder로 PATH라는 특수 variable을 사용합니다.

SPARQL 기반 constraintsSELECT 기반 validators의 SPARQL queries에서 variable PATH의 유일한 적법한 사용은 triple patternpredicate position입니다. variable PATH를 다른 position에서 사용하는 query는 ill-formed입니다.

2.2.1 SPARQL Queries의 Prefix Declarations

shapes graph는 namespace prefixes의 선언을 포함할 수 있으며, 이를 통해 같은 shapes graph에서 파생된 SPARQL queries를 축약하는 데 이러한 prefixes를 사용할 수 있습니다. 이러한 prefix declarations의 구문은 다음 예제로 설명됩니다.

sh:prefixsh:namespace 모두에 대해 values를 가진 IRIs 또는 blank nodesprefix declarations라고 합니다. SHACL vocabulary는 class sh:PrefixDeclaration를 이러한 prefix declarations의 type으로 포함하지만, 이들에 대해 rdf:type triple이 필수는 아닙니다. Prefix declarationssh:prefix property에 대해 정확히 하나의 value를 갖습니다. sh:prefix의 values는 datatype xsd:stringliterals입니다. Prefix declarationssh:namespace property에 대해 정확히 하나의 value를 갖습니다. sh:namespace의 values는 datatype xsd:anyURI 또는 xsd:stringliterals입니다. 이러한 values의 쌍은 prefix에서 namespace로의 단일 mapping을 지정합니다. property sh:declarevaluesprefix declarations입니다.

sh:declare의 values에 권장되는 subject는 prefixes를 사용하는 shapes를 포함하는 named graph의 IRI입니다. 이러한 IRIs는 종종 sh:ShapesGraph 또는 owl:Ontology의 instance로 선언되지만, 필수는 아닙니다.

Prefix declarationsSPARQL 기반 constraints, SPARQL 기반 constraint componentsvalidators, 그리고 SHACL extensions에서 정의한 유사한 기능에서 사용할 수 있습니다. 이러한 nodes는 sh:prefixes property를 사용하여 prefix mappings 집합을 지정할 수 있습니다. sh:prefixes property의 사용 예는 위의 예제에서 확인할 수 있습니다.

sh:prefixes의 values는 IRIs 또는 blank nodes입니다. SHACL processor는 SPARQL 기반 constraint 또는 validatorSPARQL property path sh:prefixes/(^owl:versionIRI?/owl:imports)*/sh:declarevalues인 모든 개별 prefix mappings의 합집합으로 prefix mappings 집합을 수집합니다. ^owl:versionIRI? 요소는 owl:versionIRI로 import된 graphs를 지원하며, 추가 owl:imports를 따라가기 전에 version IRI에서 shapes graph IRI로 이동합니다. 그러한 prefix declarations의 collection이 같은 sh:prefix value에 대해 서로 다른 namespaces를 여러 개 포함하면, shapes graphill-formed입니다. (SHACL processors는 도달하지 않는 prefix declarations를 MAY ignore할 수 있음에 유의하세요).

SPARQL query가 sh:prefixes에 대한 value를 갖지 않는 경우, system은 sh:ShapesGraphSHACL instance에서 sh:declarevaluesprefix declarationsshapes graph에서 사용합니다.

SHACL processor는 모든 prefix mappings에 대한 PREFIX declarations를 앞에 붙여 sh:select의 values(및 sh:ask와 같은 유사한 properties)를 SPARQL로 변환합니다. sh:prefix의 각 value는 PNAME_NS가 되고, sh:namespace의 각 value는 PREFIX declaration의 IRIREF가 됩니다. 위 예제 shapes graph의 경우, SHACL-SPARQL processor는 PREFIX ex: <http://example.com/ns#>와 같은 줄을 생성할 것입니다. 결과 query string을 유효한 SPARQL 1.2 query로 parse할 수 없는 경우, SHACL-SPARQL processor는 failureMUST produce해야 합니다.

이 문서의 나머지 부분에서는 간결성을 위해 sh:prefixes statements가 생략되었을 수 있습니다.

2.3 SPARQL 기반 Constraints를 사용한 검증

이 절은 sh:SPARQLConstraintComponentvalidator를 설명합니다. 이 validator는 가능한 구현 전략 하나만을 설명하며, SHACL processors는 결과가 동등한 한 대안적 접근 방식을 선택할 수 있음에 유의하세요.

TEXTUAL DEFINITION
$sparqlsh:sparqlvalue라고 하자. SPARQL 기반 constraint가 property sh:deactivated에 대해 truevalue로 가지는 경우, validation results는 없습니다. 그렇지 않으면 2.3.1 SPARQL Constraints의 사전 바인딩된 variable $this에 설명된 대로 variable thispre-binding하여 SPARQL 기반 constraint $sparql로 지정된 SPARQL query를 실행합니다. shapeproperty shape인 경우, 실행 전에 substitute the variable PATH where it appears in the predicate position of a triple pattern with a valid SPARQL surface syntax string of the SHACL property path specified via sh:path at the property shape. failure variable의 binding으로 true를 갖지 않는 각 solution마다 하나의 validation result가 있습니다. 이러한 validation results2.3.2 Solution Bindings를 Result Properties로 매핑에서 설명한 property values를 MUST have합니다. $sparqlsh:severity에 대한 value를 가지면, validation result는 해당 value를 자신의 유일한 sh:resultSeverityMUST have합니다. solutions 중 하나가 failure에 대한 binding으로 true를 갖는 경우에만, 그리고 그 경우에만 failureMUST be produced합니다.

2.3.1 SPARQL Constraints의 사전 바인딩된 variable $this

SPARQL 기반 constraints의 SPARQL queries와 SPARQL 기반 constraint componentsvalidatorsprocessed될 때, SHACL-SPARQL processor는 variable $this의 values를 현재 focus nodepre-binds합니다.

2.3.2 Solution Bindings를 Result Properties로 매핑

validation result nodes의 property values는 result solutions와 constraint 자체의 values의 조합을 통해 다음 규칙으로부터 파생됩니다. 규칙은 위에서 아래로 실행되도록 되어 있으므로, 첫 번째 bound value가 사용됩니다.

속성 생성 규칙
sh:focusNode
  1. variable this에 대한 binding
sh:resultPath
  1. variable path에 대한 binding, 그것이 IRI인 경우
  2. property shape가 생성한 results의 경우, shape의 sh:path value와 동등한 SHACL property path
sh:value
  1. variable value에 대한 binding
  2. value node
sh:resultMessage
  1. variable message에 대한 binding
  2. SPARQL 기반 constraints의 경우: SPARQL 기반 constraintsh:message values. SPARQL 기반 constraint components의 경우: SPARQL 기반 constraint componentvalidatorsh:message values.
  3. SPARQL 기반 constraint components의 경우: SPARQL 기반 constraint componentsh:message values.
  4. shape 또는 constraint에서 messages 선언을 위한 기본 메커니즘이 그 밖의 경우에 적용됩니다.
이러한 message literals는 {?varName} 또는 {$varName}을 통해 SELECT result variables의 이름을 포함할 수 있습니다. constraint가 SPARQL 기반 constraint component에 기반하는 경우, component의 parameter names도 사용할 수 있습니다. 이러한 {?varName}{$varName} blocks는 해당 variables의 값에 대한 적절한 문자열 표현으로 SHOULD replace되어야 합니다.
sh:sourceConstraint
  1. SPARQL 기반 constraint, 즉 sh:sparql의 value

3. SPARQL 기반 제약 컴포넌트

SPARQL 기반 제약은 많은 유연성을 제공하지만, 일부 사람에게는 이해하기 어렵거나 반복을 초래할 수 있습니다. 이 절에서는 SPARQL의 복잡성을 추상화하고 Core 제약 컴포넌트와 유사한 고수준의 재사용 가능한 컴포넌트를 선언하는 방법으로 SPARQL 기반 제약 컴포넌트를 소개합니다. 이러한 제약 컴포넌트는 SHACL RDF vocabulary를 사용하여 선언할 수 있으므로 공유하고 재사용할 수 있습니다.

3.1 SPARQL 기반 제약 컴포넌트의 예

이 절은 비규범입니다.

다음 예제는 SHACL-SPARQL 언어를 사용하여 새로운 제약 컴포넌트를 지정하는 데 SPARQL을 어떻게 사용할 수 있는지 보여 줍니다. 이 예제는 각 value node가 주어진 regular expression과 일치하는지 검증하기 위해 sh:patternsh:flagsSPARQL ASK query를 사용하여 구현합니다. 이는 예제 구현일 뿐이며 규범적인 것으로 간주해서는 안 됩니다.

제약 컴포넌트는 validation engine에게 shape 안의 제약을 식별하고 검증하는 방법에 대한 지침을 제공합니다. 일반적으로 shape S가 property p에 대한 value를 가지고, p를 parameter로 지정하는 constraint component C가 있으며, SC의 모든 mandatory parameters에 대한 값을 가지고 있다면, 이러한 parameter values의 집합(optional parameters 포함)은 제약을 선언하고, validation engine은 이 제약의 검증을 수행하기 위해 C에서 적절한 validator를 사용합니다. 위 예제에서 sh:PatternConstraintComponent는 mandatory parameter sh:pattern, optional parameter sh:flags, 그리고 node shapes 또는 property shapes에 대해 검증을 수행하는 데 사용할 수 있는 validator를 선언합니다.

3.2 SPARQL 기반 제약 컴포넌트의 구문

SPARQL 기반 제약 컴포넌트IRI이며, shapes graph 안에서 sh:ConstraintComponent라는 SHACL type을 가집니다.

이 문서에서 새로운 제약 컴포넌트를 선언하는 메커니즘은 SPARQL에 기반한 것들로 제한됩니다. 그러나 parameters와 validators를 선언하는 일반 구문은 JavaScript와 같은 다른 extension languages에도 작동하도록 설계되었습니다.

3.2.1 Parameter Declarations (sh:parameter)

parameters of a constraint component는 property sh:parameter를 통해 선언됩니다. sh:parameter의 values를 parameter declarations라고 합니다. class sh:Parametertype of parameter declarations로 사용할 수 있지만, 그러한 triple은 필수가 아닙니다. parameter declaration은 property sh:path에 대해 정확히 하나의 value를 가집니다. parameter declarations에서 sh:pathvalueIRI입니다.

IRIlocal nameIRI 끝에 있는 가장 긴 NCNAME으로 정의되며, 이때 IRI 안의 첫 번째 colon 바로 뒤에 있으면 안 됩니다. parameter declarationparameter namesh:pathlocal name of the value로 정의됩니다. parameters를 SPARQL variables로 올바르게 매핑할 수 있도록 다음 구문 규칙이 적용됩니다.

모든 parameter name은 유효한 SPARQL VARNAME입니다. Parameter names는 다음 중 하나여서는 안 됩니다. this, path, PATH, value. 두 개 이상의 parameter declarations가 같은 parameter names를 사용하는 constraint component는 ill-formed입니다.

sh:optional의 values는 datatype xsd:boolean을 가진 literals여야 합니다. parameter declaration은 property sh:optional에 대해 최대 하나의 value를 가질 수 있습니다. true로 설정되면 parameter declaration은 optional parameter를 선언합니다. 모든 constraint component는 적어도 하나의 non-optional parameter를 가집니다.

class sh:Parametersh:PropertyShapeSHACL subclass로 정의되며, property shapes에 적용 가능한 모든 properties를 parameters에도 사용할 수 있습니다. 여기에는 sh:namesh:description과 같은 descriptive properties뿐 아니라 sh:class와 같은 constraint parameters도 포함됩니다. parameters에 대해 선언된 constraints에 conform하지 않는 shapes는 ill-formed입니다. 일부 구현은 유효하지 않은 parameter values로 constraint components가 실행되는 것을 막기 위해 이러한 constraint parameters를 사용할 MAY 있습니다.

3.2.2 Label Templates (sh:labelTemplate)

property sh:labelTemplate는 어떤 constraint component에서도 constraints를 사람에게 어떻게 렌더링할 수 있는지 제안하는 데 사용할 수 있습니다. sh:labelTemplate의 values는 strings(가능하면 language tag 포함)입니다 그리고 이를 label templates라고 합니다.

이 절의 나머지는 비규범입니다.

Label templates는 constraint component에 대해 선언된 parameters의 이름을 포함할 수 있으며, {?varName} 또는 {$varName} 구문을 사용합니다. 여기서 varNameparameter name의 이름입니다. 표시 시점에는 이러한 {?varName}{$varName} blocks가 실제 parameter values로 대체되어야 합니다. 같은 subject에 대해 여러 label templates가 있을 수 있지만, 같은 language tags를 가져서는 안 되며, datatype xsd:string을 가진 template가 둘 이상 있어서는 안 됩니다.

3.2.3 Validators

지원되는 각 shape type(즉, property shape 또는 node shape)마다 constraint component는 적절한 validator를 선언합니다. 주어진 constraint에 대해 validator는 다음 규칙을 순서대로 사용하여 constraint component에서 선택됩니다.

  1. node shapes의 경우, 존재하면 sh:nodeValidator의 values 중 하나를 사용합니다.
  2. property shapes의 경우, 존재하면 sh:propertyValidator의 values 중 하나를 사용합니다.
  3. 그렇지 않으면 sh:validator의 values 중 하나를 사용합니다.

적절한 validator를 찾을 수 없으면 SHACL-SPARQL processor는 constraint를 무시합니다.

SHACL-SPARQL은 두 가지 유형의 validators를 포함합니다. sh:nodeValidatorsh:propertyValidatorSPARQL SELECT 기반 validators와 sh:validatorSPARQL ASK queries 기반 validators입니다.

3.2.3.1 SELECT 기반 Validators

sh:SPARQLSelectValidator라는 SHACL type을 가진 ValidatorsSELECT 기반 validators라고 합니다. sh:nodeValidator의 values는 SELECT 기반 validators여야 합니다. sh:propertyValidator의 values는 SELECT 기반 validators여야 합니다. SELECT 기반 validators는 property sh:select에 대해 정확히 하나의 value를 가집니다. sh:select의 value는 앞서 언급한 prefix handling rules를 사용하는 유효한 SPARQL SELECT query입니다. sh:select의 value에서 파생된 SPARQL query는 SELECT clause에서 variable thisprojects합니다.

이 절의 나머지는 비규범입니다.

다음 예제는 SPARQL SELECT query를 기반으로 한 constraint component의 선언을 보여 줍니다. 이는 2.1 SPARQL 기반 제약의 예에서 나온 예제의 일반화된 변형입니다. 그 SPARQL query에는 특정 property ex:germanLabel과 language tag de라는 두 개의 constants가 포함되어 있었습니다. constraint components는 이러한 시나리오를 일반화하여 constants가 pre-bound with parameters되도록 할 수 있습니다. 이를 통해 새로운 SPARQL을 작성하지 않고도 query logic을 여러 곳에서 재사용할 수 있습니다.

constraint component가 (shapes graph 안에서) 선언되면, 그 parameters는 다음 예제와 같이 사용할 수 있습니다.

위 example shape는 ex:germanLabel의 모든 values가 language tag de를 가져야 하고, ex:englishLabel의 모든 values는 language로 en을 가져야 한다는 조건을 지정합니다. 이러한 세부 사항은 constraint component가 요구하는 ex:lang parameter의 values를 가진 두 property shapes를 통해 지정됩니다.

3.2.3.2 ASK 기반 Validators

많은 constraint components는 모든 value nodes를 어떤 boolean condition에 대해 개별적으로 테스트하는 형태입니다. 이를 위해 SELECT queries를 작성하는 것은 번거로워지며, 특히 constraint component가 property shapesnode shapes 모두에 사용될 수 있는 경우 더욱 그렇습니다. SHACL-SPARQL은 ASK queries 기반 validators를 위한 대안적인 더 간결한 구문을 제공합니다.

sh:SPARQLAskValidator라는 SHACL type을 가진 ValidatorsASK 기반 validators라고 합니다. sh:validator의 values는 ASK 기반 validators여야 합니다. ASK 기반 validators는 property sh:ask에 대해 정확히 하나의 value를 가집니다. sh:ask의 value는 datatype xsd:string을 가진 literal이어야 합니다. sh:ask의 value는 앞서 언급한 prefix handling rules를 사용하는 유효한 SPARQL ASK query여야 합니다.

이 절의 나머지는 비규범입니다.

ASK queries는 주어진 value node (value라는 pre-bound variable로 표현됨)가 constraint에 conform하는 경우에만 true를 반환합니다.

다음 예제는 ASK query를 사용하는 constraint component를 선언합니다.

ASK query가 구현하는 validation condition은 SELECT counterpart와 "반대 방향"이라는 점에 유의하세요. ASK queries는 constraint에 conform하는 value nodes에 대해 true를 반환하는 반면, SELECT queries는 conform하지 않는 value nodes를 반환합니다.

3.3 SPARQL 기반 제약 컴포넌트를 사용한 검증

이 절은 SPARQL 기반 제약 컴포넌트validator를 정의합니다. 이 validator는 가능한 구현 전략 하나만을 설명하며, 결과가 동등한 한 SHACL processors가 대안적 접근 방식을 선택할 수 있음에 유의하세요.

첫 번째 단계로, 3.2.3 Validators에 개요가 제시된 규칙에 따라 validatorMUST 선택되어야 합니다. 그런 다음 다음 규칙이 적용되어 SPARQL queries의 solutions 집합을 생성합니다.

위 SPARQL query executions는 2.3.1 SPARQL Constraints의 사전 바인딩된 variable $this에 설명된 대로 variable thispre-bind해야 MUST 합니다. 또한 constraint 안의 constraint componentparameter에 대한 각 value는 그 이름으로 parameter name을 갖는 variable로 pre-bound되어야 MUST 합니다.

validation results에 대한 production rules는 위에서 생성된 QS solutions를 사용하여 SPARQL 기반 constraints에 대한 것과 동일합니다.

4. Annotation Properties

이 절은 SPARQL 기반 constraints 또는 constraint components를 사용하여 validation results를 생성하는 일반 mechanism을 확장합니다.

이 기능을 지원하는 구현은 SPARQL 기반 constraint 또는 constraint componentSELECT queries가 생성한 각 solution에 대해 만들어지는 validation result nodes에 annotation properties를 주입할 수 있게 합니다. 그러한 annotation property는 sh:select 또는 sh:ask triplesubject에서 sh:resultAnnotationvalue를 통해 선언되어야 합니다.

sh:resultAnnotationvaluesresult annotations라고 하며, 이는 IRIs 또는 blank nodes입니다.

Result annotations는 다음 properties를 가집니다.

Property 요약 및 구문 규칙
sh:annotationProperty 설정되어야 하는 property입니다. result annotation은 property sh:annotationProperty에 대해 정확히 하나의 value를 가지며, 이 value는 IRI입니다.
sh:annotationVarName annotation values를 가져올 SPARQL variable의 이름입니다. result annotation은 property sh:annotationVarName에 대해 최대 1개의 value를 가지며, 이 valuexsd:string datatype을 가진 literal입니다.
sh:annotationValue 기본값으로 사용되어야 하는 constant RDF terms입니다.

SELECT result set의 각 solution에 대해, annotations를 지원하는 SHACL processor는 선언된 result annotations를 순회합니다. result annotations에서 SPARQL variables로의 mapping은 다음 규칙을 사용합니다.

  1. property sh:annotationVarNamevalue를 사용합니다
  2. 그러한 value가 없으면, sh:annotationPropertyvaluelocal name을 variable name으로 사용합니다.

variable name을 결정할 수 있으면, SHACL processor는 주어진 variable에 대한 bindingsh:annotationProperty를 사용하여 지정된 property의 value로 복사하여, 현재 solution에 대해 생성 중인 validation result에 넣습니다. result set solution에서 variable에 binding이 없으면, 존재하는 경우 sh:annotationValuevalues가 사용됩니다.

다음은 result annotations의 사용을 보여 주는 예제입니다.

ex:AnnotationExample
	a sh:NodeShape ;
	sh:targetNode ex:ExampleResource ;
	sh:sparql [   # _:b1
		sh:resultAnnotation [
			sh:annotationProperty ex:time ;
			sh:annotationVarName "time" ;
		] ;
		sh:select """
			SELECT $this ?message ?time
			WHERE {
				BIND (CONCAT("The ", "message.") AS ?message) .
				BIND (NOW() AS ?time) .
			}
			""" ;
	] .

검증은 다음 validation report를 생성합니다.

[	a sh:ValidationReport ;
	sh:conforms false ;
	sh:result [
		a sh:ValidationResult ;
		sh:focusNode ex:ExampleResource ;
		sh:resultMessage "The message." ;
		sh:resultSeverity sh:Violation ;
		sh:sourceConstraint _:b1 ;
		sh:sourceConstraintComponent sh:SPARQLConstraintComponent ;
		sh:sourceShape ex:AnnotationExample ;
		ex:time "2015-03-27T10:58:00"^^xsd:dateTime ;  # Example
	]
] .

5. SPARQL 기반 Node Expressions

이 절은 SPARQL 기반 node expression functions를 소개합니다.

5.1 Select Expressions

sh:select에 대한 value를 가진 node expressionfunction name sh:SelectExpression을 가진 select expression이라고 합니다.

RDF graph의 node는 blank node이며, predicate sh:select에 대해 정확히 하나의 value를 가지고, 이 valuexsd:string datatype을 가진 literal인 경우, well-formed select expression입니다. well-formed select expression은 property sh:prefixes에 대해 최대 하나의 value를 가질 수 있으며, 이 value는 IRI 또는 blank node일 수 있습니다.

prefix handling rules를 사용하면, sh:select의 value는 유효한 SPARQL 1.2 SELECT query입니다. sh:select의 value에서 파생된 SPARQL query는 SELECT clause에서 정확히 하나의 variable을 projects합니다.

SELECT EXPRESSIONS의 평가

select expressionoutput nodes는 query가 focus graph에 대해 평가될 때, SELECT clause에서 projected된 (유일한) variable의 bindings만으로 정확히 구성된 목록 resultNodes입니다. focusNode의 value는 SPARQL variable this의 value로 pre-bound됩니다. 각 scope variable의 value는 같은 이름과 value를 가진 SPARQL variable로 pre-bound됩니다. scope variables 중 하나가 this라고 불리는 경우 failure가 생성됩니다.

evalExpr(expr, focusGraph, focusNode, scope) -> resultNodes

이 절의 나머지는 비규범입니다.

5.2 SPARQL Expr Expressions

sh:sparqlExpr에 대한 value를 가진 node expressionfunction name sh:SPARQLExprExpression을 가진 SPARQL expr expression이라고 합니다.

RDF graph의 node는 blank node이며, predicate sh:sparqlExpr에 대해 정확히 하나의 value를 가지고, 그 valuexsd:string datatype을 가진 literal인 경우, well-formed SPARQL expr expression입니다. well-formed SPARQL expr expression은 property sh:prefixes에 대해 최대 하나의 value를 가질 수 있으며, 이 value는 IRI 또는 blank node입니다.

$EXPR$sh:evalvalue라고 하고, $PREFIXES$sh:prefixes의 value를 사용하여 prefix handling rules에서 나온 SPARQL prefixes block이라고 하면, select$EXPR$$PREFIXES$가 다음에 삽입된 문자열로 정의됩니다.

$PREFIXES$ SELECT ($EXPR$ AS ?result) WHERE {}

select는 유효한 SPARQL 1.2 SELECT query입니다.

SPARQL EXPR EXPRESSIONS의 평가

SPARQL expr expressionoutput nodes는 query가 focus graph에 대해 평가될 때, 위에서 정의한 select query의 SELECT clause에서 projected된 (유일한) variable의 bindings만으로 정확히 구성된 목록 resultNodes입니다. focusNode의 value는 SPARQL variable this의 value로 pre-bound됩니다. 각 scope variable의 value는 같은 이름과 value를 가진 SPARQL variable로 pre-bound됩니다. scope variables 중 하나가 this라고 불리는 경우 failure가 생성됩니다.

evalExpr(expr, focusGraph, focusNode, scope) -> resultNodes

이 절의 나머지는 비규범입니다.

부록

A. SPARQL Queries에서 Variables의 사전 바인딩

SHACL-SPARQL의 일부 기능은 이 절에서 정의하는 variables의 사전 바인딩 개념에 의존합니다.

(위험 기능) Issue 647: SHACL-SPARQL prebinding에 "at risk" 고지를 추가 SPARQL

이 기능은 "at risk"이며, 이 영역에서 현재 진행 중인 RDF 및 SPARQL 1.2 작업과 맞추기 위해 변경될 수 있습니다(제거되지는 않음). 원래 Issue 647로 논의되었습니다.

SHACL에서 사용하는 pre-binding의 정의는 SPARQL queries에 대해 다음 제한을 요구합니다. SHACL-SPARQL processors는 sh:selectsh:ask를 통해 이러한 "MUST" 제한 중 하나라도 위반하는 SHACL-SPARQL queries를 포함하는 shapes graph를 처리할 때 failureMUST 보고해야 합니다. 잠재적으로 pre-bound된 variables라는 용어에는 this, value(ASK queries의 경우), 그리고 query를 사용하는 constraint componentparameters를 나타내는 모든 variables가 포함됩니다.

또한 SPARQL queries는 federated query(SERVICE)를 포함하지 않는 것이 SHOULD입니다. SERVICE를 허용하지 않는 구현은 위에서 언급한 것처럼 failureMUST 보고해야 합니다. 그러나 일부 SPARQL 구현이 SERVICE keyword를 특정(일반적으로 local) 작업을 위한 syntax로 사용한다는 점이 인정되므로, 이 keyword가 일반적으로 금지되는 것은 아닙니다.

정의: Values Insertion

solution mapping μ에 대해, Table(μ)μ에서 형성된 multiset으로 정의합니다.

   Table(μ) = { μ }
   Card[μ] = 1

Values Insertion 함수 Replace(X, μ)X 안에 있는 Basic Graph Pattern, Property Path Expression, Graph(Var, pattern)의 각 발생 Yjoin(Y, Table(μ))로 바꾸는 것으로 정의합니다.

정의: variables의 사전 바인딩

pre-bound variables μ를 가진 SPARQL Query Q = (E, DS, QF)의 평가는 SPARQL query Q' = (Replace(E, μ), DS, QF)의 평가로 정의됩니다.

B. SHACL 구문 규칙 요약

이 절은 SHACL의 모든 규범적 구문 규칙을 열거합니다. 이 절은 이 명세의 다른 부분에서 자동으로 생성되며, 규칙의 맥락이 불명확한 경우 본문으로 돌아가는 hyperlinks가 제공됩니다. shapes graph에서 이러한 규칙을 위반하는 nodes는 ill-formed입니다.

Syntax Rule Id Syntax Rule Text
sparql-nodeKind Shapes는 property sh:sparql에 대한 values를 가질 수 있으며, 이러한 values는 IRIs 또는 blank nodes입니다.
SPARQLConstraint-select-count SPARQL 기반 constraints는 property sh:select에 대해 정확히 하나의 value를 가집니다
SPARQLConstraint-select-datatype sh:select의 value는 datatype xsd:stringliteral입니다.
select-query-valid prefix handling rules를 사용하면, sh:select의 value는 유효한 SPARQL 1.2 SELECT query입니다.
select-query-this sh:select의 value에서 파생된 SPARQL query는 SELECT clause에서 variable thisprojects합니다.
SPARQLConstraint-message-datatype SPARQL 기반 constraints는 property sh:message에 대한 values를 가질 수 있으며, 이들은 datatype xsd:string, rdf:dirLangString, rdf:langString, 또는 rdf:HTML을 가진 literals입니다. 같은 language tag를 가진 sh:message value가 둘 이상 있거나, datatype xsd:string의 value가 여러 개 있어서는 안 됩니다.
SPARQLConstraint-deactivated-maxCount SPARQL 기반 constraints는 property sh:deactivated에 대해 최대 하나의 value를 가질 수 있습니다
SPARQLConstraint-severity SPARQL 기반 constraints는 property sh:severity에 대해 최대 하나의 value를 가질 수 있으며, 이 value는 IRI입니다.
PATH-position SPARQL 기반 constraintsSELECT 기반 validators의 SPARQL queries에서 variable PATH의 유일한 적법한 사용은 triple patternpredicate position입니다.
prefix-count Prefix declarations는 property sh:prefix에 대해 정확히 하나의 value를 가집니다
prefix-datatype sh:prefix의 values는 datatype xsd:stringliterals입니다.
namespace-count Prefix declarations는 property sh:namespace에 대해 정확히 하나의 value를 가집니다.
namespace-datatype sh:namespace의 values는 datatype xsd:anyURI 또는 xsd:stringliterals입니다.
declare-nodeKind property sh:declarevaluesprefix declarations입니다
prefixes-nodeKind sh:prefixes의 values는 IRIs 또는 blank nodes입니다.
prefixes-duplicates SHACL processor는 SPARQL 기반 constraint 또는 validatorSPARQL property path sh:prefixes/(^owl:versionIRI?/owl:imports)*/sh:declarevalues인 모든 개별 prefix mappings의 합집합으로 prefix mappings 집합을 수집합니다. ^owl:versionIRI? element는 owl:versionIRI로 import된 graphs를 지원하며, 추가 owl:imports를 따르기 전에 version IRI에서 shapes graph IRI로 이동합니다. 이러한 prefix declarations collection이 같은 sh:prefix value에 대해 서로 다른 namespaces를 여러 개 포함하면, shapes graphill-formed입니다.
ConstraintComponent SPARQL 기반 constraint componentIRI이며, shapes graph 안에서 sh:ConstraintComponent라는 SHACL type을 가집니다.
Parameter-predicate-count parameter declaration은 property sh:path에 대해 정확히 하나의 value를 가집니다
Parameter parameter declarations에서 sh:pathvalueIRI입니다.
parameter-name-VARNAME 모든 parameter name은 유효한 SPARQL VARNAME입니다.
parameter-name-not-in Parameter names는 다음 중 하나여서는 안 됩니다. this, path, PATH, value.
parameter-name-unique 두 개 이상의 parameter declarations가 같은 parameter names를 사용하는 constraint component는 ill-formed입니다.
optional-datatype sh:optional의 values는 datatype xsd:boolean을 가진 literals여야 합니다.
optional-maxCount parameter declaration은 property sh:optional에 대해 최대 하나의 value를 가질 수 있습니다.
ConstraintComponent-parameter 모든 constraint component는 적어도 하나의 non-optional parameter를 가집니다.
Parameter-conformance parameters에 대해 선언된 constraints에 conform하지 않는 shapes는 ill-formed입니다.
labelTemplate-datatype sh:labelTemplate의 values는 strings(가능하면 language tag 포함)입니다
nodeValidator-class sh:nodeValidator의 values는 SELECT 기반 validators여야 합니다.
propertyValidator-class sh:propertyValidator의 values는 SELECT 기반 validators여야 합니다.
SPARQLSelectValidator-select-count SELECT 기반 validators는 property sh:select에 대해 정확히 하나의 value를 가집니다.
validator-class sh:validator의 values는 ASK 기반 validators여야 합니다.
ask-count ASK 기반 validators는 property sh:ask에 대해 정확히 하나의 value를 가집니다
ask-datatype sh:ask의 value는 datatype xsd:string을 가진 literal이어야 합니다.
ask-sparql sh:ask의 value는 앞서 언급한 prefix handling rules를 사용하는 유효한 SPARQL ASK query여야 합니다.
resultAnnotation-nodeKind sh:resultAnnotationvaluesresult annotations라고 하며, 이는 IRIs 또는 blank nodes입니다
annotationProperty result annotation은 property sh:annotationProperty에 대해 정확히 하나의 value를 가지며, 이 value는 IRI입니다.
annotationVarName result annotation은 property sh:annotationVarName에 대해 최대 1개의 value를 가지며, 이 valuexsd:string datatype을 가진 literal입니다.
SelectExpression-syntax RDF graph의 node는 blank node이며, predicate sh:select에 대해 정확히 하나의 value를 가지고, 이 valuexsd:string datatype을 가진 literal인 경우, well-formed select expression입니다.
SelectExpression-syntax-prefixes well-formed select expression은 property sh:prefixes에 대해 최대 하나의 value를 가질 수 있으며, 이 value는 IRI 또는 blank node일 수만 있습니다.
SelectExpression-query-valid prefix handling rules를 사용하면, sh:select의 value는 유효한 SPARQL 1.2 SELECT query입니다.
SelectExpression-query-output-nodes sh:select의 value에서 파생된 SPARQL query는 SELECT clause에서 정확히 하나의 variable을 projects합니다.
SPARQLExprExpression-syntax-eval RDF graph의 node는 blank node이며, predicate sh:sparqlExpr에 대해 정확히 하나의 value를 가지고, 그 valuexsd:string datatype을 가진 literal인 경우, well-formed SPARQL expr expression입니다.
SPARQLExprExpression-syntax-prefixes well-formed SPARQL expr expression은 property sh:prefixes에 대해 최대 하나의 value를 가질 수 있으며, 이 value는 IRI 또는 blank node입니다.
SPARQLExprExpression-template $EXPR$sh:evalvalue라고 하고, $PREFIXES$sh:prefixes의 value를 사용하여 prefix handling rules에서 나온 SPARQL prefixes block이라고 하면, select$EXPR$$PREFIXES$가 다음에 삽입된 문자열로 정의됩니다.

$PREFIXES$ SELECT ($EXPR$ AS ?result) WHERE {}

SPARQLExprExpression-query-valid select는 유효한 SPARQL 1.2 SELECT query입니다.
pre-binding-limitations

SHACL에서 사용하는 pre-binding의 정의는 SPARQL queries에 대해 다음 제한을 요구합니다. SHACL-SPARQL processors는 sh:selectsh:ask를 통해 이러한 "MUST" 제한 중 하나라도 위반하는 SHACL-SPARQL queries를 포함하는 shapes graph를 처리할 때 failureMUST 보고해야 합니다. 잠재적으로 pre-bound된 variables라는 용어에는 this, value(ASK queries의 경우), 그리고 query를 사용하는 constraint componentparameters를 나타내는 모든 variables가 포함됩니다.

  • SPARQL queries는 MINUS clause를 포함해서는 MUST 안 됩니다
  • SPARQL queries는 잠재적으로 pre-bound된 variable을 언급하는 VALUES clause를 포함해서는 MUST 안 됩니다
  • SPARQL queries는 잠재적으로 pre-bound된 variable에 대해 ​​AS ?var syntax form을 사용해서는 MUST 안 됩니다

또한 SPARQL queries는 federated query (SERVICE)를 포함하지 않는 것이 SHOULD입니다. SERVICE를 허용하지 않는 구현은 위에서 언급한 것처럼 failureMUST 보고해야 합니다. 그러나 일부 SPARQL implementations가 SERVICE keyword를 특정(일반적으로 local) 작업을 위한 syntax로 사용한다는 점이 인정되므로, 이 keyword가 일반적으로 금지되는 것은 아닙니다.

C. SHACL Core 제약 검증기의 잠재적 SPARQL 정의

이 절은 비규범입니다.

이 부록은 [shacl12-core]의 constraint componentstargets의 의미론에 대한 비규범적 대안 정의에서 SPARQL 1.2의 일부를 사용합니다. 이것들이 일부 구현자에게 도움이 될 수는 있지만, SHACL Core language 구현에 SPARQL이 필요한 것은 아닙니다.

$ marker를 사용하는 SPARQL variables는 SPARQL query 실행 전에 pre-bound되거나, $PATH의 경우 substituted되는 외부 bindings를 나타냅니다 (3.3 SPARQL 기반 Constraint Components를 사용한 검증에서 설명함).

C.1 sh:targetClass

다음 query는 class targets의 잠재적 정의를 SPARQL로 표현합니다. variable targetClasssh:targetClass의 주어진 value에 pre-bound됩니다. solutions에서 나온 variable this의 모든 bindings는 focus nodes가 됩니다.

SPARQL의 잠재적 정의
SELECT DISTINCT ?this    # ?this is the focus node
WHERE {
	?this rdf:type/rdfs:subClassOf* $targetClass .
}

C.2 sh:targetSubjectsOf

다음 query는 subjects-of targets의 잠재적 정의를 SPARQL로 표현합니다. variable targetSubjectsOfsh:targetSubjectsOf의 주어진 value에 pre-bound됩니다. solutions에서 나온 variable this의 모든 bindings는 focus nodes가 됩니다.

SPARQL의 잠재적 정의
SELECT DISTINCT ?this    # ?this is the focus node
WHERE {
	?this $targetSubjectsOf ?any .
}

C.3 sh:targetObjectsOf

다음 query는 objects-of targets의 잠재적 정의를 SPARQL로 표현합니다. variable targetObjectsOfsh:targetObjectsOf의 주어진 value에 pre-bound됩니다. solutions에서 나온 variable this의 모든 bindings는 focus nodes가 됩니다.

SPARQL의 잠재적 정의
SELECT DISTINCT ?this    # ?this is the focus node
WHERE {
	?any $targetObjectsOf ?this .
}

C.4 sh:class

다음 query는 sh:class에 대한 잠재적 SPARQL 기반 validator를 표현합니다.

SPARQL의 잠재적 정의(각 value node $value에 대해 true로 평가되어야 함)
ASK {
	$value rdf:type/rdfs:subClassOf* $class .
}

C.5 sh:nodeKind

다음 query는 sh:nodeKind에 대한 잠재적 SPARQL 기반 validator를 표현합니다.

SPARQL의 잠재적 정의(각 value node $value에 대해 true로 평가되어야 함)
ASK {
	FILTER ((isIRI($value) && $nodeKind IN ( sh:IRI, sh:BlankNodeOrIRI, sh:IRIOrLiteral ) ) ||
		(isLiteral($value) && $nodeKind IN ( sh:Literal, sh:BlankNodeOrLiteral, sh:IRIOrLiteral ) ) ||
		(isBlank($value)   && $nodeKind IN ( sh:BlankNode, sh:BlankNodeOrIRI, sh:BlankNodeOrLiteral ) )) .
}

C.6 sh:minExclusive (etc)

다음 query는 sh:minExclusive에 대한 잠재적 SPARQL 기반 validator를 표현합니다. SPARQL expression은 예를 들어 누군가 문자열을 정수와 비교하는 경우처럼 value node를 지정된 범위와 비교할 수 없으면 error를 생성합니다. 비교를 수행할 수 없으면 validation result가 있습니다. 이는 예를 들어 일반 SPARQL query에서 그러한 errors가 조용히 어떤 results도 만들지 않는 것과 다릅니다.

SPARQL의 잠재적 정의(각 value node $value에 대해 true로 평가되어야 함)
ASK {
	FILTER ($minExclusive < $value)
}

다음에 대해서도 유사한 정의가 가능합니다.

C.7 sh:minLength

다음 query는 sh:minLength에 대한 잠재적 SPARQL 기반 validator를 표현합니다.

SPARQL의 잠재적 정의(각 value node $value에 대해 true로 평가되어야 함)
ASK {
	FILTER (STRLEN(str($value)) >= $minLength) .
}

C.8 sh:maxLength

다음 query는 sh:maxLength에 대한 잠재적 SPARQL 기반 validator를 표현합니다.

SPARQL의 잠재적 정의(각 value node $value에 대해 true로 평가되어야 함)
ASK {
	FILTER (STRLEN(str($value)) <= $maxLength) .
}

C.9 sh:pattern

다음 query는 sh:pattern에 대한 잠재적 SPARQL 기반 validator를 표현합니다.

SPARQL의 잠재적 정의(각 value node $value에 대해 true로 평가되어야 함)
ASK {
	FILTER (!isBlank($value) && IF(bound($flags), regex(str($value), $pattern, $flags), regex(str($value), $pattern)))
}

C.10 sh:disjoint

다음 query는 sh:disjoint에 대한 잠재적 SPARQL 기반 validator를 표현합니다.

SPARQL의 잠재적 정의(주어진 $PATH에 대해 results를 반환하지 않아야 함)
SELECT DISTINCT $this ?value
WHERE {
	$this $PATH ?value .
	$this $disjoint ?value .
}

C.11 sh:lessThan

다음 query는 sh:lessThan에 대한 잠재적 SPARQL 기반 validator를 표현합니다.

SPARQL의 잠재적 정의(주어진 $PATH에 대해 results를 반환하지 않아야 함)
SELECT $this ?value
WHERE {
	$this $PATH ?value .
	$this $lessThan ?otherValue .
	BIND (?value < ?otherValue AS ?result) .
	FILTER (!bound(?result) || !(?result)) .
}

C.12 sh:lessThanOrEquals

다음 query는 sh:lessThanOrEquals에 대한 잠재적 SPARQL 기반 validator를 표현합니다.

SPARQL의 잠재적 정의(주어진 $PATH에 대해 results를 반환하지 않아야 함)
SELECT $this ?value
WHERE {
	$this $PATH ?value .
	$this $lessThanOrEquals ?otherValue .
	BIND (?value <= ?otherValue AS ?result) .
	FILTER (!bound(?result) || !(?result)) .
}

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

이 절은 비규범입니다.

GRAPHFROM과 같은 SPARQL key words는 dataset 안에서 active data graph가 아닌 graphs에 대한 접근을 제공할 수 있음에 유의하세요. SHACL-SPARQL engine은 SPARQL engine이 validation을 트리거한 user에게 접근이 허용되지 않은 named graphs에 대한 접근을 제공하지 않도록 보장해야 합니다.

SHACL-SPARQL의 보안 고려사항에는 SPARQL, SPARQL Federated Query (SERVICE) 및 SHACL Core의 모든 보안 고려사항이 포함됩니다.

E. 감사의 글

이 절은 비규범입니다.

원래 SHACL core specifications는 RDF Data Shapes Working Group에서 작성했습니다. Core specification의 Acknowledgements sectionAdvanced Features specification의 Acknowledgements section을 참조하세요.

F. 원래 SHACL 명세와 SHACL 1.2 SPARQL 사이의 변경사항

이 절은 비규범입니다.

G. 참고 문헌

G.1 규범 참고 문헌

[owl2-syntax]
OWL 2 Web Ontology Language Structural Specification and Functional-Style Syntax (Second Edition). Boris Motik; Peter Patel-Schneider; Bijan Parsia. W3C. 2012년 12월 11일. W3C Recommendation. URL: https://www.w3.org/TR/owl2-syntax/
[rdf12-concepts]
RDF 1.2 Concepts and Abstract Data Model. Andy Seaborne; Gregg Kellogg; Olaf Hartig; Pierre-Antoine Champin. W3C. 2026년 4월 7일. W3C Candidate Recommendation. URL: https://www.w3.org/TR/rdf12-concepts/
[rdf12-turtle]
RDF 1.2 Turtle. Gregg Kellogg; Andy Seaborne; Dominik Tomaszuk. W3C. 2026년 6월 12일. W3C Working Draft. URL: https://www.w3.org/TR/rdf12-turtle/
[REC-xml-names]
Namespaces in XML 1.0 (Third Edition). Tim Bray; Dave Hollander; Andrew Layman; Richard Tobin; Henry Thompson et al. W3C. 2009년 12월 8일. W3C Recommendation. URL: https://www.w3.org/TR/xml-names/
[RFC2119]
Key words for use in RFCs to Indicate Requirement Levels. S. Bradner. IETF. 1997년 3월. Best Current Practice. URL: https://www.rfc-editor.org/info/rfc2119/
[RFC8174]
Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words. B. Leiba. IETF. 2017년 5월. Best Current Practice. URL: https://www.rfc-editor.org/info/rfc8174/
[shacl12-core]
SHACL 1.2 Core. Holger Knublauch; Thomas Bergwinkl; Yousouf Taghzouti; Jesse Wright. W3C. 2026년 6월 30일. W3C Working Draft. URL: https://www.w3.org/TR/shacl12-core/
[sparql12-query]
SPARQL 1.2 Query Language. Olaf Hartig; Andy Seaborne; Ruben Taelman; Gregory Williams; Thomas Pellissier Tanon. W3C. 2026년 6월 25일. W3C Working Draft. URL: https://www.w3.org/TR/sparql12-query/
[vc-data-model]
Verifiable Credentials Data Model v2.0. Ivan Herman; Michael Jones; Manu Sporny; Ted Thibodeau Jr; Gabe Cohen. W3C. 2025년 5월 15일. W3C Recommendation. URL: https://www.w3.org/TR/vc-data-model-2.0/

G.2 정보 참고 문헌

[sparql12-federated-query]
SPARQL 1.2 Federated Query. Ruben Taelman; Gregory Williams. W3C. 2026년 4월 23일. W3C Working Draft. URL: https://www.w3.org/TR/sparql12-federated-query/