Affichage des articles dont le libellé est Protege. Afficher tous les articles
Affichage des articles dont le libellé est Protege. Afficher tous les articles

02/01/2015

inserer un fichier smagstructure.owl sur le serveur fuseki

D'après la doc de Fuseki (http://jena.apache.org/documentation/serving_data/)
sous Linux ou windows

0. Ruby doit être installé sur votre pc
1. créez votre fichier avec Protégé (http://fr.wikipedia.org/wiki/Prot%C3%A9g%C3%A9_(logiciel))
2. décompressez le répertoire Fuseki sur votre disque dur
3. rendre les fichiers s-put, s-get exécutables (chmod)
4. se placer dans le répertoire fuseki où se trouvent les fichiers s-put et s-get
5. y copier le fichier précédemment créé avec Protégé


Pour insérer des informations : 
ruby s-put http://fuseki-smag0.rhcloud.com/ds/data default smagstructure.owl

Pour récupérer les données :
ruby s-get http://fuseki-smag0.rhcloud.com/ds/data default

ceci insère/récupère des données dans le graphe par défaut "default", il est possible de créer vos propres graphes, pour "sectoriser" les informations en remplacant "default" par un nom de votre choix, faites attention à ne pas remplacer des infos déjà existantes dans un graphe !!! Dans le doute, vous pouvez laisser "default"


le resultat est ensuite visible là : http://fuseki-smag0.rhcloud.com/ds/query?query=select+*+where+%7B%3Fs+%3Fp+%3Fo%7D&output=xml&stylesheet=%2Fxml-to-html.xsl

24/03/2014

Créer une interface pour visualiser les ontologies avec Processing

Un petit tutoriel ?

Ca fait un bout de temps que je cherche, mais là je pense être sur une bonne piste. Le but étant de pouvoir créer facilement l'interface d'une application, en décrivant ses étapes dans une ontologie.
Après quelques tests et , l'utilisation de Processing semble être une piste encourageante  ;-).

Et même permettre à des non programmeurs de créer des applications, simplement en les décrivant !

Voici donc la recette d'un "Processing de HelloRdf à la sauce Jena", récupérant les information dans une ontologie (RDF/OWL), le but étant ensuite de récupérer les informations décrites dans la méthode diamond.owl ou de toute autre méthode écrite en rdf/owl pour créér l'application adéquate ;-).
On devrait de la même manière pouvoir visualiser des requêtes Sparql qui retournent des flux formatés RDF.

Pour ceux qui sont trop pressés, le fichier source est disponible ici ( Clic sur Fichier, puis télécharger pour récupérer l'archive complète , A ouvrir avec Processing)
-   helloRdf.zip 
- une autre version avec visualisation de toutes les classes Smag0touteclasseOK


" Processing de HelloRdf à la sauce Jena"

Ingrédients : 

- 1 petit fichier owl/rdf ,
- quelques lignes dans un sketch Processing ,
- quelques librairies Jena pour lier le tout.

Instructions : 

1 : Commençons par préparer nos outils de travail. 


Téléchargez et décompressez, si ce n'est déjà fait, les trois outils suivants. Vous trouverez sur chacun des sites de la documentation détaillée pour l'installation et l'utilisation  :
  1. Protege (version utilisée 4.3.0)
  2. Processing (version utilisée 2.1.1)
  3. Jena (version utilisée 2.11.1)
Un tutoriel de prise en main de chacun de ces logiciels est disponible tout en bas de cette page pour ceux qui ne les maîtriseraient pas  ;-).

Protege et Processing sont des applications et vous pouvez les utiliser directement, par contre, pour Jena, on va seulement utiliser les librairies, comme le décrit Ian Dickinson dans son tutoriel dédié à l'intégration de Jena dans Eclipse :
Commencez par lancer Processing et créez un nouveau sketch vide (un sketch étant un programme dans Processing)  et enregistrez le, par exemlpe sous le nom "helloRdf".




Ceci devrait vous créer un nouveau répertoire "helloRdf" dans Mesdocuments/Processing qui est le répertoire par défaut des sketches de Processing , et à l'intérieur de celui-ci, un fichier helloRdf.pde. Pour visualiser ce répertoire, vous pouvez utiliser le menu Sketch/Show Sketch Folder de l'application Processing.








Comme décrit pour l'intégration de Jena dans Eclipse (Blog de Ian Dickinson) nous allons intégrer les bibliothèques de Jena.

Commencez par créer un répertoire
"code" dans le répertoire helloRdf, juste à côté (ou au dessous ;-) du fichier helloRdf.pde. Profitez en également pour créer un répertoire "data" qui nous servira par la suite pour y stocker les fichiers de données :



Rendez-vous ensuite dans le répertoire ou vous avez décompréssé Jena et copiez toutes les librairies (.jar) se trouvant dans le répertoire lib et collez -les dans le répertoire "code" que vous avez créé précedemment dans le répertoire du sketch helloRdf.








Maintenant que nous sommes prêts, mettons-nous au travail.


2 : Création de l'architecture du sketch Processing :


Processing étant basé sur Java , on peut y intégrer toute sorte de package de la même manière, avec import.
import com.hp.hpl.jena.rdf.model.Model;
import com.hp.hpl.jena.rdf.model.Resource;

Insérez ensuite les deux fonctions primordiales de Processing qui permettent de mettre en place (setup) et de dessiner (draw) :

void setup(){

}

void draw(){
}

A l'interieur de la fonction setup(), saisissez les lignes suivantes pour déterminer la taille de l'application et sa couleur de fond : 

  size(300, 300);
  background(255,255,128);


Cliquez ensuite sur l'icone du triangle (ou CTRL+R) pour executer votre code :





Vous devriez voir apparaitre une fenetre identique à celle-ci :



Vous pouvez tester avec d'autres valeurs pour voir leur effet :
size (largeur de la fenêtre, hauteur de la fentre);
background(rouge, vert, bleu, alpha);

Bien ! maintenant que nous savons utiliser Processing, passons aux choses sérieuses : Le paramétrage de cette application grâce à un fichier la décrivant, j'ai nommé l'ontologie "hello.owl"


3. Création de l'ontologie de configuration hello.owl

Commençons par une ontologie très simple, composée d'un seul "Individual", on ne peut pas faire plus simple comme ontologie .
Lancez Protégé et cliquez sur l'onglet "Individuals" :


Cliquez ensuite sur le losange violet avec un plus (attention ! celui qui se trouve dans la fenêtre Individuals, car il y en a plusieurs) :



Créez un nouvel "Individual", c'est à dire une nouvelle Entité (ou Instanciation) et nommez la ProcessingConfiguration en respectant les majuscules :




Le nouvel Individual doit apparaitre dans la fenêtre correspondante :






Profitez-en pour sauvegarder votre fichier "hello.owl" au format (RDF/XML) dans le répertoire "data" du sketch HelloRdf que nous avons précédemment créé avec Processing, par la commande File / SaveAs :


 Enregistrement au format (RDF/XML) dans le répertoire data du sketch HelloRdf




Pour info, il arrive assez régulièrement que Protégé bloque, ou plante carrément quand on tente de cliquer sur un élément tout récemment créé. Si ça vous arrive aussi, pensez à sauvegarder régulièrement ;-).

Ondevrait ensuite pouvoir modifier l'entité ProcessingConfiguration, lors du test et de la confection des copies d'écrans, ça semble bloquer... ok je supprimme cette entité (losange avec une croix dessus) et je la recréé depuis l'onglet Entité en cliquant sur le plus situé à côté de "membres"



Création de l'Entité ProcessingConfiguration :




Cliquez maintenant sur cette Entité, puis sur DataPropertyAssertion, pour lui ajouter des propriétés sizeX, sizeY, background, (grâce aux trois boutons verts) vous devez enregistrer les valeurs une par une et valider à chaque fois :




Voici l'Individual ProcessingConfiguration avec ses propriétés ( attention dataProperty et non Object Property) :



