// Installation du package dotNetRDF (version epinglee pour reproductibilite)
#r "nuget: dotNetRDF, 3.2.1"- dotNetRDF
Navigation : Index | 2-RDFBasics >>
A la fin de ce notebook, vous saurez : 1. Situer le Web sémantique dans l’histoire du Web et la vision de Tim Berners-Lee 2. Identifier les couches de la pile technologique du Web sémantique (RDF, SPARQL, OWL, SHACL) 3. Installer et configurer la bibliotheque dotNetRDF dans un environnement .NET Interactive 4. Créer et afficher votre premier graphe RDF (“Hello World” sémantique)
| Concept | Description |
|---|---|
| Web sémantique | Extension du Web ou l’information est comprehensible par les machines |
| RDF | Modèle de données base sur des triplets (sujet-predicat-objet) |
| dotNetRDF | Bibliotheque C# open-source pour manipuler des données RDF |
| Triplet | Unite fondamentale de RDF : une assertion liant deux ressources |
En 2001, Tim Berners-Lee, inventeur du World Wide Web, publie avec James Hendler et Ora Lassila un article fondateur dans Scientific American intitule “The Semantic Web”. Sa vision : un Web ou les informations ne sont pas seulement lisibles par les humains, mais également comprehensibles et exploitables par les machines.
Le Web classique (Web 1.0/2.0) repose sur des documents HTML lies entre eux par des hyperliens. Le Web sémantique ajoute une couche de sens en structurant les données selon des standards ouverts.
L’expression « Layer Cake » (gâteau en couches) désigne le diagramme d’architecture du Web sémantique, popularisé par Tim Berners-Lee lors de son keynote à la conférence XML 2000 et raffiné par la suite par le W3C Semantic Web Activity Group. Il représente la stratification des standards (URI -> RDF -> RDFS -> SPARQL -> OWL -> SHACL -> Trust/Proof) où chaque couche s’appuie sur les précédentes.
Le W3C (World Wide Web Consortium) a défini une architecture en couches pour le Web sémantique :
flowchart TD
APP["Applications"] --> TPL["Trust / Proof / Logic"]
TPL --> OWL["OWL (Ontologies)"]
TPL --> SHACL["SHACL (Shapes)"]
OWL --> SPARQL["SPARQL (Requetes)"]
SHACL --> SPARQL
SPARQL --> RDFS["RDFS (Schema / Vocabulaire)"]
RDFS --> RDF["RDF (Modele de donnees)"]
RDF --> SYN["XML / JSON-LD / Turtle (Syntaxe)"]
SYN --> URI["URI / IRI (Identifiants)"]
URI --> UNI["Unicode (Encodage)"]
| Couche | Standard | Rôle | Notebook(s) de la serie |
|---|---|---|---|
| Identifiants | URI / IRI | Nommer de facon unique chaque ressource | SW-2 |
| Modèle de données | RDF | Representer l’information en triplets | SW-2, SW-3 |
| Schema | RDFS | Définir des classes et proprietes | SW-6 |
| Requêtes | SPARQL | Interroger des graphes RDF | SW-4 |
| Ontologies | OWL | Raisonnement logique sur les données | SW-7 |
| Contraintes | SHACL | Valider la conformite des données | SW-8 |
Point cle : Chaque couche s’appuie sur les précédentes. RDF est la fondation sur laquelle repose tout le reste.
La couche RDF (Resource Description Framework) repose sur le modèle abstrait défini dans RDF 1.1 Concepts and Abstract Syntax (Cyganiak, Wood, Lanthaler (eds.), Recommandation W3C, 25 février 2014) : un graphe est un ensemble de triplets (sujet-prédicat-objet) dont les composants sont des IRI, des blank nodes ou des littéraux. Ce modèle est celui que la bibliothèque dotNetRDF (
dotnetrdf.org, open-source) implémente et que ce notebook manipule.
Le Web sémantique repond a plusieurs besoins concrets :
| Problème du Web classique | Solution du Web sémantique |
|---|---|
| Données en silos (chaque site a son format) | Standards ouverts (RDF, SPARQL) |
| Liens entre documents, pas entre données | Liens entre entites (Linked Data) |
| Recherche par mots-cles uniquement | Requêtes structurees (SPARQL) |
| Pas de raisonnement automatique | Inference logique (OWL, RDFS) |
Exemples d’applications reelles : - Wikidata : base de connaissances structuree de Wikipedia - DBpedia : extraction automatique de données RDF depuis Wikipedia - Schema.org : vocabulaire utilise par Google, Bing, Yahoo pour le SEO sémantique - Graphes de connaissances : Google Knowledge Graph, Amazon Product Graph
dotNetRDF est une bibliotheque open-source C# pour travailler avec RDF. Elle fournit : - Manipulation de graphes RDF en memoire - Lecture/ecriture dans 10+ formats de serialisation - Moteur de requêtes SPARQL - Support pour les Triple Stores - Integration avec des bases de données RDF (Fuseki, Blazegraph, etc.)
Installons le package NuGet dans notre environnement .NET Interactive.
La commande #r "nuget: ..." est spécifique a .NET Interactive et permet d’installer des packages NuGet directement dans le notebook. L’installation telecharge la bibliotheque et ses dependances.
Note technique : Nous epinglons la version
3.2.1pour garantir la reproductibilite. Sans version explicite, le notebook pourrait se comporter differemment dans le futur si une nouvelle version introduit des changements incompatibles.
Verifions que les espaces de noms principaux de dotNetRDF sont accessibles.
dotNetRDF charge avec succes.
Espaces de noms disponibles : VDS.RDF, VDS.RDF.Parsing, VDS.RDF.Writing
Si l’exécution s’est deroulee sans erreur, les trois espaces de noms principaux sont prets :
| Espace de noms | Contenu | Usage |
|---|---|---|
VDS.RDF |
Classes de base (Graph, Triple, INode) |
Creation et manipulation de graphes |
VDS.RDF.Parsing |
Parsers (TurtleParser, RdfXmlParser) |
Lecture de fichiers RDF |
VDS.RDF.Writing |
Writers (NTriplesWriter, RdfXmlWriter) |
Serialisation de graphes |
Nous allons créer un graphe RDF minimal contenant deux triplets, puis les afficher. Cela illustre les opérations fondamentales : 1. Créer un graphe vide 2. Créer des noeuds (URI et literal) 3. Asserter des triplets 4. Parcourir et afficher les triplets
Étape 1 : Creation d’un graphe vide
Un graphe RDF est un conteneur de triplets. La classe Graph est l’implementation standard de l’interface IGraph dans dotNetRDF.
A ce stade, nous avons créé un graphe vide. Un graphe RDF est une structure de données qui contiendra des triplets.
| Propriete | Valeur actuelle |
|---|---|
| Nombre de triplets | 0 |
| URI de base | null (par defaut) |
| Espaces de noms | Predefinis (rdf, rdfs, xsd) |
Le graphe est pret a recevoir des triplets que nous allons ajouter dans la cellule suivante.
Étape 2 : Creation de noeuds et assertion de triplets
Nous allons maintenant créer des noeuds et les relier par des triplets. Un triplet se compose de : - Sujet : la ressource decrite (un noeud URI) - Predicat : la relation/propriete (un noeud URI) - Objet : la valeur ou ressource liee (noeud URI ou noeud literal)
using VDS.RDF;
using System;
IGraph g = new Graph();
// Creation des noeuds URI (sujet et predicat)
IUriNode dotNetRDF = g.CreateUriNode(UriFactory.Create("http://www.dotnetrdf.org"));
IUriNode says = g.CreateUriNode(UriFactory.Create("http://example.org/says"));
// Creation des noeuds literals (objets)
ILiteralNode helloWorld = g.CreateLiteralNode("Hello World");
ILiteralNode bonjourMonde = g.CreateLiteralNode("Bonjour tout le Monde", "fr");
// Assertion des triplets dans le graphe
g.Assert(new Triple(dotNetRDF, says, helloWorld));
g.Assert(new Triple(dotNetRDF, says, bonjourMonde));
Console.WriteLine($"Nombre de triplets dans le graphe : {g.Triples.Count}");
Console.WriteLine();
// Affichage des triplets
foreach (Triple t in g.Triples)
{
Console.WriteLine(t.ToString());
}Nombre de triplets dans le graphe : 2
http://www.dotnetrdf.org/ , http://example.org/says , Hello World^^http://www.w3.org/2001/XMLSchema#string
http://www.dotnetrdf.org/ , http://example.org/says , Bonjour tout le Monde@fr
Nous avons créé un graphe contenant deux triplets qui partagent le même sujet et le même predicat, mais différent par l’objet :
| Triplet | Sujet | Predicat | Objet |
|---|---|---|---|
| 1 | <http://www.dotnetrdf.org> |
<http://example.org/says> |
"Hello World" |
| 2 | <http://www.dotnetrdf.org> |
<http://example.org/says> |
"Bonjour tout le Monde"@fr |
Types de noeuds utilises :
| Type | Interface | Exemple | Rôle |
|---|---|---|---|
| URI Node | IUriNode |
http://www.dotnetrdf.org |
Identifie une ressource (sujet ou predicat) |
| Literal Node | ILiteralNode |
"Hello World" |
Valeur textuelle (objet) |
| Literal avec langue | ILiteralNode |
"Bonjour tout le Monde"@fr |
Valeur avec etiquette de langue |
Point cle : La méthode
g.Assert()ajoute un triplet au graphe. La méthodeUriFactory.Create()interne les URIs pour optimiser la memoire et les comparaisons d’egalite.
Attention : La sortie affichée par
ToString()n’est pas une syntaxe RDF standard. C’est une representation de debogage. Pour une serialisation conforme, il faut utiliser un Writer (cf. SW-2).
Ce notebook est le premier d’une serie de notebooks progressifs organises en 4 parties, couvrant l’ensemble du spectre du Web sémantique.
| # | Notebook | Duree | Sujet |
|---|---|---|---|
| 1 | SW-1-Setup (ce notebook) | 20 min | Installation, contexte, premier graphe |
| 2 | SW-2-RDFBasics | 45 min | Triplets, types de noeuds, serialisation |
| 3 | SW-3-GraphOperations | 50 min | Lecture, ecriture, fusion, listes RDF |
| 4 | SW-4-SPARQL | 45 min | Query Builder, SELECT, FILTER, OPTIONAL |
| # | Notebook | Duree | Sujet |
|---|---|---|---|
| 5 | SW-5-LinkedData | 50 min | DBpedia, Wikidata, requêtes federees |
| 6 | SW-6-RDFS | 40 min | Vocabulaire RDFS, inference, hiérarchies |
| 7 | SW-7-OWL | 50 min | OWL 2, ontologies, raisonnement |
| # | Notebook | Duree | Sujet |
|---|---|---|---|
| 8 | SW-8-Python-SHACL | 50 min | SHACL : validation et qualite des donnees RDF |
| 9 | SW-9-Python-JSONLD | 45 min | JSON-LD : le Web semantique rencontre JSON |
| 10 | SW-10-Python-RDFStar | 40 min | RDF 1.2 (RDF-Star) : assertions sur des assertions |
| 11 | SW-11-Python-KnowledgeGraphs | 40 min | Graphes de connaissances : construction et exploration |
| # | Notebook | Duree | Sujet |
|---|---|---|---|
| 12 | SW-12-Python-GraphRAG | 55 min | GraphRAG : graphes de connaissances et LLMs |
| 13 | SW-13-Python-Reasoners | 50 min | Comparaison des raisonneurs OWL |
Duree totale estimee : environ 10 heures de travail pratique.
| Élément | Ce que nous avons appris |
|---|---|
| Web sémantique | Vision de Tim Berners-Lee, pile W3C, données comprehensibles par les machines |
| dotNetRDF | Bibliotheque C# pour RDF, installee via NuGet |
| Graphe RDF | Conteneur de triplets, créé avec new Graph() |
| Triplet | Sujet-Predicat-Objet, asserte avec g.Assert() |
| Noeuds | IUriNode (ressources), ILiteralNode (valeurs) |
Dans le notebook suivant (SW-2-RDFBasics), nous approfondirons : - Les différents types de noeuds RDF (URI, Blank, Literal type/langue) - La serialisation dans plusieurs formats (NTriples, RDF/XML, Turtle) - La lecture de fichiers RDF existants
Navigation : Index | 2-RDFBasics >>
Ce premier notebook a pose les fondations du Web sémantique en couvrant trois aspects essentiels. D’une part, le contexte historique : la vision de Tim Berners-Lee d’un Web comprehensible par les machines, concrétisée par la pile technologique du W3C (URI, RDF, RDFS, SPARQL, OWL, SHACL). D’autre part, l’installation et la configuration de dotNetRDF, la bibliotheque C# qui nous accompagnera tout au long de la serie. Enfin, la creation de notre premier graphe RDF, illustrant le modèle fondamental des triplets (sujet-predicat-objet) et les différents types de noeuds (URI, literal, literal avec langue).
Les concepts maitrisés ici – graphe, triplet, noeuds URI et literals, méthode Assert() – constituent le socle sur lequel s’appuient tous les notebooks suivants. La distinction entre IUriNode et ILiteralNode est particulierement importante car elle conditionne la maniere dont les données sont representees et interrogees.
Dans le notebook suivant (SW-2-RDFBasics), nous approfondirons ces bases avec les différents formats de serialisation (Turtle, N-Triples, RDF/XML, JSON-LD), les blank nodes, et la lecture de fichiers RDF existants.
Pour confirmer que votre environnement est correctement configure, créez un petit graphe RDF et affichez le nombre de triplets qu’il contient.
Objectif : créer un graphe avec un seul triplet de votre choix (par exemple <http://example.org/moi> <http://xmlns.com/foaf/0.1/name> "Votre nom"), puis afficher g.Triples.Count.
Completez la cellule ci-dessous : decommentez les étapes suggerees et remplacez les valeurs par les votres.
// Exercice : validez votre installation dotNetRDF
// Etapes suggerees (decommentez et completez) :
// using VDS.RDF;
// IGraph g = new Graph();
// IUriNode moi = g.CreateUriNode(UriFactory.Create("http://example.org/moi"));
// IUriNode name = g.CreateUriNode(UriFactory.Create("http://xmlns.com/foaf/0.1/name"));
// ILiteralNode monNom = g.CreateLiteralNode("Votre nom");
// g.Assert(new Triple(moi, name, monNom));
// Console.WriteLine($"Nombre de triplets : {g.Triples.Count}");
Console.WriteLine("Exercice a completer");Exercice a completer
dotnetrdf.org) pour la manipulation de graphes RDF, utilisee tout au long de cette serie de notebooks.