RDF Schema mapping in OO paradigm

Yoan BlancSat, 30 Dec 2006, , , , ,

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.