Lier un graph rdflib à une ontologie

classic Classic list List threaded Threaded
7 messages Options
Reply | Threaded
Open this post in threaded view
|

Lier un graph rdflib à une ontologie

Bloodbee
Bonjour,

Je n'ai rien trouvé sur ce sujet ni dans la documentation ni dans ce forum.

Imaginons je possède une ontologie Pizza avec des classes et propriétés définies.

J'ai un programme qui reçoit via un système X (cela n'a pas d'importance) un graph rdflib contenant une entité pizza (on va dire une tartiflette ) avec des propriétés choisies.
Ce graph n'est pas un fichier owl/xml et est entièrement stocké en mémoire de mon programme/script.
Ce graph est entièrement de type <rdflib.Graph>

Comment puis-je lier mon graph rdflib à mon ontologie Pizza, afin de pouvoir accèder aux éléments/propriétés de ma pizza tartiflette en utilisant la dsl proposée par Owlready2 ? Afin d'éviter de passer par la dsl classique rdflib (utilisant les méthodes .triples, .values, etc...).

Merci pour votre future réponse.

Reply | Threaded
Open this post in threaded view
|

Re: Lier un graph rdflib à une ontologie

Jiba
Administrator
Bonjour,

Il faut importer le graphe RDF dans le quadstore d'Owlready. Il y a deux possibilités pour cela :

 * soit sérialiser le graphe (par exemple en NTriples qui est le format le plus simple/rapide) et le charger avec Owlready

 * soit créer ce graphe avec RDFlib en utilisant RDFlib "par-dessus" le quadstore d'Owlready (solution la plus efficace mais qui nécessite de créer le graphe d'une manière particulière en utilisant World.as_rdflib_graph()).
Reply | Threaded
Open this post in threaded view
|

Re: Lier un graph rdflib à une ontologie

Bloodbee
Bonjour, merci pour votre réponse !


Dans le premier cas, il faut donc passer par le get_ontology('file_path.ntriples').load() classique, ce que je veux éviter car il faut absolument utiliser un fichier, stocké sur son filesystem.

Dans le deuxième cas, le graph a déjà été créée par rdflib, comment peux-t-il alors être intégré dans le default_world ?
Reply | Threaded
Open this post in threaded view
|

Re: Lier un graph rdflib à une ontologie

Jiba
Administrator
Bonjour,

Pour le premier cas, il est possible de ne pas passer par un fichier sur le disque, en utilisant :

import io
get_ontology('http://ontology_iri.owl').load(fileobj = io.StringIO("contenu du fichier"))

Pour le second cas, il ne faut pas "intégrer" le graph dans default_world, mais plutôt créer le graph RDFlib à partir de default_world, de sorte à ce que celui-ci soit directement créer dans Owlready.

Pour cela, on récupère le graphe :

graph = default_world.as_rdflib_graph()

Puis ensuite on crée le graphe en utilisant la variable "graph".

Jiba
Reply | Threaded
Open this post in threaded view
|

Re: Lier un graph rdflib à une ontologie

Bloodbee
Bonjour,

Merci pour l'attente d'une réponse de ma part.

Malgrès toutes mes tentatives, je n'ai malheureusement pas réussi à pouvoir récupèrer des propriétés de de mon entité tartiflette.

Voici ce que j'ai essayé :


from io import StringIO

# g est mon graphe rdflib contenant mon entité Tartiflette
g = Graph(...)

#1 méthode 1 via loading en utilisant StringIO
sio = StringIO(g.serialize(format='ntriples'))
pizza_ontology = get_ontology(url_de_lontology_pizza).load(fileobj=sio)
# Renvoit l'erreur : owlready2.base.OwlReadyOntologyParsingError: NTriples parsing error (or unrecognized file format) in ???.
# J'ai aussi tenté le format xml, même type d'erreur

#2 méthode 2 en utilisant default_world
pizza_ontology = get_ontology(url_de_lontology_pizza)

with pizza_ontology:
    d_g = default_world.as_rdflib_graph()

    for s, p, o in g:
        d_g.add((s, p, o))
    
    print('Pizza individuals:', list(pizza_ontology.Pizza.instances())) # fonctionne

    tartiflette_iri = pizza_ontology.Pizza.instances()[0]
    tartiflette = default_world[tartiflette_iri] # fonctionne

    # Ne fonctionne pas, n'affiche aucune propriété de mon entité tartiflette
    for prop in tartiflette.get_properties():
        for value in prop[tartiflette]:
            print(".%s == %s" % (prop.python_name, value))

    print(tartiflette.price) # ERREUR : AttributeError: 'price' property is not defined.
    print(tartiflette.pizzaTopping)

Pour résumé, avec la méthode #1, j'ai une erreur de parsing si j'utilise un StringIO.
La méthode #2 le loading fonctionne, et j'arrive bien a afficher les instances dans mon ontology (pour le coup il n'y en a qu'une c'est la tartiflette).

Cependant quand je tente d'en afficher les propriétés, rien. Je confirme qu'il y a bien des dataproperties et des objectproperties rattachées à ma tartiflette.

Une idée ? Merci.
Reply | Threaded
Open this post in threaded view
|

Re: Lier un graph rdflib à une ontologie

Jiba
Administrator
Pouvez-vous m'envoyer des programmes entiers que je puisse tester et exécuter ? Il est difficile de réfléchir avec juste des morceaux (d'autant que je ne vois pas ce que contient le graphe g !).

jiba
Reply | Threaded
Open this post in threaded view
|

Re: Lier un graph rdflib à une ontologie

Bloodbee
Il se trouve que j'ai finalement pu réussir via la méthode #2 utilisant le default_world.
On peut donc bien faire un chargement de graph dans l'ontologie présente.

En vous remerciant pour la solution !