Een leksken sql

Ik heb de afbeelding van vorige keer met de hand gemaakt in Figma, maar het is natuurlijk zottenwerk om dat te blijven doen.

Dus, dacht ik, ik maak rap iets dat gedcom leest en een grafiek uitspuwt.

Ah ha ha, was dát even een teleurstelling: er zijn blijkbaar niet zo enorm veel propere manieren om gedcom te lezen.

Na er ongeveer een halve aan gespendeerd te hebben om het dan in een hoek te smijten waar ik het nooit meer ga uit halen, dacht ik: en als ik nu eens de database rechtstreeks lees?

Jazeker: eentje voor de collectie “famous last words”. De database van een genealogieprogramma zit niet zó eenvoudig in mekaar. Dat moet er rekening mee houden dat een persoon niet alleen verschillende namen kan hebben, maar pakweg ook verschillende geboortedatums, met variërende en absoluut mogelijk conflicterende datums (voor 1808, na 1802, tussen 1800 en 1810, februari 1805, 10 januari 18.., 15 maart of april 1804, etc., etc.).

Maar bon. Ik dus in de datastructuur van Gramps gedoken.

Uiteindelijk is het niet ondoenbaar, maar wel redelijk onhandig. Als ik de naam van een persoon wil weten, dan kan ik dat — denk ik toch — op de volgende manier doen:

select p.gid, n.first_name, s.surname
from person p, name n, surname s, link l1, link l2

where l1.from_type = 'person' and l1.to_type = 'name'
and l1.from_handle = p.handle and l1.to_handle = n.handle

and l2.from_type = 'name' and l2.to_type = 'surname'
and l2.from_handle = n.handle and l2.to_handle = s.handle

Er is een tabel met personen, een tabel met (voor)namen en een tabel met achternamen. Elk record in die tabellen heeft een handle, en dan is er een tabel met links, waar telkens een from_handle van een bepaald type met een to_handle van een bepaald type verbonden wordt.

Dit hierboven geeft mij bijvoorbeeld dit:

gidfirst_namesurname
I0012Arthur Leon LudovicusVuylsteke
I0013 Maria Francisca AdrianaDehouwer
I0014 Charles FrançoisGilliet
I0014 Carolus FranciscusGilliet
I0015 Marie Anne ThérèseDujardin
I0016 Philippe Gilliet
I0016 Philippus Gilliet

En inderdaad: meer dan één schrijfwijze van een naam wil zeggen dat mensen er meer dan eens in voor kunnen komen. Als ik filter op name.name_type0=2, krijg ik alleen de hoofdnaam. (Waarde proefondervindelijk gevonden, ik heb nog geen documentatie bekeken, zo ben ik dan wel weer.)

Het wordt wel relatief onhandig als er meer gegevens in het spel komen, want bijna alles moet via die linktabel. Voor een lijst met persoon, vader en moeder wordt de query iets in deze zin:

SELECT 
    p.gid as gid, 
    n.first_name  || ' ' || s.surname as kind, 
    p_father.gid as gidV,
    n_father.first_name || ' ' || s_father.surname as vader,
    p_mother.gid as gidM,
    n_mother.first_name || ' ' || s_mother.surname as moeder
FROM 
    person p, name n, surname s, 
    family f, 
    person p_father, name n_father, surname s_father,
    person p_mother, name n_mother, surname s_mother,
    link l1, link l2, link l3, link l4, link l5, link l6, link l7
WHERE 
    -- kind met naam en familienaam linken
    l1.from_type = 'person' AND l1.to_type = 'name'
    AND l1.from_handle = p.handle AND l1.to_handle = n.handle
    AND n.name_type0 = 2
    AND l2.from_type = 'name' AND l2.to_type = 'surname'
    AND l2.from_handle = n.handle AND l2.to_handle = s.handle
    -- kind met familie linken
    AND l3.from_type = 'person' AND l3.to_type = 'parent_family'
    AND l3.from_handle = p.handle AND l3.to_handle = f.handle
    -- vader van de familie linken met zijn naam en achternaam
    AND f.father_handle = p_father.handle
    AND l4.from_type = 'person' AND l4.to_type = 'name'
    AND l4.from_handle = p_father.handle AND l4.to_handle = n_father.handle
    AND n_father.name_type0 = 2
    AND l5.from_type = 'name' AND l5.to_type = 'surname'
    AND l5.from_handle = n_father.handle AND l5.to_handle = s_father.handle
    -- moeder van de familie linken met haar naam en achternaam
    AND f.mother_handle = p_mother.handle
    AND l6.from_type = 'person' AND l6.to_type = 'name'
    AND l6.from_handle = p_mother.handle AND l6.to_handle = n_mother.handle
    AND n_mother.name_type0 = 2
    AND l7.from_type = 'name' AND l7.to_type = 'surname'
    AND l7.from_handle = n_mother.handle AND l7.to_handle = s_mother.handle;

…maar: dat begint er wel op te trekken. Ik krijg dit als begin van resultaat, en dat klopt als een zwerende vinger:

gidkindgidVvadergidMmoeder
I0000 Michel Vuijlsteke I0006 Marc Maurice Régine Vuijlsteke I0007 Marie Louise Waegenaer
I0001 Sandra Pattyn I0601 Jean Valère Godefroid Marie Pierre Pattyn I0602 Anna De Meyer
I6831 Petrus De Bie I6829 Petrus De Bie I6830 Catharina Cauwenberge
I6832 Paulus De Bie I6829 Petrus De Bie I6830 Catharina Cauwenberge
I6833 Isabella Francisca Gilliet I3447 Hubertus Gilliet I3448 Marie Anne Petronille Venneman
I6835 Carolus Herman I4452 Albertus Ferdinandus Guilelmus Herman I3594 Philippina Joanna Coleta Gilliet
I6836 Joannes Herman I4452 Albertus Ferdinandus Guilelmus Herman I3594 Philippina Joanna Coleta Gilliet
I6837 Anna Jacoba Gillet I6838 Guilielmus Gillet I6839 Jacoba Passyn

Voor het vervolg heb ik eigenlijk alleen de naam, geboorte- en overlijdensdatum van het kind nodig en dan het gid van zijn twee ouders. Het wordt nog wat zoeken hoe ik dat aanpak, of ik de eerste de beste datum neem dan wel alle data dan wel op de eéén of andere manier een beslissing neem over welke datum ik neem (die met de beste bronnen, misschien?).

Maar ‘t zal voor een andere dag zijn. 🙂

Één reactie op “Een leksken sql”

Reacties zijn gesloten.