RDF et la forme N3

RDF et la forme N3

Bonjour, au menu ajourd’hui: RDF et la forme N3, avec quelques exemples en JAVA avec l’aide du framework Jena.

Définition

Bon, je pense qu’une petite définition de ces termes barbare s’impose:

  • RDF: Resource Description Framework. Difficile d’expliquer en quelque mots ce que veut dire RDF! C’est une représentation de données définie pour être utilisé sur le web. Le format utilisé peut être divers (N3, XML, …) Il est basé sur un ensemble de triplet sujet, prédicat, object. (on pourrait dire sujet, verbe, complément)
    • Le sujet représente la ressource à décrire.
    • Le prédicat représente un type de propriété applicable à cette ressource
    • L’objet représente une donnée ou une autre ressource

    Le sujet, et l’objet dans le cas où c’est une ressource, peuvent être identifiés par une URI ou être des nœuds anonymes. Le prédicat est nécessairement identifié par une URI.
    RDF n’a pas de syntaxe précise, c’est une représentation en graphe qui peut être mis en oeuvre par diverse syntaxe (N3, XML) ce qui permet une abstraction au niveau de l’expression et une meilleur interopérabilité.

  • N3 : Notation 3. Une des formes d’écriture du RDF qui utilise de simple triplets texte séparés par des ‘.’
    sujet predicat complement.
    sujet predicat complement.
  • SPARQL : language de requêtage inspiré de SQL qui permet d’intérroger des données RDF.Trés proches de la Notation 3 du RDF et donc très simple d’utilisation.
  • Jena : framework Java pour le web sémentique intégrant entre autre les technologies RDF et SPARQL

Exemple de RDF-N3 en Java en utilisant Jena

Fichier RDF-N3 d’exemple:


@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
@prefix Ex: <http://www.societe.com/Exemple#> .

<http://www.companie.com/companie1> Ex:is “Companie” .
<http://www.companie.com/companie2> Ex:is “Companie” .
<http://www.companie.com/immeuble1> Ex:is “Immeuble1” .
<http://www.companie.com/immeuble2> Ex:is “Immeuble2” .
<http://www.companie.com/immeuble3> Ex:is “Immeuble3” .

<http://www.companie.com/companie1> Ex:has <http://www.companie.com/immeuble1> .
<http://www.companie.com/companie1> Ex:has <http://www.companie.com/immeuble2> .
<http://www.companie.com/companie2> Ex:has <http://www.companie.com/immeuble3> .

  1. La première partie définie les préfixes utilisé dans le RDF, ces préfixes permettent de définir des espace de nommage (namespace) pour les prédicats utilisé. Le premier préfixe obligatoire étant celui du RDF, je défini ensuite un préfixe pour mon exemple (le préfixe Ex)
  2. La deuxième partie définie mes différents objet, je définie ici deux companie et trois immeubles. Le prédicat utilisé est Ex:is pour définir ce qu’est un objet (ici, Companie ou Immeuble), cela me permet en quelque sorte de typé mes objet.
  3. La troisième partie définie les liens entre les objet, j’utilise pour cela le prédicat ‘Ex:has’ pour dire l’appartenance d’un immeuble à une companie.

On peut remarque deux choses importante, chaque objet est définie par une URI unique définie entre les charactère < et >, et chaque ligne est terminée par un ‘.’

Chargement du fichier N3 en JAVA grâce à Jena


Model model = ModelFactory.createDefaultModel();
InputStream is = FileManager.get().open( "ex.n3" );
model.read(is, "", "N3");

Jena offre tout ce qu’il faut pour très rapidement créer un model basé sur un fichier n3 tel que celui définit dans la partie précédente. Le code s’éxplique de lui-même, on créer un nouveau lmodel, on charge le fichier dans un InputStream, on dit au model de lire l’InputStream en lui précisant que c’est du type N3 (Jena accèpte beaucoup d’autres type de RDF : RDF-XML, OWL, …)

Requêtage en SPARQL grâce à Jena


String queryString = "SELECT ?x WHERE { ?x Ex:is \"Immeuble\" . "
+ " <http://www.companie.com/companie1> Ex:has ?x}";
Query query = QueryFactory.create(queryString) ;
QueryExecution qexec = QueryExecutionFactory.create(query, model) ;
try
{
ResultSet results = qexec.execSelect() ;
ResultSetFormatter.out(System.err, results, query) ;
}
finally { qexec.close() ; }

Ici in définie tout d’abord le requête SPARQL. On fait une recherche d’un élément que nous appelons ?x, cet élément est définie de la sorte:

  • il est un Immeuble : ?x Ex:is “Immeuble”
  • il appartient à companie1 : <http://www.companie.com/companie1> Ex:has ?x

Les deux critère sont séparé par des ‘.’ qui forment des ET logique, la clause WHERE de la requête SPARQL étant directement du RDF où on a remplacé ce que l’on cherche par ?x

Pour finir, on interroge le model puis on récupère un ResultSet que l’on pourra ensuite itérer pour en lire tout les résultats. Globalement, tout ceci est très proche de l’utilisation du SQL en JDBC et donc la pluspart des développeur JAVA ne devrait avoir aucun problème avec ceci.

Resources

3 thoughts on “RDF et la forme N3

  1. Cher Loïc ( et les autres lecteurs ), je voudrais attirer votre attention sur une utilisation du langage N3 comme langage de règles et de requêtes.

    J’exploite ceci à fond avec EulerGUI, un petit envirronnement de développement Open Source.
    EulerGUI peut lire du RDF, N3, OWL, UML XMI, eCore XMI; il peut exécuter des règles N3 avec 3 moteurs différents (Prolog, Drools/Java, CWM/Python). Le projet compagnon est Déductions, qui inclut des règles N3 pour générer des
    formulaires, convertir UML en OWL, etc.

    EulerGUI manual:
    http://eulergui.svn.sourceforge.net/viewvc/eulergui/trunk/eulergui/html/documentation.html

    Déductions: Java Swing application generator from OWL model and N3 logic rules:
    http://deductions.svn.sourceforge.net/viewvc/deductions/html/GUIgenerator.html

  2. Article très intéressant. J’aimerais progresser sur le sujet : connaissez-vous des articles “récapitulatifs” sur les questions de recherche sémantique utilisant ces normes ? Accessoirement, des exemples de sites ?

Comments are closed.

Comments are closed.