Cours-Gratuit
  • Accueil
  • Blog
  • Cours informatique
home icon Cours gratuits » Cours informatique » Cours programmation » Cours JAVA » Cours Framework JAVA

Cours pour démarrer avec le Framework Apache Jena

Cours pour démarrer avec le Framework Apache Jena
Participez au vote ☆☆☆☆☆★★★★★

Chapitre 6

Jena

Présentation

Compilation / Exécution

Triplets RDF

Entrées - sorties

Manipulation d’un graphe RDF

SPARQL

RDF-Schema

Présentation

Présentation

Compilation / Exécution

Triplets RDF

Entrées - sorties

Manipulation d’un graphe RDF

SPARQL

RDF-Schema

Présentation

Jena est une bibliothèque de classes Java qui facilite le développement d’applications pour le web sémantique.

? Manipulation de déclarations RDF.

? Lecture et écriture RDF/XML, Notation 3.

? Stockage en mémoire ou sur disque de connaissances RDF.

? Interpréteur SPARQL.

? Gestion d’ontologies : RDF-Schema, OWL.

Logiciel libre (licence Apache) développé (initialement) par HP.

Cette présentation est issue du tutoriel Jena :

« An Introduction to RDF and the Jena RDF API »


Présentation - Exemples utilisés dans ce chapitre

Les exemples cités ici permettent de représenter des informations sur des personnes.

VCARD () définit une représentation informatique pour des « cartes de visite » : Nom, prénom, téléphone, e-mail, date de naissance, URL, etc.

Des données VCARD peuvent être représentées en RDF :

Les ressources et prédicats sont définis dans l’URI :

Exemple

<?xmlversion="1.0"?>

<rdf:RDFxmlns:rdf="; xmlns:vCard=";>

<rdf:Descriptionrdf:about=";>

<vCard:FN>CorkyCrystal</vCard:FN>

<vCard:Nrdf:parseType="Resource"><!?? noeud nul ??>

<vCard:Family>Crystal</vCard:Family>

<vCard:Given>Corky</vCard:Given>

<vCard:Other>Jacky</vCard:Other>

<vCard:Prefix>Dr</vCard:Prefix>

</vCard:N>

<vCard:BDAY>1980-01-01</vCard:BDAY>

<vCard:TITLE>ComputerOfficerClass3</vCard:TITLE>

<vCard:ROLE>

<rdf:Bag>

<rdf:li>Programmer</rdf:li><rdf:li>Scientist</rdf:li> </rdf:Bag>

</vCard:ROLE>

</rdf:Description>

</rdf:RDF>

Compilation / Exécution

Présentation

Compilation / Exécution

Triplets RDF

Entrées - sorties

Manipulation d’un graphe RDF

SPARQL

RDF-Schema


Compilation / Exécution

? Jena peut être téléchargé à partir du site (Apache jena - Binary distribution)

? Tous les fichiers jar nécessaires à la compilation et à l’utilisation de Jena sont dans lib. Ils doivent tous être présents dans le CLASSPATH pour la compilation ou l’exécution de programmes utilisant Jena.

? On utilisera Jena 3.10.0 (requiert Java 8).

? Consulter la documentation en ligne https:

127

Triplets RDF

Présentation

Compilation / Exécution

Triplets RDF

Entrées - sorties

Manipulation d’un graphe RDF

SPARQL

RDF-Schema

Jena fournit des classes pour représenter graphes RDF (Model), ressources (Resource), propriétés (Property), littéraux (Literal). http://somewhere/JohnSmith vcard:FN "John Smith".

Exemple (Création d’un triplet)

staticStringpersonURI="http://somewhere/JohnSmith"; staticStringfullName="John?Smith";

Modelmodel=ModelFactory.createDefaultModel(); ResourcejohnSmith=model.createResource(personURI); johnSmith.addProperty(,fullName);


? Création d’un graphe.

ModelFactory est une fabrique de Model (graphes).

? createDefaultModel pour un graphe RDF « standard » en mémoire.

? createFileModelMaker pour un graphe RDF sur disque.

? createOntologyModel pour une ontologie (RDF-Schema, etc.)

? …

? Ajout d’une ressource. createResource ajoute une ressource à un Model.

Retourne une Resource.

? Ajout d’une propriété à une ressource. addProperty ajoute une propriété.

? addProperty(Property p, boolean o)

? addProperty(Property p, char o)

? addProperty(Property p, double o)

? addProperty(Property p, float o)

? addProperty(Property p, long o)

? addProperty(Property p, .Object o)

? addProperty(Property p, RDFNode o)

