IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Frameworks Discussion :

[TDB] Problème de lecture d'un graphe : "Quad: object cannot be null" [Jena]


Sujet :

Frameworks

  1. #1
    Invité
    Invité(e)
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    Dernière modification par Invité ; 27/06/2012 à 14h36.

  2. #2
    Membre éprouvé
    Avatar de Sapience
    Homme Profil pro
    Consultant sémantique & data à sparna.fr
    Inscrit en
    Avril 2005
    Messages
    305
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

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

    Informations forums :
    Inscription : Avril 2005
    Messages : 305
    Points : 915
    Points
    915
    Par défaut
    (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 :-)

  3. #3
    Invité
    Invité(e)
    Par défaut
    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.

  4. #4
    Membre éprouvé
    Avatar de Sapience
    Homme Profil pro
    Consultant sémantique & data à sparna.fr
    Inscrit en
    Avril 2005
    Messages
    305
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

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

    Informations forums :
    Inscription : Avril 2005
    Messages : 305
    Points : 915
    Points
    915
    Par défaut
    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 ?

  5. #5
    Invité
    Invité(e)
    Par défaut
    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"

  6. #6
    Membre éprouvé
    Avatar de Sapience
    Homme Profil pro
    Consultant sémantique & data à sparna.fr
    Inscrit en
    Avril 2005
    Messages
    305
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

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

    Informations forums :
    Inscription : Avril 2005
    Messages : 305
    Points : 915
    Points
    915
    Par défaut
    trouvé :-) La ligne qui génère l'erreur est en fait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    while (iterElts.hasNext()) {
                Statement stat = iterElts.nextStatement();
                System.out.println(stat.getObject());
            }

  7. #7
    Invité
    Invité(e)
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    Statement stat = iterElts.nextStatement();
    En tout cas, merci beaucoup de m'aider

  8. #8
    Membre éprouvé
    Avatar de Sapience
    Homme Profil pro
    Consultant sémantique & data à sparna.fr
    Inscrit en
    Avril 2005
    Messages
    305
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

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

    Informations forums :
    Inscription : Avril 2005
    Messages : 305
    Points : 915
    Points
    915
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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();
        }
     
    }

  9. #9
    Invité
    Invité(e)
    Par défaut
    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

  10. #10
    Invité
    Invité(e)
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    public static void main(String[] args) {
            JenaTutorial tuto = new JenaTutorial();
             tuto.testCreateModel();
             //tuto.testQueryModel();
    }
    puis
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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)

  11. #11
    Membre éprouvé
    Avatar de Sapience
    Homme Profil pro
    Consultant sémantique & data à sparna.fr
    Inscrit en
    Avril 2005
    Messages
    305
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

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

    Informations forums :
    Inscription : Avril 2005
    Messages : 305
    Points : 915
    Points
    915
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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();
        }

  12. #12
    Invité
    Invité(e)
    Par défaut
    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

  13. #13
    Membre éprouvé
    Avatar de Sapience
    Homme Profil pro
    Consultant sémantique & data à sparna.fr
    Inscrit en
    Avril 2005
    Messages
    305
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

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

    Informations forums :
    Inscription : Avril 2005
    Messages : 305
    Points : 915
    Points
    915
    Par défaut
    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).

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [TFileStream] Problème de lecture de string
    Par Pedro dans le forum Langage
    Réponses: 6
    Dernier message: 28/06/2004, 13h06
  2. [DirectShow] problème lorsque je détruit mon graphe
    Par juldjin2 dans le forum DirectX
    Réponses: 1
    Dernier message: 04/02/2004, 21h30
  3. problème de lecture base de registre
    Par pafounet3 dans le forum MFC
    Réponses: 10
    Dernier message: 31/12/2003, 14h06
  4. [fread] Problème de lecture de buffer
    Par karl3i dans le forum C
    Réponses: 2
    Dernier message: 25/09/2003, 09h21
  5. Réponses: 4
    Dernier message: 23/07/2003, 13h07

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo