diff --git a/shacl12-inf-rules/index.html b/shacl12-inf-rules/index.html index b96c3e2c..ebe3ae0e 100644 --- a/shacl12-inf-rules/index.html +++ b/shacl12-inf-rules/index.html @@ -1,210 +1,147 @@ - - - SHACL 1.2 Inference Rules - - + + - - -
-

This document describes Shapes Constraint Language (SHACL) Inference Rules.

-

- This specification is published by the - Data Shapes Working Group - . -

-
- -
- -
-

Introduction

- -

- This document introduces the concept of Inference Rules for SHACL 1.2, a mechanism for - deriving new RDF triples from existing data using declarative rules defined in shapes - graphs. This extends SHACL’s capabilities beyond validation, enabling reasoning and data - enrichment. -

- -

- This document complements other SHACL 1.2 specifications, such as SHACL Core, by defining - the syntax and semantics of rule-based inference. While SHACL Core focuses on constraint - validation, the Inference Rules specification provides a standardized way to express and - evaluate rules that generate new data. -

- -
-

Terminology

- -

Connect to definitions in RDF 1.2 Concepts.

- - -
-
-

Document Conventions

-

- Some examples in this document use Turtle [[turtle]]. The reader is expected to be familiar with SHACL [[shacl]] and SPARQL - [[sparql-query]]. -

-

Within this document, the following namespace prefix bindings are used:

- - - - - - - - - - - - - - - - - - - - - - - - - -
PrefixNamespace
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#
-

- Throughout the document, color-coded boxes containing RDF graphs in Turtle will appear. These fragments of Turtle documents use the prefix - bindings given above. -

-
        # This box represents a shapes graph
- -
        # This box represents a data graph.
- -
        # This box represents an output results graph
- -

Formal definitions appear in blue boxes:

-
-
TEXTUAL DEFINITIONS
-
          # This box contains textual definitions. 
-
- -

Grey boxes such as this include syntax rules that apply to the shapes graph.

- -

- true - denotes the RDF term - "true"^^xsd:boolean - . - false - denotes the RDF term - "false"^^xsd:boolean - . -

-
- -
- -

TODO

- -

RFC 2119 language should autmatically be inserted here.

- -
-
- -
-

Outline

- -

SHACL rules infer new triples. The input is a data graph and a shape - graph with rules, the output is a graph of inferred triples that do not - occur in the data graph.

- -

Data:

-
-   :A :fatherOf :X .
-   :B :motherOf :X .
-   :C :motherOf :A .
-
-

Rules:

-
-RULE { ?x :childOf ?y } WHERE { ?y :fatherOf ?x }
-RULE { ?x :childOf ?y } WHERE { ?y :motherOf ?x }
-
-RULE { ?x :descendedFrom ?y } WHERE { ?x :childOf ?y }
-RULE { ?x :descendedFrom ?y } WHERE { ?x :childOf ?z . ?z :childOf ?y }
-
- -

will conclude that: `:X` is the `:childOf` `:A` and `:B`, and that `:X` is `:descendedFrom` `:C`

-

- -
- -

Shape Rules Abstract Syntax

- -

The Shape Rules Abstract Syntax

- -

?? Abstract Rules Syntax

- -
-
variable
-
[ sh:var "name" ] -
- -
node expression
-
- Link to shacl12-node-expr#? -- needs to be single value, list arguments. - Often called an expression. -
- -
data block
-
- A data block is a set of triples. - These form extra facts that are included in the inference process. -
- -
triple template
-
- A triple template is 3-tuple where each element is either - a variable or an RDF term (which might be a triple term). - [=Triple templates=] appear in the [=head=] of a [=rule=]. -
- -
triple pattern
-
- A triple pattern is 3-tuple where each element is either a - variable, or an RDF term (which might be a triple term). - [=Triple patterns=] appear in the [=body=] of a [=rule=]. -
- -
condition expression
-
- A condition expression is a function, or functional form, - that evaluates to true or false. - [=Condition expressions=] appear in the [=body=] of a [=rule=]. -
- -
assignment
-
- An assignment is a pair of a variable, called the - assignment variable, and an expression, called the - assignment expression. - [=Assignments=] appear in the [=body=] of a [=rule=]. -
- -
rule
-
- A rule is a pair of a [=rule head=] (often just "head") and - a [=rule body=] (often just "body"). -
- -
rule head
-
- A rule head is a sequence where each element - of the sequence is a [=triple template=]. -
- -
- rule body -
-
- A rule body is a sequence where each element - of the sequence is a [=triple pattern=], a - [=condition expression=], or an [=assignment=]. -
- -
rule set
-
- A rule set is a collection of zero or more [=rules=] - and a collection of zero or more [=data blocks=]. -
-
- -

