SpazioCodice

Un kit de développement de serveur de fragments de données liées

Un kit de développement de serveur de fragments de données liées

Le Resource Description Framework (RDF)  est une norme du World Wide Web Consortium (W3C).

À l’origine conçu comme un modèle de données pour les métadonnées, il est rapidement devenu la norme de facto pour décrire et échanger des données graphiques, en particulier dans les applications web sémantiques.

Il fournit un moyen de décrire les ressources et leurs relations dans un format lisible par machine: l’information est structurée sous forme de triplets, des déclarations qui se composent d’un sujet, d’un prédicat et d’un objet.

Ces triplets forment une structure en graphe, où les nœuds sont des ressources et les arêtes représentent les relations entre les ressources, comme dans l’image ci-dessous:

Le même graphe peut être représenté textuellement à l’aide des déclarations composées:

				
					Andrea knows Mario
Andrea lives in Viterbo
Viterbo is in Italy
Italy is in Europe

Mario lives in Italy
Mario knows John

John lives in Germany
Germany is in Europe
				
			

Comment stocker les données RDF ? Le magasin RDF

Un magasin RDF, un magasin de triplets ou une base de données RDF est une base de données spécialisée conçue pour stocker et interroger des données RDF. Il prend généralement en charge SPARQL, un langage de requête pour interroger des données RDF.

SPARQL permet aux utilisateurs d’exprimer des requêtes complexes pour récupérer des informations du magasin RDF en fonction de motifs et de conditions. L’exemple SPARQL suivant récupère le titre de tous les livres dans l’ensemble de données dont le prix est inférieur à 30:

				
					PREFIX  dc:  <http://purl.org/dc/elements/1.1/>
PREFIX  ns:  <http://example.org/ns#>
SELECT  ?title ?price
WHERE   { ?x ns:price ?price .
          FILTER (?price < 30) .
          ?x dc:title ?title . }
				
			

Comment fournir des données RDF ?

Lorsque j’ai commencé à plonger dans le sujet des Fragments de Données Liées, j’ai été impressionné par l’image suivante sur la page d’accueil de LDF.

Cette simple image donne rapidement au lecteur une idée immédiate de ce dont nous allons discuter. Les deux extrêmes ci-dessus sont des options valides si l’objectif est de publier et d’interagir avec des données RDF. Explorons-les rapidement.

Export de données (Data Dump)

Les portails RDF tels que Dbpedia ou VIAF offrent un accès en ligne à leurs services de recherche. Cependant, étant des services publics, un tel accès est limité à un certain quota d’utilisation.

Par exemple, vous ne pouvez pas construire un système qui traite une quantité considérable de données et exécute rapidement une quantité massive d’appels API à ces services. La raison est claire : le portail est destiné à fournir ses services à une qualité élevée/moyenne à un public large, potentiellement très vaste ; par conséquent, l’effort marginal, en termes d’utilisation des ressources, dépensé par un seul appel API ne peut pas dépasser un taux donné.

Si vous vous trouvez dans ce contexte, que pouvez-vous faire ? Téléchargez l’ensemble de données public et gérez-le vous-même dans un magasin RDF local, ce qui nous amène à l’extrême suivant.

Serveur SPARQL

Vous disposez d’un ensemble de données RDF et vous souhaitez exposer des capacités SPARQL. Une première approche serait de se dire : “D’accord, utilisons un magasin RDF”.

Jusque-là, tout va bien ! Cependant, cette approche présente quelques inconvénients, surtout si l’ensemble de données est considérable en cardinalité. Dans ce scénario, l’élément “coût élevé du serveur” mentionné ci-dessus (le premier des trois points dans la liste de l’extrême du point d’accès SPARQL) pourrait jouer un rôle important.

Une solution de stockage RDF scalable a un coût, qui est souvent “important”, surtout si l’ensemble de données est grand ; de ce point de vue, le paysage open-source est très pauvre.

Même si vous laissez l’option “sur site” pour souscrire à une solution gérée dans le cloud, soyez prêt à avoir un nouvel élément important sur votre liste de courses.

Les Fragments de Données Liées

Linked Data Fragments vise à offrir une alternative, c’est-à-dire un troisième scénario intermédiaire entre les deux extrêmes précédents.

L’idée est de déstructurer et de distribuer l’exécution de la requête en petits fragments de calcul.

