SpazioCodice

Cet article est un guide étape par étape illustrant l'utilisation de FragLink pour implémenter un serveur Linked Data Fragments, en particulier un Triple Pattern Server.

Interrogation fluide des données RDF: serveurs Linked Data Fragments propulsés par FragLink

Dans l’article précédent, nous avons présenté FragLink, un framework permettant d’ajouter des fonctionnalités Linked Data Fragments à votre application serveur.

Comme mentionné précédemment, FragLink n’est pas un serveur en soi. Il s’agit plutôt d’un module d’auto-configuration que vous pouvez facilement intégrer à votre application.

Une fois FragLink configuré, tout ce qui concerne l’API Web Linked Data Fragments est activé (par exemple, point de terminaison HTTP, métadonnées, contrôles) : bien sûr, la liaison concrète des données dépend de vous.

Cet article est un guide étape par étape illustrant l’utilisation de FragLink pour implémenter un serveur Linked Data Fragments, en particulier un Triple Pattern Server.

Le modèle de domaine (exemple)

Nous avons un projet qui stocke ses données dans une base de données relationnelle. Ce projet traite des informations personnelles sur les contacts de nos clients ; le modèle de domaine est simple (nous l’avons simplifié pour cet article).

Nous avons une liste d’entreprises ; pour chacune, nous enregistrons les contacts correspondants ainsi que leurs rôles (par exemple : représentant client, PDG, fournisseur).

Heureusement, notre entreprise est petite, donc l’ensemble des données reste limité. Voici les données disponibles au moment de la rédaction :

XYZ Ltd

VAT: 00238238123

  • Mr. Ken Smith, CEO, k.smith@xyz.org, +39200232383, +992392929 
  • Mrs. Dora Hug, Sales Director, d.hug@xyz.org, +39232888318, +999230132 
  • Mrs. Lyu Key, Customer Service, l.key@xyz.org, +39200245351, +9900203823 

ABC SRL

VAT: 01648827372

  • Mrs. Lia Dotti, CEO, lia.dotti@abc.it, +393628294745, +3908882382 
  • Mr. Giovanni Rossi, CTO, giovanni.rossi@abc.it, +3987663552, +39088882992  
  • Mr. Ugo Bianchi, Sales, ugo.bianchi@abc.it, +393857733645, +39088882765

JYY SRL

VAT: 02627717271

  • Mr. John Doe, CEO, john.doe@jyy.com, +2382917337, +9832723728 
  • Mr. Johnatan Hellis, Sales, johnatan.hellis@jyy.com, +9283829838, +29382938  

Comment représenter un tel ensemble de données?