- In a [=triple pattern=] or a [=triple template=], - position 1 of the tuple is informally called the subject, - position 2 is informally called the predicate, and - position 3 is informally called the object. -

- -
-

Well-formedness Conditions

-

- Well-formedness is a set of conditions on the abstract syntax of - shapes rules. Together, these rules ensure that a [=variable=] in the - [=head=] of a rule has a value defined in the [=body=] of the rule; - that each variable in an condition expression or assignment - expression has a value at the point of evaluation; and that each - assignment in a rule introduces a new variable, - not used earlier in the rule body. -

-

- A [=rule=] is a well-formed rule if all of the following - conditions are met: -

- -

- A [=rule set=] is "well-formed" if and only if all of the [=rules=] of the - rule set are "well-formed". -

-
-
- -
-

Concrete Syntax forms for Shapes Rules

- - -

- The compact syntax has an equivalent RDF syntax form. - Well-formed RDF syntax can be translated to the compact syntax. -

- -

- Change the name away from "compact" and leave that free for SHACL-C. -

- -

Compact:

-
-PREFIX : <http://example/>
-
-DATA { :x :p 1 ; :q 2 . }
-
-RULE { ?x :bothPositive true . } 
-WHERE { ?x :p ?v1  FILTER ( ?v1 > 0 )  ?x :q ?v2  FILTER ( ?v2 > 0 )  }
-
-RULE { ?x :oneIsZero true . } 
-WHERE { ?x :p ?v1 ;  :q ?v2  FILTER ( ( ?v1 = 0 ) || ( ?v2 = 0 ) )  }
-
- -

RDF:

- -
-PREFIX :       <http://example/>
-PREFIX rdf:    <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
-PREFIX sh:     <http://www.w3.org/ns/shacl#>
-PREFIX sparql: <http://www.w3.org/ns/sparql#>
-
-:ruleSet-1
-  rdf:type sh:RuleSet;
-  sh:data (
-    <<( :x :p 1 )>>
-    <<( :x :q 2 )>>
-  );
-  sh:ruleSet (
-    [
-      rdf:type sh:Rule;
-      sh:head (
-        [ sh:subject [ sh:var "x" ] ; sh:predicate :bothPositive; sh:object true ]
-      )
-      sh:body (
-        [ sh:subject [ sh:var "x" ]; sh:predicate :p; sh:object [ sh:var "v1" ] ]
-        [ sh:expr [ sparql:greaterThan ( [ sh:var "v1" ] 0 ) ] ]
-        [ sh:subject [ sh:var "x" ] ; sh:predicate :q; sh:object [ sh:var "v2" ] ]
-        [ sh:expr [ sparql:greaterThan ( [ sh:var "v2" ] 0 ) ] ]
-      );
-    ]
-    [
-      rdf:type sh:Rule;
-      sh:head (
-        [ sh:subject [ sh:var "x" ] ; sh:predicate :oneIsZero ; sh:object true ]
-      )
-      sh:body (
-        [ sh:subject [ sh:var "x" ] ; sh:predicate :p ; sh:object [ sh:var "v1" ] ]
-        [ sh:subject [ sh:var "x" ] ; sh:predicate :q ; sh:object [ sh:var "v2" ] ]
-        [ sh:expr [ sparql:function-or (
-              [ sparql:equals ( [ sh:var "v1" ] 0 ) ]
-              [ sparql:equals ( [ sh:var "v2" ] 0 ) ]
-            ) ]
-        ]
-      );
-    ]
-  ) .
-
- -
-

RDF Rules Syntax

- -
-

Well-formed ness:

-
    -
  • All RDF list are well-formed
  • -
  • exactly one of subject - predicate - object, per body of head - element
  • -
  • Well-formed, single-valued,list-argument node expressions -
  • well-formed abstract syntax -
-
-
-

Describe how the abstract model maps to triples??. - way round - copes with extra triples. - Output is the instance of the abtract model that generates the triples - - but need to define "maximal". -

-
- -
-

Process : accumulators, bottom up/ Walk the structure.

-
    -
  • Collect data triples
  • -
  • Map expressions
  • -
  • Map triple-patterns
  • -
  • Map triple-templates
  • -
  • Map assignments
  • -
  • Map to rule
  • -
  • Rule set
  • -
- -

- All triples not in the syntax are ignored. - No other "sh:" predicates are allowed (??). -

-
- -

@@ link to SHACL constraints

-
- -
-

Compact Rules Syntax

-

The grammar is given below.

-

Mapping the AST to the abstract syntax.

- -
-

Compact Syntax Abbreviations

- -

