- From: Holger Knublauch <holger@topquadrant.com>
- Date: Tue, 13 Sep 2016 14:34:55 +1000
- To: public-data-shapes-wg@w3.org
On 12/09/2016 20:07, Andy Seaborne wrote: > > > On 12/09/16 00:30, Holger Knublauch wrote: >> Taking this and Andy's input into consideration, maybe sh:langShape is >> an overkill and all we really need is a new parameter such as >> sh:languageIn which takes a node and, if it has a language tag, verifies >> that it matches one of the provided languages following the SPARQL >> langMatches semantics. For example: >> >> ex:MyShape >> a sh:Shape ; >> sh:property [ >> sh:predicate skos:prefLabel ; >> sh:or ( [ sh:datatype xsd:string ] [ sh:datatype rdf:langString >> ] ) ; >> sh:langMatches ( "en" "fr" "de" ) . > > A note: this is a slightly different operation to sparql:langMatches > which takes a language tag and a language match, not a literal and > language match. Some people prefer that local names are not reused to > mean slightly different things where possible. Oops, yes. I intended to use sh:languageIn but forgot to update the example. So here it is again: ex:MyShape a sh:Shape ; sh:property [ sh:predicate skos:prefLabel ; sh:or ( [ sh:datatype xsd:string ] [ sh:datatype rdf:langString ] ) ; sh:languageIn ( "en" "fr" "de" ) ; ] . > >> ] . >> >> langMatches could be for just a single language, but having a list is >> shorter for this (apparently) common case in multi-lingual countries >> such as Belgium. I didn't know the RFC supports wildcards - this should >> hopefully flexible enough to cover all given use cases, but others may >> need to confirm. >> >> Regards, >> Holger >> >> PS: Andy, I prefer sh:datatype rdf:langString because it would be one >> thing less to check (by form builders etc), and furthermore I believe >> the semantics of sh:langMatches needs to be that it only does something >> if the literal really has a language tag. Otherwise it would be harder >> to express mixed cases of either string or langString (which I believe >> is quite common). > > Consider > > sh:property [ > sh:predicate skos:prefLabel ; > sh:langMatches ( "en" "fr" "de" ) . > ] . > > with data: > > <uri> skos:prefLabel 123 . > > which is a violation when sh:langMatches requires the language tag but > passes if sh:langMatches only triggers if there is a language tag at > all. I find the latter a strange natural interpretation of the shape. > > String or language match would be: > > sh:or ( [ sh:datatype xsd:string ] > [ sh:langMatches ( "en" "fr" "de" ) ] ) ; > > There is no need to test for [ sh:datatype rdf:langString ] as well as > it is implicit in having any language tag so it happens when > sh:langMatches requires the language tag. > > For error checking: > > This data: > > "abcde"^^rdf:langString > > is malformed and not in the value-space of rdf:langString; it is like > writing > > "abcde"^^xsd:integer > > It does have the datatype - it does not represent a legal value. > > > Another way: make language match "" mean xsd:string. (c.f XML where > xml:lang="" means no language tag althouhg with slightly different > implications). > > sh:property [ > sh:or ( [ sh:datatype xsd:string ] > [ sh:langMatches ( "en" "fr" "de" ) ] ) ; > ] . > > vs > > sh:property [ > sh:predicate skos:prefLabel ; > sh:langMatches ("" "en" "fr" "de" ) . > ] . So the change you seem to be advocating is to make sh:languageIn produce violations if the value node is not a literal, or a literal that does not have any language tag. As you point out, this would lead to situations in which the sh:datatype rdfs:langString can be omitted in an sh:or. The meaning of sh:datatype would not change, and people can still state sh:datatype rdf:langString for the (common) case in which any language is permitted. I believe I would be OK with that interpretation. Here is a SPARQL ASK validator query that is passing the English and Francais cases below: ASK { BIND (lang($value) AS ?valueLang) . FILTER (bound(?valueLang) && EXISTS { GRAPH $shapesGraph { $languageIn (rdf:rest*)/rdf:first ?lang . FILTER (langMatches(?valueLang, ?lang)) } } ) } ex:TestShape rdf:type sh:Shape ; rdfs:label "Test shape" ; sh:languageIn ( "en" "fr" ) ; sh:targetNode "English"@en ; sh:targetNode "Francais"@fr ; sh:targetNode rdfs:Resource ; # Fails sh:targetNode "Deutsch"@de ; # Fails sh:targetNode "Plain String" ; # Fails . Holger
Received on Tuesday, 13 September 2016 04:35:26 UTC