- From: Peter F. Patel-Schneider <pfpschneider@gmail.com>
- Date: Tue, 10 May 2016 13:27:36 -0700
- To: Holger Knublauch <holger@topquadrant.com>, "public-data-shapes-wg@w3.org" <public-data-shapes-wg@w3.org>
Why not also allow any component that is currently allowed in node constraints
to occur in shapes?
This permits
ex:MyShape a sh:Shape ;
sh:or (
[ a sh:NodeConstraint ;
sh:datatype xsd:string ;
] ;
]
[ a sh:NodeConstraint ;
sh:class schema:Address ;
]
) .
instead of the current
ex:MyShape a sh:Shape ;
sh:constraint [
sh:or (
[ a sh:Shape ;
sh:constraint [
a sh:NodeConstraint ;
sh:datatype xsd:string ;
] ;
]
[ a sh:Shape ;
sh:constraint [
a sh:NodeConstraint ;
sh:class schema:Address ;
]
]
)
] .
peter
On 05/08/2016 11:16 PM, Holger Knublauch wrote:
> I have meanwhile had a bit more time for this topic and here is my updated
> proposal (which is also much simpler than before).
>
> Several WG members supported the idea of allowing constraints to be used as
> values in places such as sh:or. I was asked to make some specific suggestions
> on what would need to be changed in the spec, so that the following syntax
> options would behave identically. (Both scenarios state that the values of
> schema:address must be string literals or instances of schema:Address):
>
> a) Currently supported: sh:or can only be used with sh:NodeConstraints and
> operands of sh:or must be shapes
>
> ex:MyShape
> a sh:Shape ;
> sh:constraint [
> sh:or (
> [ a sh:Shape ;
> sh:property [
> sh:predicate schema:address ;
> sh:datatype xsd:string ;
> ] ;
> ]
> [ a sh:Shape ;
> sh:property [
> sh:predicate schema:address ;
> sh:class schema:Address ;
> ] ;
> ]
> )
> ]
>
> which lacks on multiple fronts - it is too verbose and also forces repetition
> of the predicate.
>
> b) Proposed: generalize sh:or and values of sh:or may be sh:NodeConstraints:
>
> ex:MyShape
> a sh:Shape ;
> sh:property [
> sh:predicate schema:address ;
> sh:or (
> [ sh:datatype xsd:string ]
> [ sh:class schema:Address ]
> )
> ]
>
> In this proposal, the members of the sh:or List may be sh:NodeConstraints or
> sh:Shapes.
>
> Required changes (all incremental to current spec):
>
> 1) Rename sh:hasShape from sh:hasShape(?node, ?shape, ?shapesGraph) to
>
> sh:validateNode(?node, ?shapeOrConstraint, ?shapesGraph)
>
> The algorithm would be changed to
>
> a) if ?shapeOrConstraint rdf:type sh:Shape, then behave as currently
> b) otherwise, assume rdf:type sh:NodeConstraint
> c) report failure if the node has rdf:type that is neither sh:Shape nor
> sh:NodeConstraint.
>
> The name sh:validateNode is better than sh:hasShape because it may also return
> unbound. I have no strong opinion whether we should assume sh:Shape or
> sh:NodeConstraint as default here - it really depends on what case we consider
> more frequent and what kind of syntactic sugar we want to provide.
>
> 2) Generalize sh:or to also have contexts: sh:PropertyConstraint and
> sh:InversePropertyConstraint. The validators are almost identical to the
> current one, simply calling sh:validateNode on each value.
>
> The same approach would work for sh:and and sh:not. I guess also for
> sh:valueShape if that's desirable.
>
> Regards,
> Holger
>
>
> On 5/05/2016 22:21, Holger Knublauch wrote:
>> Too quick: I believe there is a glitch in the algorithm below and I need to
>> think more about the implementation details. As stated it would walk the
>> properties of a property value, which is incorrect. Maybe the list values
>> need to be interpreted as sh:NodeConstraints only. Please ignore for now.
>>
>> Holger
>>
>>
>> On 5/05/2016 12:49, Holger Knublauch wrote:
>>> Several WG members supported the idea of allowing constraints to be used as
>>> values in places such as sh:or. I was asked to make some specific
>>> suggestions on what would need to be changed in the spec, so that the
>>> following syntax options would behave identically. (Both scenarios state
>>> that the values of schema:address must be string literals or instances of
>>> schema:Address):
>>>
>>> a) Currently supported: sh:or can only be used with sh:NodeConstraints and
>>> operands of sh:or must be shapes
>>>
>>> ex:MyShape
>>> a sh:Shape ;
>>> sh:constraint [
>>> sh:or (
>>> [ a sh:Shape ;
>>> sh:property [
>>> sh:predicate schema:address ;
>>> sh:datatype xsd:string ;
>>> ] ;
>>> ]
>>> [ a sh:Shape ;
>>> sh:property [
>>> sh:predicate schema:address ;
>>> sh:class schema:Address ;
>>> ] ;
>>> ]
>>> )
>>> ]
>>>
>>> which lacks on multiple fronts - it is too verbose and also forces
>>> repetition of the predicate.
>>>
>>> b) Proposed: generalize sh:or and values of sh:or may be constraints of the
>>> same kind as the surrounding constraint.
>>>
>>> ex:MyShape
>>> a sh:Shape ;
>>> sh:property [
>>> sh:predicate schema:address ;
>>> sh:or (
>>> [ sh:datatype xsd:string ]
>>> [ sh:class schema:Address ]
>>> )
>>> ]
>>>
>>> In this proposal, the members of the sh:or List may be
>>> sh:PropertyConstraints if sh:or is used within a sh:PropertyConstraint.
>>>
>>> Required changes (all incremental to current spec):
>>>
>>> 1) Generalize sh:hasShape from sh:hasShape(?node, ?shape, ?shapesGraph) to
>>>
>>> sh:validateNode(?node, ?shapeOrConstraint, ?shapesGraph,
>>> ?defaultConstraintType, ?defaultPredicate)
>>>
>>> The two arguments at the end are optional, and are used to complement the
>>> provided ?shapeOrConstraint unless it is a sh:Shape. Legal values for
>>> ?defaultConstraintType would be sh:PropertyConstraint,
>>> sh:InversePropertyConstraint and sh:NodeConstraint. ?defaultPredicate is
>>> only supported if ?defaultConstraintType is given and != sh:NodeConstraint.
>>>
>>> The algorithm would be
>>>
>>> a) if ?shapeOrConstraint rdf:type sh:Shape, then behave as currently
>>> b) otherwise, assume ?defaultConstraintType (unless the node has an rdf:type)
>>> and assume ?defaultPredicate for sh:predicate.
>>> c) report failure if the node has rdf:type that is neither sh:Shape nor
>>> ?defaultConstraintType.
>>>
>>> While this function isn't pretty it's mostly used internally anyway and may
>>> therefore be regarded as an implementation detail. The name sh:validateNode
>>> is better than sh:hasShape because it may also return unbound.
>>>
>>> 2) Generalize sh:or to also have contexts: sh:PropertyConstraint and
>>> sh:InversePropertyConstraint
>>>
>>> 3) Add a sh:propertyValidator to sh:OrConstraint similar to what we have as
>>> sh:nodeValidator, but with the sh:validateNode function:
>>>
>>> SELECT $this ?failure ...
>>> WHERE {
>>> {
>>> $this $predicate ?value .
>>> }
>>> {
>>> SELECT (SUM(?s) AS ?count)
>>> WHERE {
>>> GRAPH $shapesGraph {
>>> $or rdf:rest*/rdf:first ?shape .
>>> }
>>> BIND (sh:validateNode(?value, ?shape, $shapesGraph, sh:PropertyConstraint, $predicate) AS ?valid) .
>>> BIND (IF(bound(?valid), IF(?valid, 1, 0), 'error') AS ?s) .
>>> }
>>> }
>>> BIND (!bound(?count) AS ?failure) .
>>> FILTER IF(?failure, true, ?count = 0) .
>>> }
>>>
>>> and similar for sh:inversePropertyValidator. The same approach would work
>>> for sh:and and sh:not. I guess also for sh:valueShape if that's desirable.
>>>
>>> Regards,
>>> Holger
>>>
>>
>
Received on Tuesday, 10 May 2016 20:34:34 UTC