Additional helpers (short-hand abbreviations) @@which also allow specialised - implementations for basic engines@@.

-
    -
  • `TRANSITIVE`
  • -
  • `SYMMETRIC`
  • -
  • `INVERSE`
  • -
-
-
-
- -
-

Shape Rules Evaluation

- -

- This section defines the outcome of evaluating a rule set on given data. - It does not prescribe the algorithm as the method of implementation. - An implementation can use any algorithm that generates the same outcome. -

- -
-Inputs: data graph G and a rule set RS.
-Output: an RDF graph GI of inferred triples
-
- -

The inferred triples does not include any triple present in the set of triples of G.

- -
-

Evaluation of an expression

- -
-
-Let F(arg1, arg2, ...) be an expression.
-where arg1, arg2 are RDF terms.
-
-Let [x/row] be
-    if x is an RDF term, the [x/row] is x
-    if x is a variable then [x/row] is the value of x in the row 
-    ## By well-formedness, it is an error if x is not in the row.
-
-eval(F(expr1, expr2), row) = F(eval(expr1, row), eval(expr2, row))
-eval(FF(expr1, expr2) , row) = ... things that are not functions like IF
-
-
- -
-

Evaluation of a rule

-
-let R be a well-formed rule.
-let rule R = (head, body) where
-             H is the sequence of triple templates in the head
-             B is the sequence of triple patterns, condition expressions,
-                and assignments in the body
-
-let R : map variable to RDF term as a set of pairs (variable, RDF term)
-
-# "solution"
-let T :list of B
-
-Initial T = empty list
-
-# Evaluate rule body
-for each rule element rElt:
-    if rElt is a triple pattern:
-        T1 = empty list
-    for each row in T:
-      T1 = empty list
-      for each matches m set of (var,term)
-          row1 = row union (var, term)
-          add row1 to T1
-          endfor
-    T = T1
-    endif   
-
-    if rElt is a condition expression F:
-        T1 = empty list
-        for each row in T:
-            if ( eval(F,B) )
-                add R to T1
-                endif   
-        endfor
-    T = T1
-    endif
-
-    if rElt is an assignment(V, expr)
-        T1 = empty list
-        for each row in T:
-            let x = eval(expr, row)
-            let R1 = R union (V, x)
-            add R1 to T1
-            endfor
-        T = T1
-        endif
-    endfor
-
-# Evaluate rule head
-let H = empty set
-for each R in T:
-    Let S = set of triples obtained by replacing variables 
-            in the triple templates of the head with values from R
-    define [head(R)/row]
-    H = H union S
-    endfor
-
-result eval(R, G) is H
-
-
-

Note that `H` may contain triples that are also in the data grapoh.

-
- -
-

Evaluation of a Rule Set

- -
-Let G be the input RDF graph.
-Let I be the set of triples generated by evaluation
-Let RS be a rule set
-Let finished = false
-
-while !finished:
-    finished = true
-    foreach rule in RS
-        let GI = G union I
-        let X = eval(rule, GI)
-        let Y = those triples in X that are not in GI
-        if Y is not empty:
-            finished = false
-            endif
-        let I = Y union I
-        endfor
-    endwhile
-
-result is GI
-
-
-
- - -
-

Shapes Rules Language Grammar