Sauvegardez de nouveau votre fichier "hello.owl" , il est prêt à être utilisé par notre sketch HelloRdf !

4. Les fondations de notre applications étant posés, attaquons nous au bati ! Ah! Tiens ! c'est plus une recette ???

Nous aurons besoin deux deux nouvelles classes dans le sketch HelloRdf : l'une pour instancier notre application et une autre servant d'utilitaire pour la lecture du fichier..


En cliquant dans Processing sur le petit triangle vers le bas vous pourrez créer un "NewTab"... et bien créez en deux : l'un nommé "Application", et l'autre  "OwlFile" et remplissez les comme suit  ( n'oubliez pas de modifier également le premier fichier ( HelloRdf avec le setup qui instancie l'application et récupère les valeurs de cette application !)








code complet de la classe Application : 


class Application {

  String defaultInputFileName="hello.owl";
  int sizeX = 10;
  int sizeY = 20;
  color background = color(0, 0, 0);
  Model model = ModelFactory.createDefaultModel();
  String NS;
  String configURI;


  Application() {
    OwlFile owlFile = new OwlFile(defaultInputFileName);
    creation(owlFile.model);
  } 

  void creation(Model _model) {
    model = _model;
    NS = model.getNsPrefixURI("");
    println("Namespace : "+NS);
    //model.write(System.out);
    // recupere la configuration pour Processing, mais possibilite de creer d'autres fichiers de config selon les supports (html5, Java, ruby, python...) !
    readConfiguration(model, "Processing"); 

    // Affiche la configuration
    println("\n**********************************************************************************\n**********************************************************************************\n");
    println("Cette application utilise le fichier de configuration : \t" +defaultInputFileName);
    println("Les informations de configurations sont des propriétés de l'individual \t "+configURI);
    println("Config décrite dans ce fichier : background :"+hex(background)+" + size : ("+sizeX+","+sizeY+")");
    println("de la même manière, on doit pouvoir creer des pages différentes, des formulaires, des animations, des boutons, des agents (? ;-P)...");
  }


  void readConfiguration(Model _model, String _metaApplication) {
    model = _model;
    String metaApplication = _metaApplication;
    // determine la configuration en fonction de la MetaApplication (une meta application permettant de creer une autre application)
    configURI = NS+metaApplication+"Configuration";
    String sizeXURI = NS+"sizeX";
    String sizeYURI = NS+"sizeY";
    String backgroundURI = NS+"background";
    Resource config  = model.createResource(configURI);
    Property sizeXprop = model.createProperty(sizeXURI);
    Property sizeYprop = model.createProperty(sizeYURI);
    Property backgroundProp = model.createProperty(backgroundURI);
    sizeX =  int(config.getProperty(sizeXprop).getObject().toString());
    sizeY =  int(config.getProperty(sizeYprop).getObject().toString());
    background  =  unhex(config.getProperty(backgroundProp).getObject().toString());
    println("test :"+sizeX+ " "+ sizeY+" "+hex(background));
  }
}

Code complet de la classe OwlFile : 

class OwlFile {
  String inputFileName;
  BufferedReader reader;
  Model model = ModelFactory.createDefaultModel();

  OwlFile(String path) {
    ouverture (path);
  } 

  void ouverture(String _path) {
    inputFileName = _path;
   // println ("cette application utilise le fichier " +inputFileName+);
    reader = createReader(inputFileName);
    // lire le fichier RDF/XML
    model.read(reader, null);
    // l'écrire sur la sortie standard
    // model.write(System.out);
  }
}

Code complet du premier fichier helloRdf.pde :


import com.hp.hpl.jena.rdf.model.Model;
import com.hp.hpl.jena.rdf.model.Resource;

Application application;

void setup(){
  application = new Application();
  size(application.sizeX, application.sizeY);
  background(application.background);
}

void draw() {
  
}


Sauvegardez et cliquez sur le triangle pour lancer l'application helloRdf avec les propriétés que vous avez saisies dans Protégé au format RDF.





Reste plus qu'à récupérer les classes et les Individuals de l'ontologie diamond.owl, et les lier par leur propriétés , pour ce faire, voir  : http://www.gicentre.net/utils

