- From: Peter F. Patel-Schneider <pfpschneider@gmail.com>
- Date: Wed, 13 Apr 2016 13:00:36 -0700
- To: Holger Knublauch <holger@topquadrant.com>, public-data-shapes-wg@w3.org
On 04/12/2016 10:40 PM, Holger Knublauch wrote: > On 13/04/2016 1:11, Peter F. Patel-Schneider wrote: [...] > Do you have an example of a user-defined constraint component by any chance? > How would someone formalize the kind of SPARQL generation without pre-binding? [...] > Holger I have a template-driven version of SHACL. It currently does not handle nested validation reports, however. It does not use pre-binding, instead using textual substitution, which is only needed for IRIs and literals so the problems with substituting blank nodes do not arise. Here are a few templates for core components, including RDFS ranges and shapes that determine whether the component is syntactically correct. sh:datatypeIn a rdf:Property ; a sh:Shape ; rdfs:domain sh:Shape ; rdfs:range rdf:List ; sh:list [ a sh:Shape ; sh:nodeKind sh:IRI ] . shmm:datatypeInShape a sh:Shape ; sh:scopeClass sh:Shape ; sh:propValues ( sh:datatypeIn sh:datatypeIn ) . sh:datatypeIn a sh:ComponentTemplate ; sh:templateMessage "Does not have any required datatype [l(argument)]"@en ; sh:message "Datatypes need to be IRIs"@en ; sh:templatePattern """BIND ( datatype(?this) AS ?dt ) FILTER NOT EXISTS { VALUES ?dt { [l(argument)] } }""" . sh:maxExclusive a rdf:Property ; a sh:Shape ; rdfs:domain sh:Shape ; rdfs:range rdfs:Literal ; sh:nodeKind sh:Literal . shmm:maxExclusiveShape a sh:Shape ; sh:scopeClass sh:Shape ; sh:propValues ( sh:maxExclusive sh:maxExclusive ) . sh:maxExclusive a sh:ComponentTemplate ; sh:templateMessage "Too big, must be less than [argument]"@en ; sh:message "Minimum must be a literal"@en ; sh:templateFilter "( COALESCE(?this < [argument],false) )" . sh:disjoint a rdf:Property ; a sh:Shape ; rdfs:domain sh:Shape ; rdfs:range rdf:List ; sh:list shmm:pathShape ; sh:propValues ((rdf:rest rdf:rest) [ a sh:Shape ; sh:hasValue rdf:nil ] ) . shmm:disjointShape a sh:Shape ; sh:scopeClass sh:Shape ; sh:propValues ( sh:disjoint sh:disjoint ) . sh:disjoint a sh:ComponentTemplate ; sh:propValues (rdf:first [ a sh:Shape ; sh:argumentName "path1" ] ) ; sh:propValues ((rdf:rest rdf:first) [ a sh:Shape ; sh:argumentName "path2"]); sh:templateMessage "Path values not disjoint"@en ; sh:message "Not list of two paths"@en ; sh:templatePattern """?this [p(path1)] ?value1 . ?this [p(path2)] ?value1 .""" . sh:and a rdf:Property ; a sh:Shape ; rdfs:domain sh:Shape ; rdfs:range rdf:List ; sh:list [ a sh:Shape ; sh:class sh:Shape ] . shmm:andShape a sh:Shape ; sh:scopeClass sh:Shape ; sh:propValues ( sh:and sh:and ) . sh:and a sh:ComponentTemplate ; sh:templateMessage "AND"@en ; sh:message "sh:and takes a list of shapes"@en ; sh:templateQuery """SELECT [projection] ?this ?message ?severity ?subject ?property ?object WHERE { { [l(s(argument) " } UNION { ")] } }""" .
Received on Wednesday, 13 April 2016 20:01:05 UTC