- -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
[1]  RuleSet  ::=  ( Prologue ( Rule | Data ) )*
[2]  Rule  ::=  Rule1 | Rule2 | Rule3 | Declaration
[3]  Rule1  ::=  'RULE' HeadTemplate 'WHERE' BodyPattern
[4]  Rule2  ::=  'IF' BodyPattern 'THEN' HeadTemplate
[5]  Rule3  ::=  HeadTemplate ':-' BodyPattern
[6]  Declaration  ::=  ( 'TRANSITIVE' '(' iri ')' | 'SYMMETRIC' '(' iri ')' | 'INVERSE' '(' iri ',' iri ')' )
[7]  Data  ::=  'DATA' TriplesTemplateBlock
[8]  HeadTemplate  ::=  TriplesTemplateBlock
[9]  BodyPattern  ::=  '{' BodyPattern1? Assignment* '}'
[10]  BodyPattern1  ::=  ( Filter | BodyPatternSub ( Filter BodyPatternSub? )* )
[11]  BodyPatternSub  ::=  TriplesBlock
[12]  Prologue  ::=  ( BaseDecl | PrefixDecl | VersionDecl | ImportsDecl )*
[13]  BaseDecl  ::=  'BASE' IRIREF
[14]  PrefixDecl  ::=  'PREFIX' PNAME_NS IRIREF
[15]  VersionDecl  ::=  'VERSION' VersionSpecifier
[16]  VersionSpecifier  ::=  STRING_LITERAL1 | STRING_LITERAL2
[17]  ImportsDecl  ::=  'IMPORTS' iri
[18]  TriplesTemplateBlock  ::=  '{' TriplesTemplate? '}'
[19]  TriplesTemplate  ::=  TriplesSameSubject ( '.' TriplesTemplate? )?
[20]  TriplesBlock  ::=  TriplesSameSubjectPath ( '.' TriplesBlock? )?
[21]  ReifiedTripleBlock  ::=  ReifiedTriple PropertyList
[22]  ReifiedTripleBlockPath  ::=  ReifiedTriple PropertyListPath
[23]  Assignment  ::=  Bind
[24]  Bind  ::=  'BIND' '(' Expression 'AS' Var ')'
[25]  Let  ::=  'LET' '(' Var ':=' Expression ')'
[26]  Reifier  ::=  '~' VarOrReifierId?
[27]  VarOrReifierId  ::=  Var | iri | BlankNode
[28]  Filter  ::=  'FILTER' Constraint
[29]  Constraint  ::=  BrackettedExpression | BuiltInCall | FunctionCall
[30]  FunctionCall  ::=  iri ArgList
[31]  ArgList  ::=  NIL | '(' Expression ( ',' Expression )* ')'
[32]  ExpressionList  ::=  NIL | '(' Expression ( ',' Expression )* ')'
[33]  TriplesSameSubject  ::=  VarOrTerm PropertyListNotEmpty | TriplesNode PropertyList | ReifiedTripleBlock
[34]  PropertyList  ::=  PropertyListNotEmpty?
[35]  PropertyListNotEmpty  ::=  Verb ObjectList ( ';' ( Verb ObjectList )? )*
[36]  Verb  ::=  VarOrIri | 'a'
[37]  ObjectList  ::=  Object ( ',' Object )*
[38]  Object  ::=  GraphNode Annotation
[39]  TriplesSameSubjectPath  ::=  VarOrTerm PropertyListPathNotEmpty | TriplesNodePath PropertyListPath | ReifiedTripleBlockPath
[40]  PropertyListPath  ::=  PropertyListPathNotEmpty?
[41]  PropertyListPathNotEmpty  ::=  ( VerbPath | VerbSimple ) ObjectListPath ( ';' ( ( VerbPath | VerbSimple ) ObjectListPath )? )*
[42]  VerbPath  ::=  Path
[43]  VerbSimple  ::=  Var
[44]  ObjectListPath  ::=  ObjectPath ( ',' ObjectPath )*
[45]  ObjectPath  ::=  GraphNodePath AnnotationPath
[46]  Path  ::=  PathSequence
[47]  PathSequence  ::=  PathEltOrInverse ( '/' PathEltOrInverse )*
[48]  PathEltOrInverse  ::=  PathElt | '^' PathElt
[49]  PathElt  ::=  PathPrimary
[50]  PathPrimary  ::=  iri | 'a' | '(' Path ')'
[51]  TriplesNode  ::=  Collection | BlankNodePropertyList
[52]  BlankNodePropertyList  ::=  '[' PropertyListNotEmpty ']'
[53]  TriplesNodePath  ::=  CollectionPath | BlankNodePropertyListPath
[54]  BlankNodePropertyListPath  ::=  '[' PropertyListPathNotEmpty ']'
[55]  Collection  ::=  '(' GraphNode+ ')'
[56]  CollectionPath  ::=  '(' GraphNodePath+ ')'
[57]  AnnotationPath  ::=  ( Reifier | AnnotationBlockPath )*
[58]  AnnotationBlockPath  ::=  '{|' PropertyListPathNotEmpty '|}'
[59]  Annotation  ::=  ( Reifier | AnnotationBlock )*
[60]  AnnotationBlock  ::=  '{|' PropertyListNotEmpty '|}'
[61]  GraphNode  ::=  VarOrTerm | TriplesNode | ReifiedTriple
[62]  GraphNodePath  ::=  VarOrTerm | TriplesNodePath | ReifiedTriple
[63]  VarOrTerm  ::=  Var | iri | RDFLiteral | NumericLiteral | BooleanLiteral | BlankNode | NIL | TripleTerm
[64]  ReifiedTriple  ::=  '<<' ReifiedTripleSubject Verb ReifiedTripleObject Reifier? '>>'
[65]  ReifiedTripleSubject  ::=  Var | iri | RDFLiteral | NumericLiteral | BooleanLiteral | BlankNode | ReifiedTriple
[66]  ReifiedTripleObject  ::=  Var | iri | RDFLiteral | NumericLiteral | BooleanLiteral | BlankNode | ReifiedTriple | TripleTerm
[67]  TripleTerm  ::=  '<<(' TripleTermSubject Verb TripleTermObject ')>>'
[68]  TripleTermSubject  ::=  Var | iri | RDFLiteral | NumericLiteral | BooleanLiteral | BlankNode
[69]  TripleTermObject  ::=  Var | iri | RDFLiteral | NumericLiteral | BooleanLiteral | BlankNode | TripleTerm
[70]  TripleTermData  ::=  '<<(' TripleTermDataSubject ( iri | 'a' ) TripleTermDataObject ')>>'
[71]  TripleTermDataSubject  ::=  iri | RDFLiteral | NumericLiteral | BooleanLiteral
[72]  TripleTermDataObject  ::=  iri | RDFLiteral | NumericLiteral | BooleanLiteral | TripleTermData
[73]  VarOrIri  ::=  Var | iri
[74]  Var  ::=  VAR1 | VAR2
[75]  Expression  ::=  ConditionalOrExpression
[76]  ConditionalOrExpression  ::=  ConditionalAndExpression ( '||' ConditionalAndExpression )*
[77]  ConditionalAndExpression  ::=  ValueLogical ( '&&' ValueLogical )*
[78]  ValueLogical  ::=  RelationalExpression
[79]  RelationalExpression  ::=  NumericExpression ( '=' NumericExpression | '!=' NumericExpression | '<' NumericExpression | '>' NumericExpression | '<=' NumericExpression | '>=' NumericExpression | 'IN' ExpressionList | 'NOT' 'IN' ExpressionList )?
[80]  NumericExpression  ::=  AdditiveExpression
[81]  AdditiveExpression  ::=  MultiplicativeExpression ( '+' MultiplicativeExpression | '-' MultiplicativeExpression | ( NumericLiteralPositive | NumericLiteralNegative ) ( ( '*' UnaryExpression ) | ( '/' UnaryExpression ) )* )*
[82]  MultiplicativeExpression  ::=  UnaryExpression ( '*' UnaryExpression | '/' UnaryExpression )*
[83]  UnaryExpression  ::=    '!' PrimaryExpression
| '+' PrimaryExpression
| '-' PrimaryExpression
| PrimaryExpression
[84]  PrimaryExpression  ::=  BrackettedExpression | BuiltInCall | iriOrFunction | RDFLiteral | NumericLiteral | BooleanLiteral | Var | ExprTripleTerm
[85]  ExprTripleTerm  ::=  '<<(' ExprTripleTermSubject Verb ExprTripleTermObject ')>>'
[86]  ExprTripleTermSubject  ::=  iri | RDFLiteral | NumericLiteral | BooleanLiteral | Var
[87]  ExprTripleTermObject  ::=  iri | RDFLiteral | NumericLiteral | BooleanLiteral | Var | ExprTripleTerm
[88]  BrackettedExpression  ::=  '(' Expression ')'
[89]  BuiltInCall  ::=    'STR' '(' Expression ')'
| 'LANG' '(' Expression ')'
| 'LANGMATCHES' '(' Expression ',' Expression ')'
| 'LANGDIR' '(' Expression ')'
| 'DATATYPE' '(' Expression ')'
| 'BOUND' '(' Var ')'
| 'IRI' '(' Expression ')'
| 'URI' '(' Expression ')'
| 'BNODE' ( '(' Expression ')' | NIL )
| 'RAND' NIL
| 'ABS' '(' Expression ')'
| 'CEIL' '(' Expression ')'
| 'FLOOR' '(' Expression ')'
| 'ROUND' '(' Expression ')'
| 'CONCAT' ExpressionList
| 'SUBSTR' '(' Expression ',' Expression ( ',' Expression )? ')'
| 'STRLEN' '(' Expression ')'
| 'REPLACE' '(' Expression ',' Expression ',' Expression ( ',' Expression )? ')'
| 'UCASE' '(' Expression ')'
| 'LCASE' '(' Expression ')'
| 'ENCODE_FOR_URI' '(' Expression ')'
| 'CONTAINS' '(' Expression ',' Expression ')'
| 'STRSTARTS' '(' Expression ',' Expression ')'
| 'STRENDS' '(' Expression ',' Expression ')'
| 'STRBEFORE' '(' Expression ',' Expression ')'
| 'STRAFTER' '(' Expression ',' Expression ')'
| 'YEAR' '(' Expression ')'
| 'MONTH' '(' Expression ')'
| 'DAY' '(' Expression ')'
| 'HOURS' '(' Expression ')'
| 'MINUTES' '(' Expression ')'
| 'SECONDS' '(' Expression ')'
| 'TIMEZONE' '(' Expression ')'
| 'TZ' '(' Expression ')'
| 'NOW' NIL
| 'UUID' NIL
| 'STRUUID' NIL
| 'MD5' '(' Expression ')'
| 'SHA1' '(' Expression ')'
| 'SHA256' '(' Expression ')'
| 'SHA384' '(' Expression ')'
| 'SHA512' '(' Expression ')'
| 'COALESCE' ExpressionList
| 'IF' '(' Expression ',' Expression ',' Expression ')'
| 'STRLANG' '(' Expression ',' Expression ')'
| 'STRLANGDIR' '(' Expression ',' Expression ',' Expression ')'
| 'STRDT' '(' Expression ',' Expression ')'
| 'sameTerm' '(' Expression ',' Expression ')'
| 'isIRI' '(' Expression ')'
| 'isURI' '(' Expression ')'
| 'isBLANK' '(' Expression ')'
| 'isLITERAL' '(' Expression ')'
| 'isNUMERIC' '(' Expression ')'
| 'hasLANG' '(' Expression ')'
| 'hasLANGDIR' '(' Expression ')'
| 'REGEX' '(' Expression ',' Expression ( ',' Expression )? ')'
| 'isTRIPLE' '(' Expression ')'
| 'TRIPLE' '(' Expression ',' Expression ',' Expression ')'
| 'SUBJECT' '(' Expression ')'
| 'PREDICATE' '(' Expression ')'
| 'OBJECT' '(' Expression ')'
[90]  iriOrFunction  ::=  iri ArgList?
[91]  RDFLiteral  ::=  String ( LANG_DIR | '^^' iri )?
[92]  NumericLiteral  ::=  NumericLiteralUnsigned | NumericLiteralPositive | NumericLiteralNegative
[93]  NumericLiteralUnsigned  ::=  INTEGER | DECIMAL | DOUBLE
[94]  NumericLiteralPositive  ::=  INTEGER_POSITIVE | DECIMAL_POSITIVE | DOUBLE_POSITIVE
[95]  NumericLiteralNegative  ::=  INTEGER_NEGATIVE | DECIMAL_NEGATIVE | DOUBLE_NEGATIVE
[96]  BooleanLiteral  ::=  'true' | 'false'
[97]  String  ::=  STRING_LITERAL1 | STRING_LITERAL2 | STRING_LITERAL_LONG1 | STRING_LITERAL_LONG2
[98]  iri  ::=  IRIREF | PrefixedName
[99]  PrefixedName  ::=  PNAME_LN | PNAME_NS
[100]  BlankNode  ::=  BLANK_NODE_LABEL | ANON
-
-