? addProperty(Property p, .String o)

? addProperty(Property p, .String o, .String l)

Resource et Literal sont des sous-classes de RDFNode.

Triplets RDF - Propriétés

Jena contient déjà les propriétés de

? RDF ()

, RDF.predicate

? RDF-Schema ()

RDFS.Class, RDFS.subClassOf

? VCARD (.vocabulary.VCARD)

,

? Dublin Core () DC.creator, DC.description


Triplets RDF

addProperty retourne la ressource sujet.

Exemple

ResourcejohnSmith= model.createResource(personURI)

.addProperty(,fullName)

.addProperty(VCARD.TITLE,"Officer");

Triplets RDF - Création d’un nœud nul

Exemple

StringpersonURI   ="http://somewhere/JohnSmith"; StringgivenName   ="John";

StringfamilyName ="Smith";

StringfullName   =givenName+"?"+familyName;

Modelmodel=ModelFactory.createDefaultModel();

ResourcejohnSmith

=model.createResource(personURI) .addProperty(,fullName)

.addProperty(VCARD.N, model.createResource()

.addProperty(VCARD.Given,givenName)

.addProperty(VCARD.Family,familyName));

Un Model est un ensemble de Statement.

Tout appel à addProperty crée un nouveau Statement.

La méthode listStatements() retourne un iterateur

StmtIterator qui permet de parcourir tous les Statement d’un Model.

? hasNext retourne un booléen

? nextStatement retourne le Statement suivant.

Statement permet d’accéder au sujet (getSubject), prédicat (getPredicate) et objet (getObject).


Exemple

StmtIteratoriter=model.listStatements(); while(iter.hasNext()){

Statementstmt=iter.nextStatement();

Resourcesubject=stmt.getSubject();

Propertypredicate=stmt.getPredicate(); RDFNodeobject=stmt.getObject();

.print(subject.toString());

.print("?"+predicate.toString()+"?"); if(objectinstanceofResource)

.print(object.toString()); else

.print("?\""+object.toString()+"\"");

.println("?."); }

Exemple (Sortie du programme)

anon:14df86:ecc3dee17b:-7fff.

Family"Smith".

Entrées - sorties

Présentation

Compilation / Exécution

Triplets RDF

Entrées - sorties

Manipulation d’un graphe RDF

SPARQL

RDF-Schema


Dans la classe Model :

Model write(.OutputStream out, .String lang, .String base)

? lang est le format de sortie du modèle : "RDF/XML" (défaut), "RDF/XML-ABBREV" (RDF/XML plus compact), "N3" (Notation 3).

? base : URI de base pour les URI relatives : Enlève base à toutes les URI qui commencent par base. null? Écrire des URI absolues uniquement.

Exemple

model.write();

Exemple

<rdf:RDFxmlns:rdf='' xmlns:vcard=''>

<rdf:Descriptionrdf:about='http://somewhere/JohnSmith'>

<vcard:FN>JohnSmith</vcard:FN>

<vcard:Nrdf:nodeID="A0"/>

</rdf:Description>

<rdf:Descriptionrdf:nodeID="A0">

<vcard:Given>John</vcard:Given>

<vcard:Family>Smith</vcard:Family>

</rdf:Description> </rdf:RDF>

Sortie rapide…mais les nœuds nuls ne sont pas des nœuds nuls.

Exemple

model.write(, "RDF/XML-ABBREV");

Exemple

<rdf:RDFxmlns:rdf="; xmlns:vcard=";>

<rdf:Descriptionrdf:about="http://somewhere/JohnSmith">

<vcard:FN>JohnSmith</vcard:FN>

<vcard:Nrdf:parseType="Resource">

<vcard:Family>Smith</vcard:Family>

<vcard:Given>John</vcard:Given>

</vcard:N>

</rdf:Description> </rdf:RDF>


Chargement

La méthode read de la classe Model permet de lire un document

RDF.

? read(.String url) Lecture d’un document RDF/XML.

? read(.String url, .String lang)

? read(.InputStream in, .String base, .String lang) Lecture sur un flux d’entrée d’un document au format passé, en utilisant l’URI de base passée. Si base est "" pas de conversion des URI relatives.

? Cette méthode peut être utilisée sur un InputStream retourné par la méthode open de FileManager. FileManager permet d’ouvrir des documents sans se préoccuper du mode d’accès (file, http), et en utilisant un accès plus performant (copie locale d’un document distant).

Chargement

Exemple

Modelmodel=ModelFactory.createDefaultModel(); ("","RDF/XML");

Exemple

Modelmodel=ModelFactory.createDefaultModel(); ().open(""); if(in!=null) (in,"");