Pour ceux qui sont trop pressés, le fichier source est disponible ici ( Clic sur Fichier, puis télécharger pour récupérer l'archive complète , A ouvrir avec Processing)
-   helloRdf.zip 
- une autre version avec visualisation de toutes les classes Smag0touteclasseOK

Pour Zoomer, tourner, et deplacer : https://www.youtube.com/watch?v=LBrGDqxusVA

Et pour ceux qui découvrent Processing : http://fr.flossmanuals.net/_booki/processing/processing.pdf
Et pour ceux qui découvrent Protégé et les ontologies : http://python.espe-bretagne.fr/master-hst-ue9-2/wp-content/uploads/2013/03/Tutoriel-Pizza-gloria-1.pdf
Et pour ceux qui découvrent Jena :  http://igm.univ-mlv.fr/~ocure/LIGM_LIKE/Teaching/imac3/5_SW.pdf

A plus.... au plaisir de lire vos remarques et commentaires, ou contributions ;-)

Bon c'est pas le tout de rigoler.... mais faut que j'aille bosser, moi...



21/03/2014

Interface : Visualisation d'une ontologie owl créée avec Protégé, convertie au format Json pour l'integrer à D3.js ou exhibit

Pour créer une visualisation d'ontologie dans une interface Web.


Démarrer le serveur Fuseki avec les options suivantes :
fuseki-server --update --mem /diamond
ensuite sur le serveur fuseki (http://127.0.0.1:3333), utiliser le cadre File upload au bas de la page sparql.tpl.
Puis sur la même page, dans le cadre SPARQL Query,  lancer la requête (en selectionnant OUTput : JSON) :
SELECT  *  WHERE {?Sujet ?Propriete ?Objet}

Télécharger le fichier nouvellement créé et le renommer avec l'extension .json

Ce fichier peut maintenant être directement utilisable par les moteurs de visualisation javascript tels que D3 ou Exhibit.

par exemple pour l'integrer dans une page html utilisant d3.js, utilisez le code suivant :

<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="utf-8">
<title>D3 Test</title>
<script type="text/javascript" src="d3/d3.js"></script>
</head>
<body>
<script type="text/javascript">
// DATA

d3.json("data/diamond.json", function(diamond) {
console.log(diamond);
});

//  test paragraphe
d3.select("body")
.append("p")
.text("Smag0!");
</script>
</body>
</html>

ensuite vous pouvez vérifier l'insertion des données dans la page en utilisant la console de développement fournie par GoogleChrome , ou Firefox  :


GRRRRRR ! Après  2 jours à me prendre la tête, je me rend compte que le Json de Fuseki n'est pas le même que le Json de D3.js... et que je ne suis pas le premier à me prendre la tête dessus...
Sommes nous bloqués ? Non, on va le tenter en csv d'après la procédure décrite sur ce blog : http://www.d3noob.org/2013/03/d3js-force-directed-graph-example-basic.html

cet article semble également interessant http://graus.nu/thesis/algorithm-performance-measurement-confusion-matrix/ parlant de matrice de confusion dans le domaine du Machine Learning (aprentissage des machines)

Sinon une autre option pourrait-être d'utiliser : http://jointjs.com/demos (mais y'a un truc à voir avec la license Free / pas free ?)

Le but étant d'obtenir quelque chose comme ça : http://bl.ocks.org/d3noob/5141278

et pour le fun, j'aime bien celui-là : http://bl.ocks.org/mbostock/1249681

reprendre aussi l'idée de cluster : http://bl.ocks.org/mbostock/7881887

et le rendre en plus zoomable : http://bl.ocks.org/mbostock/7607535 et oui, rien que ça...
Une autre idée du cluster : https://github.com/Leaflet/Leaflet.markercluster



11/03/2014

Visualiser rapidement une ontologie dans une page WEB