Productions for terminals:

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + .parameter-context { + font-weight: bold; + font-size: 16px; + } - - - - - - + .parameters { + font-weight: bold; + font-size: 16px; + } - - - - - - + .part-header { + font-weight: bold; + } - - - - - - + .syntax { + border-left-style: solid; + border-left-width: 0.5em; + border-color: #d0d0d0; + margin-bottom: 16px; + padding: 0.5em 1em; + background-color: #f6f6f6; + } - - - - - - + .syntax-rule-id { + padding-right: 10px; + } - - - - - - + .syntax-rule-id-a { + white-space: nowrap; + } - - - - - - + .validator-id-a { + font-weight: bold; + white-space: nowrap; + } - - - - - - + .term { + font-style: italic; + } - - - - - - -
[101]  IRIREF  ::=  '<' ([^<>"{}|^`\]-[#x00-#x20])* '>'
[102]  PNAME_NS  ::=  PN_PREFIX? ':'
[103]  PNAME_LN  ::=  PNAME_NS PN_LOCAL
[104]  BLANK_NODE_LABEL  ::=  '_:' ( PN_CHARS_U | [0-9] ) ((PN_CHARS|'.')* PN_CHARS)?
[105]  VAR1  ::=  '?' VARNAME
[106]  VAR2  ::=  '$' VARNAME
[107]  LANG_DIR  ::=  '@' [a-zA-Z]+ ('-' [a-zA-Z0-9]+)* ('--' [a-zA-Z]+)?
[108]  INTEGER  ::=  [0-9]+
[109]  DECIMAL  ::=  [0-9]* '.' [0-9]+
[110]  DOUBLE  ::=  ( ([0-9]+ ('.'[0-9]*)? ) | ( '.' ([0-9])+ ) ) [eE][+-]?[0-9]+
[111]  INTEGER_POSITIVE  ::=  '+' INTEGER
[112]  DECIMAL_POSITIVE  ::=  '+' DECIMAL
[113]  DOUBLE_POSITIVE  ::=  '+' DOUBLE
[114]  INTEGER_NEGATIVE  ::=  '-' INTEGER
[115]  DECIMAL_NEGATIVE  ::=  '-' DECIMAL
[116]  DOUBLE_NEGATIVE  ::=  '-' DOUBLE
[117]  STRING_LITERAL1  ::=  "'" ( ([^#x27#x5C#xA#xD]) | ECHAR )* "'"
[118]  STRING_LITERAL2  ::=  '"' ( ([^#x22#x5C#xA#xD]) | ECHAR )* '"'
[119]  STRING_LITERAL_LONG1  ::=  "'''" ( ( "'" | "''" )? ( [^'\] | ECHAR ) )* "'''"
[120]  STRING_LITERAL_LONG2  ::=  '"""' ( ( '"' | '""' )? ( [^"\] | ECHAR ) )* '"""'
[121]  ECHAR  ::=  '\' [tbnrf\"']
[122]  NIL  ::=  '(' WS* ')'
[123]  WS  ::=  #x20 | #x9 | #xD | #xA
[124]  ANON  ::=  '[' WS* ']'
[125]  PN_CHARS_BASE  ::=  [A-Z] | [a-z] | [#x00C0-#x00D6] | [#x00D8-#x00F6] | [#x00F8-#x02FF] | [#x0370-#x037D] | [#x037F-#x1FFF] | [#x200C-#x200D] | [#x2070-#x218F] | [#x2C00-#x2FEF] | [#x3001-#xD7FF] | [#xF900-#xFDCF] | [#xFDF0-#xFFFD] | [#x10000-#xEFFFF]
[126]  PN_CHARS_U  ::=  PN_CHARS_BASE | '_'
[127]  VARNAME  ::=  ( PN_CHARS_U | [0-9] ) ( PN_CHARS_U | [0-9] | #x00B7 | [#x0300-#x036F] | [#x203F-#x2040] )*
[128]  PN_CHARS  ::=  PN_CHARS_U | '-' | [0-9] | #x00B7 | [#x0300-#x036F] | [#x203F-#x2040]
[129]  PN_PREFIX  ::=  PN_CHARS_BASE ((PN_CHARS|'.')* PN_CHARS)?
[130]  PN_LOCAL  ::=  (PN_CHARS_U | ':' | [0-9] | PLX ) ((PN_CHARS | '.' | ':' | PLX)* (PN_CHARS | ':' | PLX) )?
[131]  PLX  ::=  PERCENT | PN_LOCAL_ESC
[132]  PERCENT  ::=  '%' HEX HEX
[133]  HEX  ::=  [0-9] | [A-F] | [a-f]
[134]  PN_LOCAL_ESC  ::=  '\' ( '_' | '~' | '.' | '-' | '!' | '$' | '&' | "'" | '(' | ')' | '*' | '+' | ',' | ';' | '=' | '/' | '?' | '#' | '@' | '%' )
-
- -
+ .term-def-header { + font-style: italic; + font-weight: bold; + } -
-

Security Considerations

-

TODO

-
+ .term-table { + border-collapse: collapse; + border-color: #000000; + margin: 16px; + } -
-

Privacy Considerations

-

TODO

-
+ .term-table td, + th { + border-width: 1px; + border-style: solid; + padding: 5px; + } -
-

Internationalization Considerations

-

TODO

-
+ .todo { + color: red; + } -
-

Acknowledgements

-

Many people contributed to this document, including members of the RDF Data Shapes Working Group.

-
+ /* example pre taken / adapted from R2RML */ + pre.example-shapes, + pre.example-data, + pre.example-results, + pre.example-other, + pre.example-sparql { + margin-left: 0; + padding: 0 2em; + margin-top: 1.5em; + padding: 1em; + white-space: pre !important; + } + pre.example-shapes:before, + pre.example-data:before, + pre.example-results:before, + pre.example-other:before, + pre.example-sparql:before { + background: white; + display: block; + font-family: sans-serif; + margin: -1em 0 0.4em -1em; + padding: 0.2em 1em; + } + pre.example-shapes { + background: #deb; + } + pre.example-shapes, + pre.example-shapes:before { + border: 1px solid #bbb; + } + pre.example-shapes:before { + color: #888; + content: "Example shapes graph"; + width: 13em; + } + pre.example-data { + background: #eeb; + } + pre.example-data, + pre.example-data:before { + border: 1px solid #cc9; + } + pre.example-data:before { + color: #996; + content: "Example data graph"; + width: 13em; + } + pre.example-results:before { + color: #797; + content: "Example validation results"; + width: 13em; + } + pre.example-other { + background: #bed; + } + pre.example-other, + pre.example-other:before { + border: 1px solid #ddd; + } + pre.example-other:before { + color: #888; + content: "Example"; + width: 13em; + } + pre.example-sparql { + background: #bed; + } + pre.example-sparql, + pre.example-sparql:before { + border: 1px solid #ddd; + } + pre.example-sparql:before { + color: #888; + content: "Example SPARQL"; + width: 13em; + } + .example-results { + background: #edb; + } + .example-results, + .example-results:before, + .example-results th, + .example-results td { + border: 1px solid #cca; + } -
+ /* our syntax menu for switching */ + div.syntaxmenu { + border: 1px dotted black; + padding: 0.5em; + margin: 1em; + } -
- -
- + @media print { + div.syntaxmenu { + display: none; + } + } + + + +
+

This document describes Shapes Constraint Language (SHACL) Inference Rules.

+

+ This specification is published by the + Data Shapes Working Group + . +

+
+ +
+ +
+

Introduction

+

Inference Rules

+ +
+

Terminology

+ +

Connect to definitions in RDF 1.2 Concepts.

+ +

+ The terminology used throughout this document is consistent with the definitions in the main SHACL [[shacl]] specification, which references + terms from RDF [[rdf11-concepts]]. This includes the terms + + binding + + , + + blank node + + , + + conformance + + , + + constraint + + , + + constraint component + + , + + data graph + + , + + datatype + + , + + failure + + , + + focus node + + , + + RDF graph + + , + ill-formed + , + IRI + , + + literal + + , + + local name + + , + + member + + , + + node + + , + + node shape + + , + + object + + , + + parameter + + , + + pre-binding + + , + + predicate + + , + + property path + + , + + property shape + + , + + RDF term + + , + + SHACL instance + + , + + SHACL list + + , + + SHACL subclass + + , + + shape + + , + + shapes graph + + , + + solution + + , + + subject + + , + + target + + , + + triple + + , + validation + , + + validation report + + , + + validation result + + , + + validator + + , + + value + + , + + value node + + . +

+
+
+

Document Conventions

+

+ Some examples in this document use Turtle [[turtle]]. The reader is expected to be familiar with SHACL [[shacl]] and SPARQL + [[sparql-query]]. +

+

Within this document, the following namespace prefix bindings are used:

+ + + + + + + + + + + + + + + + + + + + + + + + + +
PrefixNamespace
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#
+

+ Throughout the document, color-coded boxes containing RDF graphs in Turtle will appear. These fragments of Turtle documents use the prefix + bindings given above. +

+
        # This box represents a shapes graph
+ +
        # This box represents a data graph.
+ +
        # This box represents an output results graph
+ +

Formal definitions appear in blue boxes:

+
+
TEXTUAL DEFINITIONS
+
          # This box contains textual definitions. 
+
+ +

Grey boxes such as this include syntax rules that apply to the shapes graph.

+ +

+ true + denotes the RDF term + "true"^^xsd:boolean + . + false + denotes the RDF term + "false"^^xsd:boolean + . +

+
+
+

TODO

+
+
+ +
+

Section

+

Content.

+
+ +
+

Summary of Syntax Rules from this Document

+
+ +
+

Security Considerations

+

TODO

+
+ +
+

Privacy Considerations

+

TODO

+
+ +
+

Acknowledgements

+

Many people contributed to this document, including members of the RDF Data Shapes Working Group.

+
+ +
+

Internationalization Considerations

+

TODO

+
+ +
+ +
+ +
+ diff --git a/shacl12-node-expr/index.html b/shacl12-node-expr/index.html index 0200737a..91f4e476 100644 --- a/shacl12-node-expr/index.html +++ b/shacl12-node-expr/index.html @@ -669,7 +669,7 @@

Getting started with Node Expressions

sh:datatype xsd:integer ; sh:values [ shnex:count [ - shnex:path ex:employee ; + shnex:pathValues ex:employee ; ] ] . @@ -860,13 +860,13 @@

List Parameter Functions

ex:coalesce ( [ # This is a path expression that is expected to return zero or one values - shnex:path ex:fullName ; + shnex:pathValues ex:fullName ; ] [ ex:concat ( - [ shnex:path ex:firstName ] # Path expression with at most one value + [ shnex:pathValues ex:firstName ] # Path expression with at most one value " " # A constant literal expression - [ shnex:path ex:lastName ] # Path expression with at most one value + [ shnex:pathValues ex:lastName ] # Path expression with at most one value ) ] ) @@ -1037,10 +1037,10 @@

List Expressions

The following example declares a property for instances of rdfs:Class where the values are derived from the values of the path rdfs:subClassOf* but with the constants from the list ( owl:Thing rdfs:Resource ) removed using - shnex:minus. + shnex:remove.

-