Manipulation d’un graphe RDF

Présentation

Compilation / Exécution

Triplets RDF

Entrées - sorties

Manipulation d’un graphe RDF

SPARQL

RDF-Schema


Accès à une ressource / déclaration

createResource(String uri) (et getResource) de Model retournent une Resource dont l’URI est passée, ou création d’une ressource.

getProperty(Property) de Resource retourne un Statement (ou NULL). Attention : En retourne un même si plusieurs.

Exemple

StringjohnSmithURI="http://somewhere/JohnSmith/";

Resourcevcard=model.createResource(johnSmithURI);

Resourcename=vcard.getProperty(VCARD.N).getResource();

getResource de Statement retourne l’objet ressource, alors que getString retourne l’objet littéral.

Sur une Resource, getNameSpace retourne l’espace de nom, et getLocalName le nom local.

Propriétés

Parcours des déclarations concernant un prédicat donné, concernant un sujet donné :

méthode listProperties de Resource

Exemple

StmtIteratoriter=vcard.listProperties(VCARD.NICKNAME); while(iter.hasNext())

.println(iter.nextStatement().getObject().toString());

Parcours d’un graphe RDF

? listStatements de Model retourne un itérateur permettant de parcourir toutes les déclarations.

? listStatements(Resource s, Property p, RDFNode o) de Model retourne un itérateur permettant de parcourir certaines déclarations.

? listSubjects retourne un ResIterator permet de parcourir toutes les ressources qui sont sujet d’au moins une déclaration.

? listSubjectsWithProperty(Property, RDFNode) pour le parcours des ressources sujet d’un prédicat de la propriété passée, de l’objet passé.

? createProperty(string uri) retourne une Property identifiée par l’uri.

Parcours d’un graphe RDF

? Méthode générale de sélection : listStatements(Selector). Le Selector définit quelles déclarations doivent être parcourues. SimpleSelector(subject, predicate, object) permet de sélectionner simplement des déclarations.

Exemple

StmtIteratorit=model.listStatements( newSimpleSelector(null,,(RDFNode)null){ publicbooleanselects(Statements)

{returns.getString().endsWith("Smith");} });

Opérations sur les graphes

? union(Model) de Model retourne un nouveau Model, fusion du graphe passé avec le graphe courant. Les ressources de même URI sont fusionnées.

? intersection(Model) retourne un nouveau Model ne contenant que les déclarations communes.

? difference(Model) retourne un nouveau Model qui contient les déclarations qui sont dans le graphe courant mais pas dans le graphe passé.

Conteneurs

Dans Model :

? createBag

? createAlt

? createSeq

Ces trois méthodes existent en deux variantes :

? Sans paramètre. Création d’un conteneur anonyme.

? Avec paramètre String. Création d’un conteneur identifié par l’URI passée.

Sur les conteneurs : add, contains, size, etc.


SPARQL

Présentation

Compilation / Exécution

Triplets RDF

Entrées - sorties

Manipulation d’un graphe RDF

SPARQL

RDF-Schema

Utilisation en ligne de commande

Jena est fourni avec un interpréteur SPARQL pouvant être utilisé en ligne de commande.

Utilisation

? Définir la variable d’environnement JENA_HOME. (anciennes versions)

? Rendre exécutables les fichiers du répertoire bin de Jena si nécessaire.

? $JENA_HOME/bin/sparql

? --graph URL : graphe de base.

? --namedGraph URL (optionnel) : graphe nommé.

? --query FICHIER : fichier requête.

? Pas de FROM / FROM NAMED dans le fichier requête dans le cas où --graph et --namedGraph sont utilisés.

? Créer une Query à partir de la méthode create de

QueryFactory, cette méthode prenant comme paramètre une String (le texte de la requête SPARQL).

? Créer un QueryExecution à partir de la méthode create de QueryExecutionFactory, cette méthode prenant comme paramètre une Query et un Model.

? Appeler execSelect sur le QueryExecution, cette méthode retourne un ResultSet.

? Parcourir le ResultSet par hasNext et nextSolution, retournant un QuerySolution. Cette classe dispose des méthodes getResource et getLiteral qui prennent comme paramètre un nom de variable du SELECT.

? Terminer l’exécution du QueryExecution par close.

Utilisation depuis un programme Java

Exemple

().loadModel("file:personnes.n3");

StringqueryString="PREFIX?m:?<;?SELECT??

uri??nom??photo?WHERE?{??uri?m:nom??nom?.?OPTIONAL?{??uri?m: photo??photo?.?}?.?}";

