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 :
Ken Smith
CEO
+39200232383 />
+992392929
CEO
Dora Hug
Sales Director
+39232888318
+999230132
Sales Director
Lyu Key
Customer Service
+39200245351
+9900203823
Customer Service
Lia Dotti
CEO
+393628294745
+3908882382
CEO
Giovanni Rossi
1977-03-10
CTO
+3987663552
+39088882992
CTO
...
XYZ Ltd
00238238123
ABC SRL
01648827372
JYY SRL
02627717271
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 subject,
Optional predicate,
Optional object,
Optional graph,
Optional 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 :
"Ken Smith" .
"Dora Hug" .
"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 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:
SELECT ?p ?o
WHERE
{
customers:1 ?p ?o .
}
Exemple n°3 : Donnez-moi les clients (URI) et leur rôle
PREFIX foaf:
PREFIX 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:
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.