1. Créez votre ontologie avec Protege.
2. Convertissez votre fichier XML/RDF en json-exhibit : http://service.simile-widgets.org/babel/
3. Faites valider le contenu de votre fichier : http://jsonlint.com/ (attention problème avec les apostrophes !!!)
4. Créez un fichier HTML incluant Exhibit http://simile-widgets.org/wiki/Exhibit (voir la doc de l'utilisateur) ou un exemple de code ci-dessous : (remplacer "comptabiliteM14apost.js" par votre fichier.
Voir la doc de l'utilisation de Exhibit pour personnaliser l'affichage.

exemple de page html : 

<html>
<head>
<title> Exhibit | Examples | MIT Nobel Prize Winners</title>
<link href="comptabiliteM14apost.js" type="application/json" rel="exhibit-data" />
<!-- Replace the URL here with your Exhibit 3.0 script location -->
<script src="http://api.simile-widgets.org/exhibit/3.0.0rc1/exhibit-api.js"
type="text/javascript"></script>
<style>
</style>
</head>
<body>
<div id="main-content">
<div id="title-panel">
<h1>63 MIT-related Nobel Prize Winners</h1>
</div>
<div id="top-panels">
<table width="100%"><tr>
Facets for sorting and browsing go here</tr></table>
</div>
<div ex:role="viewPanel" style="padding: 1em 0.5in;">
<div ex:role="view"
ex:label="Details"
ex:viewClass="Tile"
ex:showAll="true"
</div>
</td>
</tr>
</table>
</table>
</body>
</html>

exemple de fichier de données : comptabiliteM14apost.js (comptabilité pour les communes de moins de 500 habitants)





Une interface utilisateur simple pour gérer les concepts

L'interface utilisateur simple pour gérer les concepts? ... Oups ! je crois que j'ai oublié d'en parler...

Elle doit permettre à chacun (identifié) de consulter les concepts généraux, et de les personnaliser, un aperçu de ce que ça pourrait donner est disponible ici : https://googledrive.com/host/0B0zEK4yLB5C6QnlneERjZHpjNjQ/gestion-concepts.htm

et ressemble à ça :
objectif : interface utilisateur simple de gestion des concepts présents dans une ontologie

avec des clusters qui s'ouvrent comme ici : http://bl.ocks.org/mbostock/7607535

22/12/2013

Test d'intégration de Apache Jena -Sparql dans Processing.org pour visualiser les rdf

Voir le tutoriel plus récent : http://smag0.blogspot.fr/2014/03/creer-une-interface-pour-visualiser-les.html


import com.hp.hpl.jena.query.* ;

int nodeCount;
Node[] nodes = new Node[10];
HashMap nodeTable = new HashMap();

int edgeCount;
Edge[] edges = new Edge[5];

static final color nodeColor   = #F0C070;
static final color selectColor = #FF3030;
static final color fixedColor  = #FF8080;
static final color edgeColor   = #000000;

PFont font;

void setup() {
  size(600, 600);
  // loadData();
  // println(edgeCount);
  font = createFont("SansSerif", 10);


  // File file = new File();
  Rdf rdftest = new Rdf();
}

void addEdge(String fromLabel, String toLabel) {
  // Filter out unnecessary words
  if (ignoreWord(fromLabel) || ignoreWord(toLabel)) return;

  Node from = findNode(fromLabel);
  Node to = findNode(toLabel);
  from.increment();
  to.increment();

  for (int i = 0; i < edgeCount; i++) {
    if (edges[i].from == from && edges[i].to == to) {
      edges[i].increment();
      return;
    }
  }

  Edge e = new Edge(from, to);
  e.increment();
  if (edgeCount == edges.length) {
    edges = (Edge[]) expand(edges);
  }
  edges[edgeCount++] = e;
}


String[] ignore = {
  "a", "of", "the", "i", "it", "you", "and", "to"
};

boolean ignoreWord(String what) {
  for (int i = 0; i < ignore.length; i++) {
    if (what.equals(ignore[i])) {
      return true;
    }
  }
  return false;
}


Node findNode(String label) {
  label = label.toLowerCase();
  Node n = (Node) nodeTable.get(label);
  if (n == null) {
    return addNode(label);
  }
  return n;
}


