Précédent   Forum du club des développeurs et IT Pro > Webmasters - Développement Web > Web sémantique > Frameworks
Frameworks Forum d'entraide sur les frameworks du Web sémantique (Jena, Sesame, etc.).
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 26/06/2012, 11h34   #1
laurianeD
Invité de passage
 
Femme
Étudiant
Inscription : juin 2012
Messages : 9
Détails du profil
Informations personnelles :
Sexe : Femme
Localisation : France

Informations professionnelles :
Activité : Étudiant
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : juin 2012
Messages : 9
Points : 2
Points : 2
Par défaut [TDB] Problème de lecture d'un graphe : "Quad: object cannot be null"

Bonjour,

Je débute avec TDB, et j'ai quelques problèmes pour trouver de la documentation et des exemples.
Mon ontologie est très simple, doit permettre de stocker n'importe quelle donnée. Pour l'instant, je n'utilise qu'une propriété, "http://tuplesProperties#hasName".
Dans un premier temps, j'écris les données de mon modèle :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public static void main(String[] args) {
 
		String directory = "TDB/" ;
		// create an empty Model
		Dataset dataset = TDBFactory.createDataset(directory);
		Model m = ModelFactory.createDefaultModel();
 
		String uri = "http://tuplesProperties#";
		Property hn = m.createProperty(uri, "hasName");
 
		Resource res = m.createResource("http://myResource");
		m.add(res, hn, "myResource");
 
		String nomModele = "http://modele";
		dataset.addNamedModel(nomModele, m);
		m.close();
		dataset.close();
	}
Dans un second temps, je souhaite les lire :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
public static void main(String[] args) {
 
		String directory = "TDB/" ;
		Dataset dataset = TDBFactory.createDataset(directory);
 
		String nom = "http://modele";
		Model m = dataset.getNamedModel(nom);
 
		String uri = "http://tuplesProperties#";
		Property hn = m.createProperty(uri, "hasName");
 
//On vérifie si la propriété est dans le modèle
		System.out.println("La propriété existe bien dans le modèle : " + m.contains(null, hn));
 
		String nomRes = "http://myResource";
		Resource res = m.getResource(nomRes);
		System.out.println("La ressource demandée est " + res.toString());
		System.out.println("La ressource " + res.toString() + " a un object d'après la propriété " + hn.toString() + " : " + m.contains(res, hn));
 
//On liste les objects de la relation hasName
		StmtIterator iterElts = res.listProperties(hn);
		while (iterElts.hasNext()) {
			Statement stat = iterElts.nextStatement();
			System.out.println(stat.getProperty(hn).getString());
		}
 
		m.close();
	}
Et j'obtiens ces résultats-là :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
La propriété existe bien dans le modèle : true
La ressource demandée est http://myResource
La ressource http://myResource a un object d'après la propriété http://tuplesProperties#hasName : true
Exception in thread "main" java.lang.UnsupportedOperationException: Quad: object cannot be null
	at com.hp.hpl.jena.sparql.core.Quad.<init>(Quad.java:62)
	at com.hp.hpl.jena.tdb.lib.TupleLib.quad(TupleLib.java:164)
	at com.hp.hpl.jena.tdb.lib.TupleLib.quad(TupleLib.java:155)
	at com.hp.hpl.jena.tdb.lib.TupleLib.access$100(TupleLib.java:45)
	at com.hp.hpl.jena.tdb.lib.TupleLib$4.convert(TupleLib.java:89)
	at com.hp.hpl.jena.tdb.lib.TupleLib$4.convert(TupleLib.java:85)
	at org.openjena.atlas.iterator.Iter$4.next(Iter.java:293)
	at com.hp.hpl.jena.tdb.store.GraphTDBBase$ProjectQuadsToTriples.next(GraphTDBBase.java:195)
	at com.hp.hpl.jena.tdb.store.GraphTDBBase$ProjectQuadsToTriples.next(GraphTDBBase.java:183)
	at com.hp.hpl.jena.util.iterator.WrappedIterator.next(WrappedIterator.java:80)
	at com.hp.hpl.jena.util.iterator.Map1Iterator.next(Map1Iterator.java:47)
	at com.hp.hpl.jena.util.iterator.WrappedIterator.next(WrappedIterator.java:80)
	at com.hp.hpl.jena.rdf.model.impl.StmtIteratorImpl.next(StmtIteratorImpl.java:45)
	at com.hp.hpl.jena.rdf.model.impl.StmtIteratorImpl.nextStatement(StmtIteratorImpl.java:55)
	at jena.tests.TDBTestRead.main(TDBTestRead.java:60)
