- 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