- From: Holger Knublauch <holger@topquadrant.com>
- Date: Thu, 5 May 2016 18:37:31 +1000
- To: "public-data-shapes-wg@w3.org" <public-data-shapes-wg@w3.org>
- Message-ID: <dfe3fe64-fa3b-a443-df59-2e486f359e17@topquadrant.com>
On 5/05/2016 17:58, Dimitris Kontokostas wrote:
>
> Thanks Holger
>
> see inline for a couple of questions
>
> On Thu, May 5, 2016 at 5:49 AM, Holger Knublauch
> <holger@topquadrant.com <mailto:holger@topquadrant.com>> 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.
>
>
> Questions:
> - can we have nested sh:or / sh:and / sh: not in these positions?
Yes I think so. Example sh:or [ sh:and [ ... the sh:or is a
sh:PropertyConstraint, and so is the sh:and, thus the same default
constraint type would apply there too.
> - are we allowed to provide shapes on only
> (Inverse)PropertyConstraints parameters i.e. we must always follow the
> current context?
I believe it would make most sense to follow the current context. To
"escape" that, you can always explicitly make the nested constraint an
instance of something else via rdf:type, including rdf:type sh:Shape as
a complete generalization.
> - Is this simplification allowed in sh:constraint as well?
Yes, the default type then would be sh:NodeConstraint.
HTH
Holger
>
> Thanks,
> Dimitris
>
> 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
>
>
>
>
> --
> Dimitris Kontokostas
> Department of Computer Science, University of Leipzig & DBpedia
> Association
> Projects: http://dbpedia.org, http://rdfunit.aksw.org,
> http://http://aligned-project.eu <http://aligned-project.eu/>
> Homepage:http://aksw.org/DimitrisKontokostas
> Research Group: AKSW/KILT http://aksw.org/Groups/KILT
>
Received on Thursday, 5 May 2016 08:38:05 UTC