SHACL, un lenguaje para validar grafos RDF

Fecha de la noticia: 14-02-2018

Grafos RDF

El uso de RDF y de los datos enlazados (Linked Data) se está extendido a múltiples campos, desde la agricultura a la medicina. Y en todos los campos de conocimiento es necesario la validación de los datos RDF generados, aunque las condiciones sean diferentes para cada caso. Esta era una de las asignaturas pendientes de la pila de tecnologías de la Web Semántica, una tecnología para validar un grafo RDF frente a una estructura definida. Para poder solucionar esta brecha, el World Wide Web Consortium (W3C) creó un grupo de trabajo denominado RDF Data Shapes, cuyo objetivo era producir un estándar a tal efecto.

Y el resultado ha sido la publicación, en julio de 2017, del Lenguaje de Restricción de Formas (Shapes Constraint Language - SHACL), un lenguaje para validar grafos RDF contra un conjunto de condiciones. Estas condiciones se proporcionan como “formas” (shapes) y otras construcciones, todo ello expresado como un grafo RDF. A estos grafos RDF se les denominan en SHACL "grafos de formas" (shapes graphs). Y los grafos RDF a validar contra un grafo de formas se les denomina "grafos de datos" (data graphs).

Además, los grafos de formas SHACL pueden verse como la descripción de la estructura de los grafos de datos que satisfacen estas condiciones. Asimismo, dichas descripciones pueden usarse para una variedad de propósitos además de la validación, como la construcción de interfaces de usuario, la generación de código o la integración de datos.

Un ejemplo sencillo del uso de SHACL para validar un grafo RDF podría el siguiente: en un grafo de datos enlazados (Linked Data) de una biblioteca que contiene información sobre los documentos depositados, donde se quiere comprobar que todos los libros (bibo:Book) tengan asociados uno y solo un identificador (dc:identifier).

En este caso, el grafo de formas (shapes graph), expresado en Turtle, con las condiciones expuestas sería el siguiente:

ex:BookShape

   a sh:NodeShape ;

   sh:targetClass bibo:Book ;

   sh:property [

       sh:path dc:identifier ;

       sh:minCount 1 ;

       sh:maxCount 1 ;

       rdfs:comment "Condición: El libro tiene uno y solo un identificador."@es ;

       sh:message "El libro NO tiene uno y solo un identificador"@es ;

   ] .

Si por ejemplo se tuviera el grafo de datos (data graph)

ex:AmigoArbol a bibo:Book;

   dc:title "Mi amigo el árbol"@es ;

   dc:creator "Martín Chico"@es;

   dc:contributor "Seminiano Alonso"@es;

   dc:identifier "Villacarralon-1933" .

ex:ElQuixote a bibo:Book;

   dc:title "El Ingenioso Hidalgo Don Quijote de la Mancha"@es ;

   dc:creator "Miguel de Cervantes"@es.

El validador informaría que el recurso ex:ElQuixote no posee un identificador, como indican la condición del grafo de formas previamente definido.

Actualmente, el conjunto de herramientas que dan soporte a esta tecnología es reducido.

Dentro del grupo de desarrollos informáticos distribuidos bajo la marca TopBraid, se puede nombrar TopBraid SHACL API, un componente software, diseñado en Java (usando la librería Apache Jena) y disponible bajo licencia abierta, para chequear condiciones SHACL mediante llamadas a un API software. Otro validador disponible es SHACL.js , software diseñado en JavaScript y disponible bajo licencia abierta, y del cual está desplegada una instancia en SHACL Playground, que ofrece un interfaz web de usuario donde, tras rellenar el “grafo de formas” y el “grafo de datos”, se genera un informe de validación, así como una estructura visual con la estructura de los grafos de formas.

SHACL seguramente va a ser un paso significativo para que los datos enlazados sean más utilizados en todos los ámbitos. Es por ello, que muchas personas creen que SHACL va a cambiar las reglas de juego en la administración de datos y la gestión de los metadatos de datos, conjuntos de datos (datasets) y Big Data.

Nota: Por simplicidad de lectura, en el ejemplo no se ha incluido los prefijos.

@prefix sh: <http://www.w3.org/ns/shacl#> .

@prefix ex: <http://example.org/ns#> .

@prefix bibo: <http://purl.org/ontology/bibo/> .

@prefix dc: <http://purl.org/dc/elements/1.1/> .