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:
gid | first_name | surname |
---|---|---|
I0012 | Arthur Leon Ludovicus | Vuylsteke |
I0013 | Maria Francisca Adriana | Dehouwer |
I0014 | Charles François | Gilliet |
I0014 | Carolus Franciscus | Gilliet |
I0015 | Marie Anne Thérèse | Dujardin |
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:
gid | kind | gidV | vader | gidM | moeder |
---|---|---|---|---|---|
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. 🙂
Reacties
Eén reactie op “Een leksken sql”
[…] Ik ben al een paar dagen niets aan het doen met mijn tussentijdse resultaat van werken met data uit Gramps. […]