Tipo de incidencia
Elemento afectado
- Clase/Propiedad:
sh:uniqueLang, sh:pattern, :UniqueLangLiteralRestriction, :NonEmptyLiteralConvention
- Ubicación en el perfil:
shacl/1.0.0/shacl_common_shapes.ttl
:UniqueLangLiteralRestriction
:NonEmptyLiteralConvention
- Perfil DCAT-AP-ES 1.0.0, validación Case 1
Situación actual en DCAT-AP-ES
Al ejecutar las shapes oficiales DCAT-AP-ES 1.0.0 Case 1 con pySHACL, la validación no llega a producir un informe SHACL porque falla durante la carga/ejecución de las shapes.
Se han detectado dos puntos en shacl_common_shapes.ttl:
- Patrón regex:
sh:pattern "^(?s)(?=.*\\S).*$" ;
- Uso de
sh:uniqueLang en una sh:NodeShape:
:UniqueLangLiteralRestriction
a sh:NodeShape ;
...
sh:uniqueLang true ;
Problema detectado
Con pySHACL==0.40.0 y Python 3.12, el patrón regex produce primero:
global flags not at the start of the expression at position 1
Si se corrige localmente solo en memoria el patrón anterior a:
sh:pattern "(?s)^(?=.*\\S).*$" ;
la ejecución avanza, pero después falla con:
ConstraintLoadError: UniqueLangConstraintComponent can only be present on a PropertyShape, not a NodeShape.
For reference, see https://www.w3.org/TR/shacl/#UniqueLangConstraintComponent
Por tanto, la validación Case 1 no puede ejecutarse con pySHACL sobre las shapes oficiales sin una adaptación previa.
Evidencia
Entorno probado:
DCAT-AP-ES: 1.0.0
Commit: 324866f491cf4adf8a47a75f1a8a40db010310c0
Caso: Case 1
Python: 3.12
pySHACL: 0.40.0
rdflib: 7.6.0
Shapes utilizadas:
shacl/1.0.0/shacl_common_shapes.ttl
shacl/1.0.0/shacl_catalog_shape.ttl
shacl/1.0.0/shacl_dataservice_shape.ttl
shacl/1.0.0/shacl_dataset_shape.ttl
shacl/1.0.0/shacl_distribution_shape.ttl
shacl/1.0.0/shacl_mdr-vocabularies.shape.ttl
Fragmento afectado:
@prefix sh: <http://www.w3.org/ns/shacl#> .
:UniqueLangLiteralRestriction
a sh:NodeShape ;
sh:uniqueLang true ;
sh:message "Más de un valor comparten la misma etiqueta de idioma. Ver: https://datosgobes.github.io/DCAT-AP-ES/convenciones/#convencion-02"@es ;
sh:message "More than one value shares the same language tag. See: https://datosgobes.github.io/DCAT-AP-ES/conventions/#convention-02"@en ;
sh:severity sh:Violation .
Error observado:
ConstraintLoadError: UniqueLangConstraintComponent can only be present on a PropertyShape, not a NodeShape.
Posible Solución
Revisar las shapes oficiales para que sean ejecutables con motores SHACL estándar como pySHACL.
En concreto:
- Cambiar el patrón:
sh:pattern "^(?s)(?=.*\\S).*$" ;
por:
sh:pattern "(?s)^(?=.*\\S).*$" ;
- Revisar
:UniqueLangLiteralRestriction, ya que sh:uniqueLang parece estar definido sobre una sh:NodeShape, mientras pySHACL lo acepta únicamente en sh:PropertyShape.
También sería útil documentar explícitamente qué motor SHACL y versión se considera soportado/recomendado para validar DCAT-AP-ES 1.0.0.
Ejemplo de Implementación Correcta
Para el caso del patrón regex:
:NonEmptyLiteralConvention
a sh:NodeShape ;
sh:nodeKind sh:Literal ;
sh:minLength 1 ;
sh:pattern "(?s)^(?=.*\\S).*$" ;
sh:severity sh:Violation .
Para sh:uniqueLang, no propongo un cambio cerrado porque puede requerir una decisión semántica sobre cómo reutilizar la restricción común. La expectativa sería que sh:uniqueLang true quede en una sh:PropertyShape o se modele mediante una restricción equivalente compatible con SHACL.
Información Adicional
La incidencia se detectó durante un piloto de validación DCAT-AP-ES en el que:
- el RDF generado parseaba correctamente;
- no había URLs internas/locales en el RDF;
- las shapes oficiales se descargaron desde el commit indicado y se verificaron por hash;
- la validación SHACL no pudo completarse por los errores anteriores.
El bloqueo impide obtener un informe de conformidad SHACL, por lo que no permite distinguir si el RDF validado es conforme o no conforme: la ejecución se detiene en la carga/validación de las propias shapes.
Tipo de incidencia
Elemento afectado
sh:uniqueLang,sh:pattern,:UniqueLangLiteralRestriction,:NonEmptyLiteralConventionshacl/1.0.0/shacl_common_shapes.ttl:UniqueLangLiteralRestriction:NonEmptyLiteralConventionSituación actual en DCAT-AP-ES
Al ejecutar las shapes oficiales DCAT-AP-ES 1.0.0 Case 1 con
pySHACL, la validación no llega a producir un informe SHACL porque falla durante la carga/ejecución de las shapes.Se han detectado dos puntos en
shacl_common_shapes.ttl:sh:pattern "^(?s)(?=.*\\S).*$" ;sh:uniqueLangen unash:NodeShape::UniqueLangLiteralRestriction a sh:NodeShape ; ... sh:uniqueLang true ;Problema detectado
Con
pySHACL==0.40.0y Python 3.12, el patrón regex produce primero:Si se corrige localmente solo en memoria el patrón anterior a:
sh:pattern "(?s)^(?=.*\\S).*$" ;la ejecución avanza, pero después falla con:
Por tanto, la validación Case 1 no puede ejecutarse con pySHACL sobre las shapes oficiales sin una adaptación previa.
Evidencia
Entorno probado:
Shapes utilizadas:
Fragmento afectado:
Error observado:
Posible Solución
Revisar las shapes oficiales para que sean ejecutables con motores SHACL estándar como pySHACL.
En concreto:
sh:pattern "^(?s)(?=.*\\S).*$" ;por:
sh:pattern "(?s)^(?=.*\\S).*$" ;:UniqueLangLiteralRestriction, ya quesh:uniqueLangparece estar definido sobre unash:NodeShape, mientras pySHACL lo acepta únicamente ensh:PropertyShape.También sería útil documentar explícitamente qué motor SHACL y versión se considera soportado/recomendado para validar DCAT-AP-ES 1.0.0.
Ejemplo de Implementación Correcta
Para el caso del patrón regex:
:NonEmptyLiteralConvention a sh:NodeShape ; sh:nodeKind sh:Literal ; sh:minLength 1 ; sh:pattern "(?s)^(?=.*\\S).*$" ; sh:severity sh:Violation .Para
sh:uniqueLang, no propongo un cambio cerrado porque puede requerir una decisión semántica sobre cómo reutilizar la restricción común. La expectativa sería quesh:uniqueLang truequede en unash:PropertyShapeo se modele mediante una restricción equivalente compatible con SHACL.Información Adicional
La incidencia se detectó durante un piloto de validación DCAT-AP-ES en el que:
El bloqueo impide obtener un informe de conformidad SHACL, por lo que no permite distinguir si el RDF validado es conforme o no conforme: la ejecución se detiene en la carga/validación de las propias shapes.