Queryquery=QueryFactory.create(queryString);

QueryExecutionqexec=QueryExecutionFactory.create(query,model); try{

ResultSetresults=qexec.execSelect(); for(;results.hasNext();){

QuerySolutionsoln=results.nextSolution(); Resourceuri=soln.getResource("uri");

Resourcephoto=soln.getResource("photo");

Literalnom=soln.getLiteral("nom");

.print(uri.toString()+"?"+nom.toString()+"?"); if(photo!=null).print(photo.toString()); .println();

}

}finally{qexec.close();};


RDF-Schema

Présentation

Compilation / Exécution

Triplets RDF

Entrées - sorties

Manipulation d’un graphe RDF

SPARQL

RDF-Schema

Ontologies et Jena

Jena permet de gérer des ontologies (RDF-Schema, OWL) et de faire des raisonnements en utilisant les connaissances de l’ontologie.

Une ontologie est un Model. Et plus particulièrement un OntModel, qui est une spécialisation de Model qui contient des méthodes spécifiques aux ontologies :

? Création d’une classe : createClass retourne une OntClass (OntClass est une spécialisation de Resource)

? Création d’une propriété : createObjectProperty retourne une ObjectProperty (ObjectProperty est une spécialisation de Resource)

Création d’une ontologie

Méthode createOntologyModel de ModelFactory en passant comme paramètre :

? OntModelSpec.RDFS_MEM : Ontologie RDF-Schema en mémoire, aucun raisonnement.

? OntModelSpec.RDFS_MEM_RDFS_INF : Ontologie RDF-Schema en mémoire, raisonnement prenant en compte la transitivité des relations de spécialisation, domaine, co-domaine. ? OWL, etc.

Souvent, une ontologie est chargée à partir d’un flux : Utilisation des méthodes read (idem Model).

Élements d’une ontologie

Les éléments d’une ontologie (OntClass, ObjectProperty) sont des spécialisations de OntResource qui définit les méthodes :

? getComment, setComment, … ? getLabel, setLabel, …

? getSeeAlso, setSeeAlso, …

? getIsDefinedBy, setIsDefinedBy, …

Classes : OntClass

Exemple

Stringexns=";;

OntClassveh=m.createClass(exns+"Vehicule"); OntClassvoi=m.createClass(exns+"Voiture"); voi.addSuperClass(veh);

Exemple

OntClasscl=m.getOntClass(exns+"Vehicule");

for(ExtendedIteratori=cl.listSubClasses();i.hasNext();)

{

OntClassc=(OntClass)i.next();

.print(c.getLocalName()+"?"); }

Classes

? hasxxx, listxxx, setxxx, addxxx : listSubClasses, listSuperClasses, hasSuperClass, etc.

? listInstances retourne un itérateur sur toutes les ressources de ce rdf:type.

? listDeclaredProperties retourne un itérateur sur toutes les propriétés de cette classe. (si paramètre false uniquement la classe, si true propriétés des superclasses).

Propriétés : ObjectProperty

? hasxxx, listxxx, setxxx, addxxx :

? subProperty, superProperty

? domain Si plusieurs domaines : intersection des domaines ? range Si plusieurs range : intersection des range

Exemple

OntClassmot=m.createClass(exns+"Moteur");

ObjectPropertypcomp=m.createObjectProperty(exns+"composant"); ObjectPropertypmot=m.createObjectProperty(exns+"moteur"); pmot.addSuperProperty(pcomp); pmot.addDomain(veh); pmot.addRange(mot);

createDatatypeProperty pour les propriétés dont le co-domaine est formé de littéraux.


Habituellement, l’ontologie est stockée dans un (des) fichier, et les connaissances factuelles dans un (des) fichier…

? Créer un Model pour l’ontologie.

? Créer un Model pour les faits.

? Créer un modèle (permettant les inférences de type RDF-Schema) qui est l’union des deux.

? Travailler sur le modèle permettant les inférences.

Exemple (Ontologie : )

<?xmlversion="1.0"?>

<!DOCTYPErdf:RDF[

<!ENTITYrdf''>

<!ENTITYrdfs''>

<!ENTITYex'#'>

<!ENTITYxsd";> ]>

<rdf:RDFxmlns:rdf="&rdf;"xmlns:rdfs="&rdfs;"xmlns:ex="&ex;"xmlns ="&ex;">

<rdf:Descriptionrdf:about="&ex;mum">

<rdfs:subPropertyOfrdf:resource="&ex;parent"/>

</rdf:Description>

<rdf:Descriptionrdf:about="&ex;parent">

<rdfs:range rdf:resource="&ex;Person"/>

<rdfs:domainrdf:resource="&ex;Person"/>

</rdf:Description>

<rdf:Descriptionrdf:about="&ex;age">

<rdfs:rangerdf:resource="&xsd;integer"/> </rdf:Description>


Exemple (Faits : )

<?xmlversion="1.0"?>

<!DOCTYPErdf:RDF[

<!ENTITYrdf''>

<!ENTITYex'#'> ]>

<rdf:RDFxmlns:rdf="&rdf;"xmlns:ex="&ex;">

<ex:Teenagerrdf:about=";>

<ex:mumrdf:resource="rosy"/>

<ex:age>13</ex:age>

</ex:Teenager>

</rdf:RDF>

Exemple

publicstaticvoidprintStatements(Modelm,Resources, Propertyp,Resourceo)

{ for(StmtIteratori=m.listStatements(s,p,o);i.hasNext();)

{

Statementstmt=i.nextStatement();

.println("?-?"+PrintUtil.print(stmt)); }

}

Exemple

publicstaticvoidmain(Stringargs[]){

().loadModel("file:exemplerdfs/rdfs. rdf");

().loadModel("" );

InfModelinfmodel=ModelFactory.createRDFSModel(schema,data);

Resourcecolin=infmodel.getResource(" ");

.println(colin); printStatements(infmodel,colin,,null);

ResourcePerson=infmodel.getResource("#

Person"); printStatements(infmodel,Person,,null); }


? RDF:types de colin :

? #Teenager Déclaration du type dans le fichier RDF.

? #Person Parce que : il a une propriété mum, et que la propriété mum est une spécialisation de parent… or, le domaine de parent est Person

? rdfs:Resource

? RDF:types de Person

? rdfs:Class

? rdfs:Resource

? et rosy est une Person

Ontologies et connaissances factuelles - Vérifications

Exemple

ValidityReportvalidity=infmodel.validate(); if(validity.isValid())

.println("OK"); else

{

.println("Conflicts");

for(Iteratori=validity.getReports();i.hasNext();) {

ValidityReport.Reportreport=

(ValidityReport.Report)i.next();

.println("?-?"+report);

}

}

Conflicts

-Error(dtRange)#agehasa typedrangeDatatype[;

.BigInteger]thatisnotcompatiblewith"13"

Correction du document RDF

<ex:agerdf:datatype=";>13< /ex:age>

Decouvrir ces documents

  • Guide de démarrage avec le Framework Apache HBase

    Guide de démarrage avec le Framework Apache HBase

  • Démarrer avec Apache luence support de formation avancé

    Démarrer avec Apache luence support de formation avancé

  • Formation sur le développement web avec le Framework Apache Cocoon

    Formation sur le développement web avec le Framework Apache Cocoon

  • Documentation pour débuter avec le Framework Apache Wicket et Eclipse JEE

    Documentation pour débuter avec le Framework Apache Wicket et Eclipse JEE

  • Manuel d’utilisation d’Apache Mesos Framework [Eng]

    Manuel d’utilisation d’Apache Mesos Framework [Eng]

  • Manuel avancé sur l’utilisation du Framework JAVA apache Accumulo

    Manuel avancé sur l’utilisation du Framework JAVA apache Accumulo

  • Cours Java pour débuter avec le Framework Apache Nutch [Eng]

    Cours Java pour débuter avec le Framework Apache Nutch [Eng]

  • Cours développement d'application web avec le Framework Apache Pivot [Eng]

    Cours développement d'application web avec le Framework Apache Pivot [Eng]

Articles connexes

  • Cours de soutien scolaire bénévole - Informations et conseils
  • 16 meilleurs IDE / EDI pour en Django Python (Comparatif)
  • Tuto Python & Django : créer une page web
  • Comment devenir agent immobilier au Québec ?
  • Plateforme freelance : la meilleure façon de démarrer en indépendant
  • Placement d'Or : Règles et astuces pour réussir son investissement
  • Comment créer et convertir vos vidéos pour vos cours en ligne ?
  • Exercice Access 2003 : gestion des cours avec requêtes
  • Contactez-nous
  • A propos de nous
  • On recrute
  • Rechercher dans le site
  • Politique de confidentialité
  • Droit d'auteur/Copyright
  • Conditions générales d'utilisation
  • Plan du site
  • Accueil
  • Blog
  • Finance et compta.
  • Formations Pro.
  • Logiciels & Apps
  • Organisation
  • Cours informatique
  • Aide à la rédaction
  • Etudes et Metiers
  • Science et Tech
  • Titans de la Tech
id 11354 02