This has been a long-standing issue, not least due to the rdf:PlainLiteral (more recently xsd:string) and rdfs:langString dichotomy in ontologies like ePO, whose constraints are generated by model2owl. Having data like the following:
epd:id_d9997c19-6dd6-43e2-9706-28df10f8f1eb_AwardCriterion_Y6iaTUeQDukaqhJjdTfKhV
a epo:AwardCriterion;
epo:hasAwardCriterionType <http://publications.europa.eu/resource/authority/award-criterion-type/quality>;
epo:hasWeightValueType <http://publications.europa.eu/resource/authority/number-weight/per-exa>;
cccev:weight 10.0;
dct:description "See purchase documents"@en, "Nurodyta pirkimo dokumentuose"@lt;
skos:prefLabel "Delivery time for goods"@en, "Delivery time for goods"@lt .
will raise a sh:MaxCountConstraintComponent ("More than 1 values") violation for dct:description and/or skos:prefLabel.
There is a simple fix to this: sh:uniqueLang true
However, that's not the whole story. There is a more sophisticated variant which allows also plain, non-language-tagged literals to co-exist with language-tagged ones, combining sh:uniqueLang and sh:qualifiedValueShape:
ex:MaxOneRDFLabelShape
a sh:NodeShape ;
sh:targetSubjectsOf rdf:type ;
sh:property [
sh:path rdfs:label ;
sh:uniqueLang true ;
] ;
sh:property [
sh:path rdfs:label ;
sh:qualifiedMaxCount 1 ;
sh:qualifiedValueShape [
sh:datatype xsd:string ;
] ;
sh:message "Violation of standard practice: More than one `rdfs:label` exists without a language tag" ;
]
.
This was implemented for the SEMIC validator (see shape and accompanying test data).
The above technique would allow the following to pass:
ex:Note a owl:Class ;
skos:prefLabel "note"@en , "nota"@es ;
rdfs:label "note"@en , "nota"@es ;
rdfs:comment "note" , "notee" .
but not:
ex:Note a owl:Class ;
skos:prefLabel "note" , "notee" , "note"@en , "notee"@en ;
rdfs:label "note" , "notee" , "note"@en , "notee"@en .
The technique currently seen with sh:or:
...
sh:minCount 0 ;
sh:maxCount 1 ;
sh:or (
[
sh:datatype xsd:string ;
]
[
sh:datatype rdf:langString ;
]
) .
as implemented based on #219, does not work for multiple language tags.
Whether to implement the simple or advanced variant allowing co-existence of plain and language-tagged literals, is perhaps a question for the ontology stakeholders.
This has been a long-standing issue, not least due to the
rdf:PlainLiteral(more recentlyxsd:string) andrdfs:langStringdichotomy in ontologies like ePO, whose constraints are generated by model2owl. Having data like the following:will raise a
sh:MaxCountConstraintComponent("More than 1 values") violation fordct:descriptionand/orskos:prefLabel.There is a simple fix to this:
sh:uniqueLang trueHowever, that's not the whole story. There is a more sophisticated variant which allows also plain, non-language-tagged literals to co-exist with language-tagged ones, combining
sh:uniqueLangandsh:qualifiedValueShape:This was implemented for the SEMIC validator (see shape and accompanying test data).
The above technique would allow the following to pass:
but not:
The technique currently seen with
sh:or:as implemented based on #219, does not work for multiple language tags.
Whether to implement the simple or advanced variant allowing co-existence of plain and language-tagged literals, is perhaps a question for the ontology stakeholders.