Et la ligne 60 est cette ligne
Code :
Statement stat = iterElts.nextStatement();
Je ne comprends pas pourquoi je ne peux pas récupérer mes données, sachant qu'il m'indique qu'il y a bien des éléments objets de la propriété "hasName".

Que signifie l'erreur "Quad: object cannot be null" ? Qu'est-ce qu'un "quad" d'ailleurs ?

Merci pour votre aide
Lauriane
laurianeD est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/06/2012, 12h42   #2
Sapience
Membre chevronné
 
Avatar de Sapience
 
Homme Thomas Francart
Consultant sémantique & data à sparna.fr
Inscription : avril 2005
Messages : 191
Détails du profil
Informations personnelles :
Nom : Homme Thomas Francart
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Consultant sémantique & data à sparna.fr
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : avril 2005
Messages : 191
Points : 685
Points : 685
(c'est un tout petit peu confusant car ton code fait référence à une variable "prov" qui n'est définie nulle part...)

un quad est un triplet RDF avec une information de contexte supplémentaire, qui est dans ton cas le "NamedModel" dans lequel tu insères ton Model dans TDB.

"Quad: object cannot be null" veut dire que l'objet du triplet (un triplet ayant la structure sujet/prédicat/objet) est null.

Maintenant, te dire pourquoi il est null... là je sèche :-)
Sapience est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/06/2012, 13h52   #3
laurianeD
Invité de passage
 
Femme
Étudiant
Inscription : juin 2012
Messages : 9
Détails du profil
Informations personnelles :
Sexe : Femme
Localisation : France

Informations professionnelles :
Activité : Étudiant
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : juin 2012
Messages : 9
Points : 2
Points : 2
Désolée, j'ai oublié de renommer ma variable... J'ai corrigé le code
Merci pour ce début de réponse. En fait, je ne vois pas quelle est la méthode pour récupérer les données avec TDB. Avec le graphe Jena de base, j'arrive à créer mon modèle, l'écrire dans un fichier. Puis charger ce fichier, et utiliser les données. Mais pas moyen avec TDB, quoi que je fasse, j'obtiens cette erreur.
laurianeD est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/06/2012, 14h28   #4
Sapience
Membre chevronné
 
Avatar de Sapience
 
Homme Thomas Francart
Consultant sémantique & data à sparna.fr
Inscription : avril 2005
Messages : 191
Détails du profil
Informations personnelles :
Nom : Homme Thomas Francart
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Consultant sémantique & data à sparna.fr
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : avril 2005
Messages : 191
Points : 685
Points : 685
J'aurais tendance à suspecter une corruption de tes fichiers de données. As-tu essayé de supprimer complètement le contenu du répertoire "TDB/", et de relancer tes tests ? ou alors d'indiquer un autre nouveau répertoire à TDB dans tes tests ?
Sapience est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/06/2012, 14h43   #5
laurianeD
Invité de passage
 
Femme
Étudiant
Inscription : juin 2012
Messages : 9
Détails du profil
Informations personnelles :
Sexe : Femme
Localisation : France

Informations professionnelles :
Activité : Étudiant
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : juin 2012
Messages : 9
Points : 2
Points : 2
J'ai relancé le test avec un dossier vide, et j'ai toujours cette erreur. Même en spécifiant le chemin global du dossier "/home/path/to/folder"
laurianeD est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/06/2012, 23h25   #6
Sapience
Membre chevronné
 
Avatar de Sapience
 
Homme Thomas Francart
Consultant sémantique & data à sparna.fr
Inscription : avril 2005
Messages : 191
Détails du profil
Informations personnelles :
Nom : Homme Thomas Francart
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Consultant sémantique & data à sparna.fr
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : avril 2005
Messages : 191
Points : 685
Points : 685
trouvé :-) La ligne qui génère l'erreur est en fait :

Code :
System.out.println(stat.getProperty(hn).getString());
Parce que tu utilises "getProperty()" sur le statement. Qui est une méthode avancée liée à la réification des triplets (un sujet un peu advanced). La javadoc de cette méthode précise bien que c'est piégeux :

"There is an unfortunate ambiguity here. (...)
If the object of the statement is not a resource, an exception is thrown."

L'exception vient de ce que j'ai surligné. En fait à partir de ta variable stat, ce qui va t'interesser c'est surtout :
  • getSubject()
  • getPredicate()
  • getObject() ou bien l'une des méthode avec une primitive getInt(), getFloat(), getString(), etc. en fonction du type de ton statement;
