RDF Schema mapping in OO paradigm
Yoan Blanc — Sat, 30 Dec 2006 — ActiveRDF, Object-Oriented Programming, Python, RDF, Redland, SPARQL
I tried to dompt ActiveRDF to manager a real inheritance model but
with a lot of pain. It’s a hard issue. Today, I try to play with
Redland in Python,
only to feel the pain that it is. I’ve first played with RDF in Java with Jena,
so it’s a little pain today.
What’s hard ? A true OOP model is difficult to manage because a parent
class need to know his sons to do a find_all
for example. In
SPARQL, to find
all elements that are a Dad
:
PREFIX rdf: \
<http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX my: http://example.org/
SELECT ?node WHERE
{ ?node rdf:type my:Dad . }
UNION
{ ?node rdf:type my:Son . }
Here, you get every element that is a Dad
and
a Son
(if you have in mind that my:Son rdfs:subClassOf
my:Dad
, it’s logical I think)
With OOP in mind, it means that the Dad
knows all sons he have at every
degree. It’s counter-intuitive for every programming language. It’s counter
intuitive if you put this searching feature in the Dad
itself
like I did. The model is the only thing that knows everything. Why not
delegated this feature to it?
I wrote a piece of code (source,
rdf) to experiment this. It’s
not very clean but you can show the problem (and test it of course).
N’arrivant pas à mes fins avec ActiveRDF, j’ai eu envie d’essayer avec Python et l’API
offerte par Redland pour
manipuler du RDF.
Le grand problème est que le modèle du schéma RDF n’est pas aisément
traductible en orienté-objet pour la raison suivante : l’héritage (qui
peut être simple comme multiple, hein Fabio!). En effet, un élément
parent doit pour, par exemple, permettre à l’utilisateur d’obtenir tous
les éléments de son type, connaître tous ses fils (et petits-fils). De
dire : « Je veux tous les éléments étant des pères ! »
implique qu’il faut connaître tous les éléments dérivant de ce type là.
Choses assez contre-intuitive dans la programmation orientée-objet.
J’ai joué avec la bête (source,
rdf) risquer vous-y seulement.
Le travail qui est fait par Eyal Loren, dans le cadre d’ActiveRDF, est ardu car
faire le mapping d’un modèle RDF (donc un graphe) dans un
modèle orienté-objet est extrêment complexe. Ruby est ici certainement
plus flexible que Python. Je n’ai pas trouvé comment créer une classe
à la volée en Python.
Je serais intéressé par voir ce qu’il est possible d’obtenir avec
CherryPy et
Redland, vis-à-vis d’ActiveRDF. La force de Redland est que, comme
il faut tout faire soi-même, il n’a a pas de barrière « logicielle »,
j’ai pour l’instant laissé en suspens mes projets de jouer avec FOAF et
ActiveRDF.