Au lieu d’avoir un moteur SPARQL centralisé (c’est-à-dire un serveur) qui nécessite un coût de calcul élevé, la requête SPARQL est déstructurée dans une couche intermédiaire en blocs composants appelés “triples patterns” (motifs triples).

Ignorons toute optimisation de requête potentielle que la couche intermédiaire pourrait appliquer (c’est-à-dire la réécriture de requête, le réordonnancement des motifs). Une fois la requête déstructurée, chaque motif est envoyé à un serveur de Triple Pattern, un service distant chargé de “résoudre” un seul motif de triple.

La réponse de la résolution du motif triple est un fragment. C’est-à-dire une réponse partielle composée de:

  • des métadonnées sur le résultat, l’ensemble de données, le service et le système derrière
  • des contrôles hypermédias pour comprendre et naviguer dans les résultats
  • des triplets correspondant au motif de requête

La couche intermédiaire agit comme une sorte de coordinateur de requêtes et de moteur de fédération : elle déstructure les requêtes initiales, demande la résolution de tout motif résultant, reçoit les réponses des serveurs de résolution de motifs, applique une logique de fusion, et renvoie la réponse à l’appelant.

FragLink

FragLink est un framework pour construire des serveurs de Fragments de Données Liées. En d’autres termes, FragLink permet d’ajouter des fonctionnalités de Linked Data Fragments à votre application serveur.

Cela signifie que ce n’est pas un serveur en soi. Au lieu de cela, il s’agit d’un module SpringBoot autoconfigurable que vous pouvez facilement intégrer à votre application. Une fois que FragLink est intégré, tout ce qui concerne l’API Web des Fragments de Données Liées est activé (c’est-à-dire, le point de terminaison HTTP, les métadonnées, les contrôles) : bien sûr, la liaison concrète des données vous revient.

Voyons comment cela fonctionne.

Étape 1: Structure de base de l'application SpringBoot

Ceci sera votre serveur de Fragments de Données Liées. Il est fortement recommandé d’utiliser Spring Initializr pour définir la forme initiale du module (par exemple, les composants, les dépendances, les frameworks, les starters). 

Étape 2: Dépendances de FragLink

Une fois que la structure de projet est créée, ouvrez le fichier pom.xml (dans le cas où vous utilisez Gradle, il y a une configuration correspondante) et ajoutez la section suivante:

				
					<repositories>
  <repository>
    <id>fraglink-package-registry</id>
    <url>https://gitlab.com/api/v4/projects/52914288/packages/maven</url>
  </repository>
</repositories>
				
			

Dans l’extrait ci-dessus, les coordonnées du dépôt Maven où les artefacts FragLink sont hébergés sont déclarées. Ensuite, dans la section des dépendances:

Étape 3: Configuration

En supposant que vous avez déjà configuré tout le module SpringBoot (par exemple, les dépendances, etc.), voici la configuration minimale requise par FragLink:

				
					<dependency>
  <groupId>com.spaziocodice.labs.rdf</groupId>
  <artifactId>fraglink-starter</artifactId>
  <version>1.1.1</version>
</dependency>
				
			
				
					fraglink:
  base:
    url: https://fragments.yourproject.org  (this is an example)
  page:
    maxStatements: 50 (the maximum number of statements returned in response)
  dataset:
    name: "The dataset / project name" 
    description: "An optional description about the project"
				
			

Étape 4: Démarrage

Démarrez votre serveur. Après quelques secondes, vous devriez voir les messages suivants:

				
					... : <FRAGLINK-00001> : FragLink v1.1.1 has been enabled on this server.
				
			

Le serveur est en cours d’exécution: super ! Les Fragments de Données Liées sont exposés via le point de terminaison REST racine (/). Le modèle de l’endpoint est:

http://fragments.yourproject.org{subject, predicate, object, graph, page}