N'utilises pas "getProperty()", ce dont tu as besoin ici c'est getObject() :


Code :
1
2
3
4
while (iterElts.hasNext()) {
            Statement stat = iterElts.nextStatement();
            System.out.println(stat.getObject());
        }
Sapience est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/06/2012, 09h21   #7
laurianeD
Invité de passage
 
Femme
Étudiant
Inscription : juin 2012
Messages : 9
Détails du profil
Informations personnelles :
Sexe : Femme
Localisation : France

Informations professionnelles :
Activité : Étudiant
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : juin 2012
Messages : 9
Points : 2
Points : 2
Et ça marche chez vous ? J'ai toujours la même erreur, même quand je ne mets aucun "System.out.println(...)" et pour le programme, l'exception est lancée à la ligne
Code :
Statement stat = iterElts.nextStatement();
En tout cas, merci beaucoup de m'aider
laurianeD est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/06/2012, 09h56   #8
Sapience
Membre chevronné
 
Avatar de Sapience
 
Homme Thomas Francart
Consultant sémantique & data à sparna.fr
Inscription : avril 2005
Messages : 191
Détails du profil
Informations personnelles :
Nom : Homme Thomas Francart
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Consultant sémantique & data à sparna.fr
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : avril 2005
Messages : 191
Points : 685
Points : 685
Oui le code suivant (qui est une adaptation du tien) s'execute sans erreur chez moi, en utilisant jena et TDB 0.9-incubating, et en partant d'un répertoire TDB vide :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
public class JenaTutorial {
 
    private String storageDirectory = "/home/thomas/workspace/tdb";
    private String namedModelURI = "http://modele";
 
    private void testCreateModel() {
 
        // create an empty Model
        Dataset dataset = TDBFactory.createDataset(storageDirectory);
        Model m = ModelFactory.createDefaultModel();
 
        m.add(
                m.createResource("http://myResource"),
                m.createProperty("http://tuplesProperties#", "hasName"),
                m.createLiteral("Le nom de ma ressource")
        );
 
        dataset.addNamedModel(namedModelURI, m);
        m.close();
        dataset.close();
    }
 
    private void testQueryModel() {
        Dataset dataset = TDBFactory.createDataset(storageDirectory);
        Model m = dataset.getNamedModel(namedModelURI);
        Property hn = m.createProperty("http://tuplesProperties#", "hasName");
 
        //On vérifie si la propriété est dans le modèle
        System.out.println("La propriété existe bien dans le modèle : " + m.contains(null, hn));
 
        String nomRes = "http://myResource";
        Resource res = m.getResource(nomRes);
        System.out.println("La ressource demandée est " + res.toString());
        System.out.println("La ressource " + res.toString() + " a un object d'après la propriété " + hn.toString() + " : " + m.contains(res, hn));
 
        //On liste les objects de la relation hasName
        StmtIterator iterElts = res.listProperties(hn);
        while (iterElts.hasNext()) {
            Statement stat = iterElts.nextStatement();
            System.out.println(stat.getObject());
        }
 
        m.close();
    }    
 
    public static void main(String[] args) {
        JenaTutorial tuto = new JenaTutorial();
         tuto.testCreateModel();
         tuto.testQueryModel();
    }
 
}
Sapience est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/06/2012, 10h26   #9
laurianeD
Invité de passage
 
Femme
Étudiant
Inscription : juin 2012
Messages : 9
Détails du profil
Informations personnelles :
Sexe : Femme
Localisation : France

Informations professionnelles :
Activité : Étudiant
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : juin 2012
Messages : 9
Points : 2
Points : 2
Eh bien, ça marche quand je copie le code..... Je vais regarder alors pourquoi moi ça me lance une exception, et je posterai la réponse (si jamais je trouve).
Merci infiniment
laurianeD est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/06/2012, 11h38   #10
laurianeD
Invité de passage
 
Femme
Étudiant
Inscription : juin 2012
Messages : 9
Détails du profil
Informations personnelles :
Sexe : Femme
Localisation : France

