zondag 25 augustus 2013

De structuur van RDF (25 augustus 2013)

Dit bericht schrijf ik vanwege het onvoldoende presteren van RDF-stores (AllegroGraph in mijn geval). Het was te voorspellen: als je data gaat opslaan waarbij je het systeem nauwelijks iets vertelt over de structuur van de data, dan moet het systeem ongelooflijk veel rekenen als je de structuur pas creëert tijdens het opvragen van de data. AllegroGraph presteert fantastisch maar als je in een query een uitgebreide structuur opbouwt die meerdere keren de gehele database doorloopt, dan krijgt zelfs AllegroGraph problemen. Het schijnt dat Virtuoso 7 veel van die problemen heeft opgelost maar dat heb ik nog niet kunnen vaststellen.

Het probleem komt volgens mij ook de door de manier waarop we RDF maken van relationele tabellen. Op dit moment doen we dat als volgt:
  • de tabel bepaalt het type instanties (rdf:type) in de tabel
  • iedere rij in de tabel heeft een id (URI). Deze URI is een verwijzing naar een concrete instantie. Deze URI vormt de subject van een triple.
  • iedere kolom heeft zelf ook een id (URI). Deze URI verwijst naar een concept, meestal een eigenschap van de instantie. Deze URI vormt de predicate van triples. 
  • de cellen, die niet het id vormen van de instantie, bevatten óf de waarde van die instantie voor die eigenschap óf een verwijzing (URI) naar een andere instantie. Zo'n cel vormt de object van een triple.
Deze manier van omvormen van relationele tabellen naar RDF is lekker eenvoudig en daardoor overzichtelijk. Maar is ze juist? Moeten we willen dat van iedere cel een aparte triple wordt gemaakt? Wat is de requirement die dat verlangt?

Een alternatief (dat me werd aangereikt door Richard Nagelmaeker) is om van de gehele rij één triple te maken. Het object van deze triple is een code-waarde-lijst. De codes in de code-waarde-lijst zijn URI's die verwijzen naar de concepten, meestal eigenschappen van de instanties. De waarden in de code-waarde-lijst zijn strings als het gaat om data of URI's als het gaat om verwijzingen naar instanties waarvan de data in andere tabellen staan.

De rationale voor deze benadering is dat je óf geïnteresseerd bent in de instanties óf dat je geïnteresseerd bent in de concepten. Het komt niet vaak voor dat je in één opvraging informatie (data) over zowel de concepten als over de instanties ophaalt. Raadpleegt de opvraging meerdere tabellen, dan moeten er één of meer tussenstappen gemaakt worden die van de relaties tussen instanties een aparte (tijdelijke) code-waarde lijst maakt ten einde eenvoudig van iedere instantie een bijbehorende instantie te kunnen opvragen.

Geen opmerkingen:

Een reactie posten