Cependant, en tant que résolveur de motifs triple/quad, il ne sait toujours pas comment récupérer les données. L’implémentation par défaut est une simple NoOp, ce qui signifie que aucune donnée n’est renvoyée en réponse, seulement des métadonnées. Voici un exemple de réponse de ce type :

				
					<https://fragments.yourproject.org/fragments#metadata> {
    <https://fragments.yourproject.org/fragments#dataset>
            a <http://rdfs.org/ns/void#Dataset> , <http://www.w3.org/ns/hydra/core#Collection>;
            <http://rdfs.org/ns/void#subset>
                    <https://fragments.yourproject.org/fragments>;
            <http://www.w3.org/ns/hydra/core#search>
                    [ <http://www.w3.org/ns/hydra/core#mapping>
                              [ <http://www.w3.org/ns/hydra/core#property>
                                        <http://www.w3.org/1999/02/22-rdf-syntax-ns#subject>;
                                <http://www.w3.org/ns/hydra/core#variable>
                                        "subject"
                              ];
                      <http://www.w3.org/ns/hydra/core#mapping>
                              [ <http://www.w3.org/ns/hydra/core#property>
                                        <http://www.w3.org/1999/02/22-rdf-syntax-ns#predicate>;
                                <http://www.w3.org/ns/hydra/core#variable>
                                        "predicate"
                              ];
                      <http://www.w3.org/ns/hydra/core#mapping>
                              [ <http://www.w3.org/ns/hydra/core#property>
                                        <http://www.w3.org/1999/02/22-rdf-syntax-ns#object>;
                                <http://www.w3.org/ns/hydra/core#variable>
                                        "object"
                              ];
                      <http://www.w3.org/ns/hydra/core#template>
                              "https://fragments.yourproject.org/fragments{?subject,predicate,object,page}";
                      <http://www.w3.org/ns/hydra/core#variableRepresentation>
                              <http://www.w3.org/ns/hydra/core#ExplicitRepresentation>
                    ] .
    
    <https://fragments.yourproject.org#dataset>
            a <http://www.w3.org/ns/hydra/core#Collection>;
            <http://purl.org/dc/elements/1.1/description>
                    "An optional description of the dataset.";
            <http://purl.org/dc/elements/1.1/title>
                    "The Dataset project/name";
            <http://www.w3.org/ns/hydra/core#member>
                    <https://fragments.yourproject.org/fragments#dataset> .
    
    <https://fragments.yourproject.org/fragments#metadata>
            <http://xmlns.com/foaf/0.1/primaryTopic>
                    [ a <https://fragments.yourproject.org/fragments> ] .
    
    <https://fragments.yourproject.org/fragments>
            a <http://www.w3.org/ns/hydra/core#PartialCollectionView>;
            <http://purl.org/dc/elements/1.1/description>
                    "Linked Data Fragment of Share-VDE dataset containing triples matching the pattern {?s ?p ?o ?q}"@en;
            <http://purl.org/dc/elements/1.1/source>
                    "https://fragments.yourproject.org/fragments#dataset";
            <http://purl.org/dc/elements/1.1/title>
                    "Linked Data Fragment of The Share-VDE Project Dataset"@en;
            <http://rdfs.org/ns/void#subset>
                    <https://fragments.yourproject.org/fragments>;
            <http://rdfs.org/ns/void#triples>
                    "0"^^<http://www.w3.org/2001/XMLSchema#long>;
            <http://www.w3.org/ns/hydra/core#firstPage>
                    <https://fragments.yourproject.org/fragments?page=1>;
            <http://www.w3.org/ns/hydra/core#itemsPerPage>
                    "50"^^<http://www.w3.org/2001/XMLSchema#int>;
            <http://www.w3.org/ns/hydra/core#totalItems>
                    "0"^^<http://www.w3.org/2001/XMLSchema#long> .
}
				
			

Étape 5: Résolveur de Fragments de Données Liées

Pour créer une liaison liée à une source de données spécifique, vous devez créer une implémentation de

com.spaziocodice.labs.fraglink.service.impl.LinkedDataFragmentResolver

Cette interface contient une seule méthode, qui prend un motif de triple/quad en entrée et attend en sortie la liste des triplets correspondants. Le framework FragLink utilise Apache Jena, un ensemble d’outils puissant et open-source pour travailler avec des données RDF.

Bien que l’implémentation d’un résolveur soit trivial, nous allons bientôt publier un dépôt d’exemple avec un résolveur d’exemple. Restez à l’écoute !

Links

Nous serions ravis de recevoir vos questions, doutes et commentaires sur cet article de blog ! N’hésitez pas à nous contacter ou à laisser un message dans la boîte de commentaires ci-dessous.

Share this post

Laisser un commentaire

En savoir plus sur SpazioCodice

Abonnez-vous pour poursuivre la lecture et avoir accès à l’ensemble des archives.

Poursuivre la lecture