Node addNode(String label) {
  Node n = new Node(label);
  if (nodeCount == nodes.length) {
    nodes = (Node[]) expand(nodes);
  }
  nodeTable.put(label, n);
  nodes[nodeCount++] = n;
  return n;
}

void draw() {
  if (record) {
    beginRecord(PDF, "output.pdf");
  }

  background(255);
  textFont(font);
  smooth();

  for (int i = 0 ; i < edgeCount ; i++) {
    edges[i].relax();
  }
  for (int i = 0; i < nodeCount; i++) {
    nodes[i].relax();
  }
  for (int i = 0; i < nodeCount; i++) {
    nodes[i].update();
  }
  for (int i = 0 ; i < edgeCount ; i++) {
    edges[i].draw();
  }
  for (int i = 0 ; i < nodeCount ; i++) {
    nodes[i].draw();
  }

  if (record) {
    endRecord();
    record = false;
  }
}
boolean record;

void keyPressed() {
  if (key == 'r') {
    record = true;
  }
}


Node selection;


void mousePressed() {
  // Ignore anything greater than this distance
  float closest = 20;
  for (int i = 0; i < nodeCount; i++) {
    Node n = nodes[i];
    float d = dist(mouseX, mouseY, n.x, n.y);
    if (d < closest) {
      selection = n;
      closest = d;
    }
  }
  if (selection != null) {
    if (mouseButton == LEFT) {
      selection.fixed = true;
    } else if (mouseButton == RIGHT) {
      selection.fixed = false;
    }
  }
}


void mouseDragged() {
  if (selection != null) {
    selection.x = mouseX;
    selection.y = mouseY;
  }
}


void mouseReleased() {
  selection = null;
}

// EDGE
// Code from Visualizing Data, First Edition, Copyright 2008 Ben Fry.
// Based on the GraphLayout example by Sun Microsystems.


class Edge {
  Node from;
  Node to;
  float len;
  int count;



  Edge(Node from, Node to) {
    this.from = from;
    this.to = to;
    this.len = 50;
  }


  void increment() {
    count++;
  }


  void relax() {
    float vx = to.x - from.x;
    float vy = to.y - from.y;
    float d = mag(vx, vy);
    if (d > 0) {
      float f = (len - d) / (d * 3);
      float dx = f * vx;
      float dy = f * vy;
      to.dx += dx;
      to.dy += dy;
      from.dx -= dx;
      from.dy -= dy;
    }
  }


  void draw() {
    stroke(edgeColor);
    strokeWeight(0.35);
    line(from.x, from.y, to.x, to.y);
  }
}


//NODE

// Code from Visualizing Data, First Edition, Copyright 2008 Ben Fry.
// Based on the GraphLayout example by Sun Microsystems.


class Node {
  float x, y;
  float dx, dy;
  boolean fixed;
  String label;
  int count;
  int taille;


  Node(String label) {
    this.label = label;
    x = width/2;
    y = height/2;
  }


  void increment() {
    count++;
  }


  void relax() {
    float ddx = 0;
    float ddy = 0;

    for (int j = 0; j < nodeCount; j++) {
      Node n = nodes[j];
      if (n != this) {
        float vx = x - n.x;
        float vy = y - n.y;
        float lensq = vx * vx + vy * vy;
        if (lensq == 0) {
          ddx += random(1);
          ddy += random(1);
        }
        else if (lensq < 100*100) {
          ddx += vx / lensq;
          ddy += vy / lensq;
        }
      }
    }
    float dlen = mag(ddx, ddy) / 2;
    if (dlen > 0.00000000000001) {
      dx += ddx / dlen;
      dy += ddy / dlen;
    }
  }


  void update() {
    if (!fixed) {    
      x += constrain(dx, -10, 10);
      y += constrain(dy, -10, 10);

      x = constrain(x, 0, width);
      y = constrain(y, 0, height);
    }
    dx /= 2;
    dy /= 2;
  }