Bien qu’il existe plusieurs choix d’ontologies pour représenter un tel (petit) ensemble de données, nous allons faire simple : nous utiliserons FOAF et DC. Voici notre ensemble de données en RDF :

				
					<rdf:RDF 
    xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" 
    xmlns:foaf="http://xmlns.com/foaf/0.1/"
    xmlns:org="http://www.w3.org/ns/org#">
  
  <foaf:Person rdf:about="https://spaziocodice.com/people/KenSmith">
    <foaf:name>Ken Smith</foaf:name>
    <foaf:title>CEO</foaf:title>
    <foaf:mbox rdf:resource="mailto:k.smith@xyz.org"/>
    <foaf:phone>+39200232383</foaf:phone>/>
    <foaf:phone>+992392929</foaf:phone>
    <org:role>CEO</org:role>
  </foaf:Person>

  <foaf:Person rdf:about="https://spaziocodice.com/people/DoraHug">
    <foaf:name>Dora Hug</foaf:name>
    <foaf:title>Sales Director</foaf:title>
    <foaf:mbox rdf:resource="mailto:d.hug@xyz.org"/>
    <foaf:phone>+39232888318</foaf:phone>
    <foaf:phone>+999230132</foaf:phone>
    <org:role>Sales Director</org:role>
  </foaf:Person>

  <foaf:Person rdf:about="https://spaziocodice.com/people/LyuKey">
    <foaf:name>Lyu Key</foaf:name>
    <foaf:title>Customer Service</foaf:title>
    <foaf:mbox rdf:resource="mailto:l.key@xyz.org"/>
    <foaf:phone>+39200245351</foaf:phone>
    <foaf:phone>+9900203823</foaf:phone>
    <org:role>Customer Service</org:role>
  </foaf:Person>

  <foaf:Person rdf:about="https://spaziocodice.com/people/LiaDotti">
    <foaf:name>Lia Dotti</foaf:name>
    <foaf:title>CEO</foaf:title>
    <foaf:mbox rdf:resource="mailto:lia.dotti@abc.it"/>
    <foaf:phone>+393628294745</foaf:phone>
    <foaf:phone>+3908882382</foaf:phone>
    <org:role>CEO</org:role>
  </foaf:Person>

  <foaf:Person rdf:about="https://spaziocodice.com/people/GiovanniRossi">
    <foaf:name>Giovanni Rossi</foaf:name>
    <foaf:birthday>1977-03-10</foaf:birthday>
    <foaf:title>CTO</foaf:title>
    <foaf:mbox rdf:resource="mailto:giovanni.rossi@abc.it"/>
    <foaf:phone>+3987663552</foaf:phone>
    <foaf:phone>+39088882992</foaf:phone>
    <org:role>CTO</org:role>
  </foaf:Person>

  ...
  
  <foaf:Organization rdf:about="https://spaziocodice.com/organizations/XYZLtd">
    <foaf:name>XYZ Ltd</foaf:name>
    <foaf:vat>00238238123</foaf:vat>
    <foaf:member rdf:resource="https://spaziocodice.com/people/KenSmith"/>
    <foaf:member rdf:resource="https://spaziocodice.com/people/DoraHug"/>
    <foaf:member rdf:resource="https://spaziocodice.com/people/LyuKey"/>
  </foaf:Organization>

  <foaf:Organization rdf:about="https://spaziocodice.com/organizations/ABCSRL">
    <foaf:name>ABC SRL</foaf:name>
    <foaf:vat>01648827372</foaf:vat>
    <foaf:member rdf:resource="https://spaziocodice.com/people/LiaDotti"/>
    <foaf:member rdf:resource="https://spaziocodice.com/people/GiovanniRossi"/>
    <foaf:member rdf:resource="https://spaziocodice.com/people/UgoBianchi"/>
  </foaf:Organization>

  <foaf:Organization rdf:about="https://spaziocodice.com/organizations/JYYSRL">
    <foaf:name>JYY SRL</foaf:name>
    <foaf:vat>02627717271</foaf:vat>
    <foaf:member rdf:resource="https://spaziocodice.com/people/JohnDoe"/>
    <foaf:member rdf:resource="https://spaziocodice.com/people/JohnatanHellis"/>
  </foaf:Organization>
</rdf:RDF>
				
			

Jusqu’ici, tout va bien. Nous avons maintenant besoin d’un point d’accès SPARQL afin que les clients, les applications et d’autres entités puissent consommer nos données.

Linked Data API: Architecture

Voici un diagramme tiré de l’article précédent:

Nous allons nous appuyer sur le projet open source Comunica en tant que client Linked Data Fragment. Dans ce contexte, il est chargé de:

  • exposer le point d’accès SPARQL,
  • recevoir les requêtes des clients,
  • exécuter les requêtes en répartissant les motifs triples entre les serveurs Linked Data Fragment disponibles.

Notre rôle est d’implémenter le serveur Linked Data Fragment en utilisant FragLink, un framework open source.

L’article précédent et le dépôt FragLink décrivent les étapes nécessaires pour créer une structure de projet. Ce post commence à partir de là, en se concentrant spécifiquement sur l’implémentation du Triple Pattern Resolver.

Le résolveur de Linked Data Fragment

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

L’interface contient une seule méthode, qui prend un motif triple/quadruple en entrée et renvoie une liste de triplets correspondants en sortie. Le framework FragLink utilise Apache Jena, un ensemble puissant et open source d’outils pour gérer les données RDF.

Notre tâche est donc “simple” : nous devons fournir l’implémentation de cette interface, et plus particulièrement de la méthode suivante :

				
					TriplePatternResponse linkedDataFragment(
                            Optional<String> subject, 
                            Optional<String> predicate, 
                            Optional<String> object, 
                            Optional<String> graph, 
                            Optional<Integer> pageNumber, 
                            HttpServletRequest request)
				
			

Le client Linked Data enverra une ou plusieurs requêtes de motifs triples via cette interface ; l’implémentation devra traduire ces requêtes en triplets correspondants (encapsulés dans une instance de TriplePatternResponse).

Par exemple, une requête comme celle-ci :

				
					?s foaf:name ?o
				
			

Devrait répondre avec tous les triplets ayant <foaf:name> comme prédicat, indépendamment du sujet ou de l’objet. Dans notre ensemble de données, cela devrait ressembler à ceci :

				
					<http://acme.com/people/KenSmith> <foaf:name> "Ken Smith" .
<http://acme.com/people/DoraHug> <foaf:name> "Dora Hug" .
<http://acme.com/people/LyuKey> <foaf:name> "Lyu Key" .
...


				
			

Parler ne suffit pas, montrez-moi le code!