Informations professionnelles :
Activité : Étudiant
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : juin 2012
Messages : 9
Points : 2
Points : 2
Ah, mais je pense avoir trouvé d'où vient l'erreur, mais je ne sais pas si c'est normal ou pas.
En copiant ton code, je n'ai pas d'exception. Seulement, si je le fais en deux étapes :
d'abord
Code :
1
2
3
4
5
public static void main(String[] args) {
        JenaTutorial tuto = new JenaTutorial();
         tuto.testCreateModel();
         //tuto.testQueryModel();
}
puis
Code :
1
2
3
4
5
public static void main(String[] args) {
        JenaTutorial tuto = new JenaTutorial();
         //tuto.testCreateModel();
         tuto.testQueryModel();
}
Là j'ai la même exception de d'habitude.

(Je vais enlever la balise "[Résolu]" du coup)
laurianeD est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/06/2012, 13h17   #11
Sapience
Membre chevronné
 
Avatar de Sapience
 
Homme Thomas Francart
Consultant sémantique & data à sparna.fr
Inscription : avril 2005
Messages : 191
Détails du profil
Informations personnelles :
Nom : Homme Thomas Francart
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Consultant sémantique & data à sparna.fr
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : avril 2005
Messages : 191
Points : 685
Points : 685
Dammit

Ce code fonctionne en deux lancements séparés, il s'agit de remplacer le "addNamedGraph" dans le dataset créé par un "getNamedGraph" :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
    private static final String STORAGE_DIRECTORY = "/home/thomas/workspace/tdb";
    private static final String NAMED_GRAPH_URI = "http://modele";
    private static final String TEST_RESOURCE_URI = "http://myResource";
    private static final String NAMESPACE = "http://tuplesProperties#";
    private static final String PROPERTY = "hasName";
 
    private void testCreateModel() {
 
        // create an empty Model
        Dataset dataset = TDBFactory.createDataset(STORAGE_DIRECTORY);
        Model m = dataset.getNamedModel(NAMED_GRAPH_URI);
        // ou bien si on veut travailler dans le graphe par defaut : 
        // Model m = dataset.getDefaultModel();
 
        m.add(
                m.createResource(TEST_RESOURCE_URI),
                m.createProperty(NAMESPACE, PROPERTY),
                m.createLiteral("Le nom de ma ressource")
        );
 
        m.close();
        dataset.close();        
    }
 
    private void testQueryModel() {
        Dataset dataset = TDBFactory.createDataset(STORAGE_DIRECTORY);
        Model m = dataset.getNamedModel(NAMED_GRAPH_URI);
        // ou bien si on veut travailler dans le graphe par defaut : 
        // Model m = dataset.getDefaultModel();
 
        Property hn = m.createProperty(NAMESPACE, PROPERTY);
 
        //On vérifie si la propriété est dans le modèle
        System.out.println("La propriété existe bien dans le modèle : " + m.contains(null, hn));
 
        Resource res = m.getResource(TEST_RESOURCE_URI);
        System.out.println("La ressource demandée est " + res.toString());
        System.out.println("La ressource " + res.toString() + " a un object d'après la propriété " + hn.toString() + " : " + m.contains(res, hn));
 
        // get property value
        StmtIterator iterElts = res.listProperties(hn);
        while (iterElts.hasNext()) {
            Statement stat = iterElts.nextStatement();
            System.out.println(stat.getObject());
        }
 
        m.close();
    }    
 
    public static void main(String[] args) {
        JenaTutorial tuto = new JenaTutorial();
         tuto.testCreateModel();
         tuto.testQueryModel();
    }
Sapience est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/06/2012, 13h46   #12
laurianeD
Invité de passage
 
Femme
Étudiant
Inscription : juin 2012
Messages : 9
Détails du profil
Informations personnelles :
Sexe : Femme
Localisation : France

Informations professionnelles :
Activité : Étudiant
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : juin 2012
Messages : 9
Points : 2
Points : 2
Merci !!!!
C'est quand même bien étrange, et on ne trouve que très peu de documentation. Merci beaucoup pour le temps passé.

Lauriane
laurianeD est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/06/2012, 14h34   #13
Sapience
Membre chevronné
 
Avatar de Sapience
 
Homme Thomas Francart
Consultant sémantique & data à sparna.fr
Inscription : avril 2005
Messages : 191
Détails du profil
Informations personnelles :
Nom : Homme Thomas Francart
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Consultant sémantique & data à sparna.fr
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : avril 2005
Messages : 191
Points : 685
Points : 685
On est d'accord, vu la complexité de l'API Jena, la doc est très très limite (c'est aussi pour ça que je milite plutôt en faveur de Sesame).
Sapience est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Cette discussion est résolue.
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 09h16.


 
 
 
 
Partenaires

Hébergement Web