- From: Gary Murphy <gary@schemaapp.com>
- Date: Wed, 20 Mar 2019 12:48:36 -0400
- To: Irene Polikoff <irene@topquadrant.com>
- Cc: public-shacl@w3.org
- Message-ID: <CADnyxpsX2fUV0c0Ui_8xMUv54B_Wy8wOn612tHg7UMx5nG03Gg@mail.gmail.com>
using nested NodeShapes called in with sh:node gives a result that is very
close, but lacks clarity in the report:
Given our old friend Bob:
ex:Bob
a schema:Person ;
schema:givenName "Robert" ;
schema:familyName "Junior" ;
schema:birthDate "1971-07-07x"^^xsd:string ;
schema:deathDate "1968-09-10"^^xsd:date ;
and the shacl rules
schema:DateTimeNodeShape
a sh:NodeShape ;
sh:or (
[ sh:datatype xsd:dateTime ]
[ sh:datatype xsd:date ]
[
sh:datatype xsd:string ;
sh:pattern
"^\\d{4}-\\d{2}-\\d{2}(T\\d{2}:\\d{2}:\\d{2}[0-9+Z-]*)?$" ;
]
) ;
sh:name "dateTime" ;
sh:message "date must be xsd:date, xsd:dateTime or xsd:string in ISO
format, eg 2018-12-18T12:00:00.000+0500" ;
sh:severity sh:Warning ;
.
schema:PersonShape
a sh:NodeShape ;
sh:targetClass schema:Person ;
sh:property [
sh:path schema:birthDate ;
sh:node schema:DateTimeNodeShape ;
sh:lessThan schema:deathDate ;
sh:maxCount 1 ;
] ;
.
A violation of sh:Warning in the DateTimeNodeShape and it's sh:message are
ignored, and the UI would receive the unhelpful report
[
a sh:ValidationResult ;
sh:resultSeverity sh:Violation ;
sh:sourceConstraintComponent sh:NodeConstraintComponent ;
sh:sourceShape _:n396 ;
sh:focusNode <http://example.org/ns#Bob> ;
sh:value "1971-07-07x" ;
sh:resultPath schema:birthDate ;
sh:resultMessage "Value does not have shape schema:DateTimeNodeShape" ;
] .
ps -- thanks for spotting the +-Z slip in the regex; my datasets never
crossed this, but clearly +Z- is what was meant ;)
On Wed, Mar 20, 2019 at 11:43 AM Gary Murphy <gary@schemaapp.com> wrote:
> Thanks -- I think NodeShape is probably what I'm needing as this allows
> segmenting the sh:message apart from the rest of the rules, and for
> UI-building purposes, avoids duplicate sh:property blocks
>
> On Tue, Mar 19, 2019 at 8:51 PM Irene Polikoff <irene@topquadrant.com>
> wrote:
>
>> A PropertyShape must have sh:path - see
>> https://www.w3.org/TR/shacl/#property-shapes
>>
>> If there is no {myshape:DateShape sh:path ?something} triple, you have an
>> invalid shapes graph.
>>
>> You could create a node shape defining conditions on the value. Then, use
>> it like this:
>>
>> myshape:PersonShape a sh:NodeShape ;
>> sh:property [
>> sh:path ex:birthDate ;
>> sh:node myshape:DateShape;
>> sh:lessThan ex:deathDate ;
>> sh:message "Birth date must be before death date unless time
>> travel is possible” .}
>>
>> In this example, myshape:DateShape is a node shape. For example:
>>
>> myshape:DateShape a sh:NodeShape ;
>> sh:datatype xsd:string ;
>>
>> sh:pattern "^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}[0-9.+-Z]*$”.
>>
>>
>> You can also use sh:or in the node shape, but your syntax is incorrect.
>> It would be something like
>>
>> myshape:DateShape a sh:NodeShape ;
>> sh:or (
>> [
>> sh:datatype xsd:dateTime;
>> ]
>> [
>> sh:datatype xsd:string ;
>>
>> sh:pattern "^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}[0-9.+-Z]*$”;
>> ]
>> ) .
>>
>> Although, I think your sh:pattern value may have some syntax issues as
>> well.
>>
>>
>> On Mar 19, 2019, at 2:17 PM, Gary Murphy <gary@schemaapp.com> wrote:
>>
>> Seeking some guidance with a frequent pattern: I have several properties
>> which are all constrained to xsd:dateTime or xsd:string with a regex for
>> ISO dates, but each of these properties also has other constraints such
>> as maxCount = 1
>>
>> So for a familiar example, in Person, for birthDate, I have these
>> alternatives in sh:or clauses, plus I have the maxCount and the sh:lessThan
>> deathDate rules, but when the data value is the wrong type, the violation
>> takes the sh:message for the entire test, reporting only that the
>> sh:OrConstraintComponent was violated and then a second violation for
>> sh:LessThanConstraintComponent.
>>
>> I can of course split these into successive sh:property rules for the
>> same sh:path and each with it's own sh:message, but the same datatype
>> constraints apply also to deathDate and every other date value in my
>> graph. I'd far prefer to define the rules for all date-like paths in one
>> place.
>>
>> Is it possible to define a generic "value shape" where the rules are
>> applied to the current path rather than to a path defined in the shape
>> itself?
>>
>> something like
>>
>> myshape:DateShape a sh:PropertyShape ;
>> [ sh:datatype xsd:dateTime ]
>> [ sh:datatype xsd:date ]
>> [ sh:datatype xsd:string ;
>> sh:pattern
>> "^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}[0-9.+-Z]*$" ;
>> ]
>> ) ;
>> sh:name "dateTime" ;
>> gist:start "2017-12-18T17:00:00Z"^^xsd:dateTime ;
>> sh:message "Date must be xsd:date xsd:dateTime or string in ISO
>> format, eg 2018-12-18T12:00:00.000+0500" .
>>
>> myshape:PersonShape a sh:NodeShape ;
>> sh:property [
>> sh:path ex:birthDate ;
>> sh:??? myshape:DateShape ; # can this be done?
>> sh:lessThan ex:deathDate ;
>> sh:message "Birth date must be before death date unless time
>> travel is possible" .
>>
>> Is there any mechanism in shacl to apply a path-agnostic shape?
>> --
>> Gary Lawrence Murphy <gary@schemaapp.com> - Hunch Manifest, 15 Wyndham N
>> 'C', Guelph
>>
>>
>>
>
> --
> Gary Lawrence Murphy <gary@schemaapp.com> - Hunch Manifest, 15 Wyndham N
> 'C', Guelph
>
--
Gary Lawrence Murphy <gary@schemaapp.com> - Hunch Manifest, 15 Wyndham N
'C', Guelph
Received on Wednesday, 20 March 2019 16:49:15 UTC