- From: Peter F. Patel-Schneider <pfpschneider@gmail.com>
- Date: Fri, 29 Apr 2016 02:44:15 -0700
- To: Holger Knublauch <holger@topquadrant.com>
- Cc: "public-data-shapes-wg@w3.org" <public-data-shapes-wg@w3.org>
Option 1: sh:type type argument IRI A validation report is produced for a node if it is not a literal and there is no rdf:type/rdfs:subclassOf* path in the data graph from the node to the type or it is a literal and its datatype is different from type Option 2 (preferred): sh:type type argument IRI A validation report is produced for a node if it is not a literal and there is no rdf:type/rdfs:subclassOf* path in the data graph from the node to the type or it is a literal with known datatype and type is a known datatype and the value of the literal, if any, belongs to the value space of the type or it is a literal with known datatype and type is not a known datatype or it is a literal with datatype that is not a known datatype and that datatype is different from type peter On 04/29/2016 02:12 AM, Holger Knublauch wrote: > Such as? > > Sent from my iPad > >> On 29 Apr 2016, at 5:50 PM, Peter F. Patel-Schneider <pfpschneider@gmail.com> wrote: >> >> Why not use instead a formulation that does not depend on whether the type is >> a datatype? >> >> peter >> >> >>> On 04/28/2016 08:17 PM, Holger Knublauch wrote: >>> Here is a proposal to replace sh:datatype and sh:class with sh:type, >>> implemented with the following semantics: >>> >>> sh:TypeConstraintComponent >>> a sh:ConstraintComponent ; >>> sh:parameter [ >>> sh:predicate sh:type ; >>> ] ; >>> sh:context sh:InversePropertyConstraint ; >>> sh:context sh:NodeConstraint ; >>> sh:context sh:PropertyConstraint ; >>> sh:inversePropertyValidator dash:hasType ; >>> sh:nodeValidator dash:hasType ; >>> sh:propertyValidator dash:hasType ; >>> . >>> >>> dash:hasType >>> a sh:SPARQLAskValidator ; >>> sh:sparql """ >>> ASK { >>> FILTER IF(dash:isDatatype($type), >>> datatype($value) = $type, >>> EXISTS { $value rdf:type/rdfs:subClassOf* $type }) >>> } """ ; >>> . >>> >>> dash:isDatatype >>> a sh:SPARQLFunction ; >>> sh:parameter [ >>> sh:predicate sh:type ; >>> ] ; >>> sh:returnType xsd:boolean ; >>> sh:sparql "ASK { FILTER (EXISTS { $type a rdfs:Datatype } || >>> dash:isSystemDatatype($type)) }" ; >>> . >>> >>> dash:isSystemDatatype >>> a sh:SPARQLFunction ; >>> sh:parameter [ >>> sh:predicate sh:type ; >>> ] ; >>> sh:returnType xsd:boolean ; >>> sh:sparql "ASK { FILTER ($type IN (xsd:string, xsd:integer, xsd:date, ...)) >>> }" ; >>> . >>> >>> The definition above uses helper SHACL functions, but these can of course be >>> in-lined for the official document. The definition of such functions has the >>> benefit that the logic to determine whether something is a datatype or not can >>> be reused. >>> >>> The enumeration in isSystemDatatype would be extended with the other RDF 1.1 >>> datatypes including rdf:langString and rdf:HTML. >>> >>> Open questions include whether the rdf:type rdfs:Datatype triple needs to be >>> in the shapes graph and whether we need to support subclasses of >>> rdfs:Datatype. I have no strong opinions, and changing this would be trivial. >>> >>> This would close ISSUE-141 for me, assuming we add a corresponding sh:typeIn. >>> >>> Holger >>> >>>
Received on Friday, 29 April 2016 09:44:48 UTC