Le dépôt d’exemple contient un serveur Linked Data Fragment construit sur FragLink. Notez que cet exemple a été créé en une journée ; l’objectif est d’illustrer la puissance de la production de données RDF en temps réel sans nécessiter de stockage RDF dédié.

Le dépôt est un module SpringBoot simple qui implémente le scénario Contact-Entreprise décrit ci-dessus.

Les données sont stockées dans une base de données relationnelle H2 “in-memory” (voir le fichier resources/data.sql), ce qui vous permet de lancer la démo sans vous soucier des bases de données ou du stockage.

Deux objets d’accès aux données sont chargés d’extraire et de traduire les résultats des exécutions des requêtes.

C’est tout: à part la logique d’extraction et de traduction, tout le reste (par exemple: métadonnées, contrôles) est géré par FragLink.

Si vous souhaitez exécuter l’exemple, voici ce dont vous avez besoin :

  •  Java 17 ou une version supérieure
  • Apache Maven 3.x
  • Git

Étape n°1 : Clonez le dépôt et construisez le projet

				
					> git@github.com:spaziocodice/linked-data-fragment-server-example.git

> cd linked-data-fragment-server-example.git

> mvn clean install
				
			

Vous devriez voir les messages suivants :

				
					...
[INFO] Installing  ... simple-ldf-server-1.0-SNAPSHOT.pom
[INFO] Installing  ... simple-ldf-server-1.0-SNAPSHOT.jar
[INFO] --------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] --------------------------------------------------
[INFO] Total time:  1.429 s
[INFO] Finished at: 2024-04-24T20:14:09+02:00
[INFO] --------------------------------------------------
				
			

Étape n°2 : Lancez le serveur Linked Data Fragment

				
					> cd target

> java -jar simple-ldf-server-1.0-SNAPSHOT.jar
				
			

Vous devriez voir les messages suivants :

				
					...
2024-04-24 ... <FRAGLINK-00001> : FragLink v2.0.0 has been enabled on this server.
2024-04-24 ... Started App in 2.706 seconds 
				
			

Étape n°3 : Expérimentez avec quelques requêtes SPARQL

Nous allons utiliser comunica.dev comme client Linked Data Fragment. Ouvrez votre navigateur préféré et accédez à l’adresse suivante : https://query.comunica.dev/.

L’interface utilisateur vous permet de choisir un ensemble de données parmi une liste prédéfinie. Vous pouvez également saisir manuellement l’URL d’un point d’accès SPARQL. Assurez-vous de taper dans ce champ texte : https://127.0.0.1:8080/fragments (le point d’accès du serveur que vous venez de lancer à l’étape précédente).

Vous êtes prêt. Pour commencer, saisissez une requête valide dans la zone de texte ci-dessous. Voici quelques exemples de requêtes :

Exemple n°1 : Donnez-moi tout !
				
					SELECT ?s ?p ?o
WHERE 
{
  ?s  ?p ?o  . 
}
				
			
Exemple n°2 : Donnez-moi tout sur un client
				
					PREFIX customers: <https://spaziocodice.com/customers/>

SELECT ?p ?o
WHERE 
{
  customers:1  ?p ?o  . 
}
				
			
Exemple n°3 : Donnez-moi les clients (URI) et leur rôle
				
					PREFIX foaf: <http://xmlns.com/foaf/0.1/>
PREFIX org: <http://www.w3.org/ns/org#>

SELECT ?s ?email ?role
WHERE 
{
  ?s 	foaf:mbox 	?email	. 
  ?s 	org:role 	?role 	.
}
				
			
Exemple n°4 : Donnez-moi les clients (URI) et le nom de leur entreprise
				
					PREFIX foaf: <http://xmlns.com/foaf/0.1/>

SELECT ?s ?companyName
WHERE 
{
  ?s	foaf:member ?o  . 
  ?o	foaf:name ?companyName .	
}
				
			

Rappel : le dépôt est un exemple simple ; je suis sûr qu’il contient beaucoup de redondances et que, si vous commencez à expérimenter avec d’autres requêtes, vous rencontrerez également de nombreux problèmes.

Restons concentrés sur le concept sous-jacent : nous avons une base de données relationnelle simple, et après avoir implémenté une interface directe (le contrat du serveur de motifs triples), nous avons fourni nos données au format RDF.

Cela ouvre de nombreuses possibilités, y compris des mappages dynamiques ou l’utilisation d’autres types de stockage (par exemple, NoSQL).

Amusez-vous bien !

Nous serions ravis de recevoir vos questions, doutes et retours concernant cet article de blog !
N’hésitez pas à nous contacter ou à laisser un message dans la section des 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