  void draw() {
    fill(nodeColor);
    stroke(0);
    strokeWeight(0.5);
    taille =count;
    taille = constrain(taille, 20, 200);
    ellipse(x, y, taille, taille);
    float w = textWidth(label);

  // if (taille > w+2) {
      fill(0);
      textAlign(CENTER, CENTER);
      text(label, x, y);
   //}
  }
}

// RDF

import com.hp.hpl.jena.query.* ;
import com.hp.hpl.jena.rdf.model.Resource;

class Rdf {
Model model;
  Rdf() {

    test();
    lister();
    afficheConsole();
  }
  void test() {
    // some definitions
    String personURI    = "http://somewhere/JohnSmith";
    String givenName    = "John";
    String familyName   = "Smith";
    String fullName     = givenName + " " + familyName;
    String personURIMe    = "http://fada-range.appspot.com/DavidFaveris";
    String givenNameMe    = "David";
    String familyNameMe   = "Faveris";
    String fullNameMe     = givenNameMe + " " + familyNameMe;
    // create an empty Model
    model = ModelFactory.createDefaultModel();

    // create the resource
    Resource johnSmith =  model.createResource(personURI);
    Resource davidFaveris =  model.createResource(personURIMe);

    // add the property
    johnSmith.addProperty(VCARD.FN, fullName)
      .addProperty(VCARD.N, model.createResource()
        .addProperty(VCARD.Given, givenName)
        .addProperty(VCARD.Family, familyName));
    ;
    davidFaveris.addProperty(VCARD.FN, fullNameMe)
      .addProperty(VCARD.N, model.createResource()
        .addProperty(VCARD.Given, givenNameMe)
        .addProperty(VCARD.Family, familyNameMe));

    println(johnSmith);
    println(davidFaveris);
    addNode("johnSmith");
    addNode("davidFaveris");

  }


void afficheConsole(){
  model.write(System.out);
}

  void lister() {
    // list the statements in the Model
    StmtIterator iter = model.listStatements();

    // print out the predicate, subject and object of each statement
    while (iter.hasNext ()) {
      Statement stmt      = iter.nextStatement();  // get next statement
      Resource  subject   = stmt.getSubject();     // get the subject
      Property  predicate = stmt.getPredicate();   // get the predicate
      RDFNode   object    = stmt.getObject();      // get the object
addEdge(subject.toString(), object.toString());
        System.out.print("Sujet : "+subject.toString());
      System.out.print(" "+"\tPredicat : " + predicate.toString() + " ");
      if (object instanceof Resource) {
        System.out.print("\tObjet : "+object.toString());
      } 
      else {
        // object is a literal
        System.out.print(" \"" + object.toString() + "\"");
      }

      System.out.println(" .");
    }
    
  }
}

//File

class File {
  File() {
    String lines[] = loadStrings("vcard.rdf");
    println("there are " + lines.length + " lines");
for (int i = 0 ; i < lines.length; i++) {

      lines[i] = lines[i].replaceAll("  ", "");

      //PREFIXES
      lines[i] = lines[i].replaceAll("http://www.semanticweb.org/fada/ontologies/2013/10/smag/monde#", "");
      lines[i] = lines[i].replaceAll("http://www.semanticweb.org/fada/ontologies/2013/10/smag/monde#", "");
      lines[i] = lines[i].replaceAll("http://www.w3.org/2002/07/owl#", "");
      println(lines[i]);
    }
    for (int i = 0; i < lines.length; i++) {
      // Make this phrase lowercase
      //  String line = lines[i].toLowerCase();
      String line = lines[i];
      // Split each phrase into individual words at one or more spaces
      String[] words = splitTokens(line, "|");
 /*     for (int w = 0; w < words.length-1; w=+3) {
        words[w]=words[w].replaceAll(" ", "");
        words[w+2]=words[w+2].replaceAll(" ", "");
        if ((words[w+2]=="<Class>") || (words[w]=="<Class>")) {
          print ("classe");
        }
        else {
          addEdge(words[w], words[w+2]);
          print (words[w+1]+" entre "+words[w]+ " et " + words[w+2]+"\n");
        }
      }
   */ }
  }
}