SIKB0102!? Wouter Boasson Kennis delen
Opgraving -> Pakbon Opgraving Objecten Documentatie Relaties Records Relatiemodel Pakbon Kaartenbak
Gefilterde objecten, prima Pakbon
Uitwisselen archeologische data Opgraving Objecten Documentatie Relaties Records Relatiemodel Uitwisseling Kaartenbak
Archeologisch project Project-database Veel variatie tabellen attributen codes relaties Gedetailleerde informatie
Uitwisselstandaard kenmerken Vaste structuur (technisch) tabellen attributen Harmonisatie (inhoud, betekenis) standaard coderingen Generiek Object-georienteerd model
Botsing! Project Eigen structuur tabellen attributen relaties Eigen coderingen maximaal detail Uitwisselstandaard Standaard structuur tabellen attributen relaties Standaard coderingen harmonisatie Object georienteerd model
Rekbaar uitwisselformaat
SIKB0102 Informatiegroepen Structuur put-vlak-profiel sporen Hoogtemetingen Geodata GML Bestanden XYZ Bergingsmateriaal vondsten monsters Bestanden scans foto's rapporten Metadata Projectinformatie... Interpretatie, analyse spoor structuren (historisch) determinatie (vondst, monster)
Een project datastructuur Put Vlak Spoor Vulling Vondst Vondst Splits Mat. A Mat. B...
SIKB0102, tabellen Put Planum Spoor Vulling Veldvondst Vondst
Mapping Put Put Planum Vlak Spoor Vulling Spoor Vondst Vulling Vondst Splits Mat. A Mat. B... Veldvondst Vondst
Mapping en koppelingen Put Put Planum Vlak Spoor Vulling Spoor Vondst Vondst Splits Vulling Waarneming Vondstcontext Veldvondst Mat. A Mat. B... Vondst
En dan ga je converteren...
Sleutels, nummering Sleutelvelden: groot probleem enkelvoudig, uniek nummer in de hele XML nodig voor identificatie en koppelingen objecten bestaande nummers niet gegarandeerd uniek samengestelde sleutels Oplossing unieke, enkele identifiers: UUID wereldwijde standaard voor uitgeven unieke nummers dubbelingen vrijwel onmogelijk bij correct gebruik Voordeel eenduidige koppeling objecten in XML updates gegevens
Werken met UUIDs Alles omnummeren: Put:1.Vlak:2.Spoor:7 => 'a81c1a0f-10c2-11e2-a845-000c29b6e763' In MS Access aan te maken autonummer kolom, type 'Replicatie ID' Gebruik de juiste versie van een UUID/GUID Versie 4 voor 100% gegarandeerd uniek (elke keer genereren levert nieuwe en unieke) Versie 5 voor unieke op basis van een URL patroon
UUID voorbeelden 1 Genereren unieke uuids, elke keer anders, met behulp van de PostgreSQL database:! olga_dev=# select uuid_generate_v4() from generate_series(1,3);! uuid_generate_v4! --------------------------------------! dfafc209-151b-4004-99e4-07f65efa03db! 322a3c30-c850-48df-af32-ef74df5637a2! 67893687-2ff9-49c9-89d7-7cdd6124153a! (3 rows)! En opnieuw, merk op dat ze allemaal anders zijn:! olga_dev=# select uuid_generate_v4() from generate_series(1,3);! uuid_generate_v4! --------------------------------------! e12ddab6-37f6-40ad-9c58-718f882020e1! fea74004-d7bf-46d5-bc0b-2c8dd05d288c! f48b73d1-5cb0-4922-b5be-f34be8d343de! (3 rows)!
UUID voorbeelden 2 Stabiele UUID, herhaald genereren levert dezelfde UUID op:! olga_dev=# select uuid_generate_v5(uuid_ns_url(), 'http://www.raap.nl/sikb/projectnaam/spoor/5');! uuid_generate_v5! --------------------------------------! cb2d8d90-9c8e-5eac-a163-0e4a2dcc768d! (1 row)! olga_dev=# select uuid_generate_v5(uuid_ns_url(), 'http://www.raap.nl/sikb/projectnaam/spoor/5');! uuid_generate_v5! --------------------------------------! cb2d8d90-9c8e-5eac-a163-0e4a2dcc768d! (1 row)! En nu een andere:! olga_dev=# select uuid_generate_v5(uuid_ns_url(), 'http://www.raap.nl/sikb/projectnaam/spoor/6');! uuid_generate_v5! --------------------------------------! 14a7713c-81b1-5d30-861e-ad3722886c83! (1 row)!
UUID voorbeelden 3 Zelfde geintje, maar dan met Python:! PS C:\Users\wouterb> python! Python 2.7.3 (default, Apr 10 2012, 23:31:26) [MSC v.1500 32 bit (Intel)] on win32! Type "help", "copyright", "credits" or "license" for more information.! >>> import uuid! >>> print uuid.uuid4()! 00f308bc-2b47-42a1-ae1b-114790631147! >>> print uuid.uuid4()! e285e387-28b4-4041-b41e-837dd1325e37! >>> print uuid.uuid5(uuid.namespace_url, 'http://www.raap.nl/sikb/projectnaam/spoor/5')! cb2d8d90-9c8e-5eac-a163-0e4a2dcc768d! Merk op dat de laatste, met Python gegenereerde UUID identiek is aan de met PostgreSQL gegenereerde in het vorige voorbeeld:! Python:!cb2d8d90-9c8e-5eac-a163-0e4a2dcc768d! PostgreSQL:!cb2d8d90-9c8e-5eac-a163-0e4a2dcc768d! Gebruik NOOIT, NOOIT, en nogmaals NOOIT zelf verzonnen UUID's!!
Structuur aanpassen Mapping namen tabellen kolommen Groeperen meerdere brontabellen => 1 SIKB0102 tabel Splitsen 1 brontabel => meerdere SIKB0102 tabellen aanmaken koppelobjecten
Relaties aanpassen Omwille van flexibiliteit centrale relatie-tabel niet verplichte relaties veel-op-veel relaties Voorbeeld Foto-tabel met koppelvelden voor vondst en spoor SIKB0102: relatie in centrale relatietabel foto fotograaf spoor vondst 12 Pietje 7 relatie klasse1 id1 klasse2 id2 GeassocieerdMet Foto 12 Spoor 7
Coderingen Opgravers en specialisten: specialistisch, veel detail Harmonisatie: ABR Vertalen codes noodzakelijk: paalkuilen naar type => paalkuil in ABR vondsten met enig detail => generiek type in ABR...
Waarom zo moeilijk? Uitwisselformaat noodzakelijkerwijs inhoudelijk gecompliceerd: brondatamodellen conceptueel divers beperken/geen informatie-verlies
Informatie-behoud Standaard, per definitie geharmoniseerde codes beperkt aantal kenmerken Maar ook: standaard structuur voor aanvullende data toevoegen alle gewenste attributen beschrijving attributen beschrijving originele codes koppeling/vertaling originele naar geharmoniseerde codes
Kijkje onder water
Odile 4 => SIKB0102
Deponering Archeologische gegevens Codereferenties Objectrelaties Attributen (specialisten) Archis
Controle inhoud Exporterende partij controle op data-integriteit inhoudelijke controle Importerende partij controle op data-integriteit SIKB0102: XSD validatie niet volledig, onmogelijk helpt wel veel
Technische opties Eerst herstructureren gebruik relationele database queries/views tijdelijke tabellen export XML Volledig in programmacode XML export bron database + XSLT transformatie, of eigen XML export routines in database Probleem in alle gevallen: stabiele unieke id's
RAAP s uitdaging RAAP systeem: by design meerdere database structuren mogelijk, toegespitst op project Archivering en deponering vereisen aanvullende gegevens, vaak niet in projectdatabase
Aanpak Odile archief-database projectarchief met volledig behoud van gegevens datamodel geoptimaliseerd voor uitwisseling stabiel gegevensmodel import en export van SIKB0102 Programmeerbare converter Odile projectdatabase -> archief database conversie-programma per template Aanvullende tooling deponeringsinformatie toevoegen aan archief archief bevragen harmonisatie coderingen
Archief: dozenlijst (1e opzet)
Status Archiefdatabase: prototype functioneert Converter projectdatabases: 95% Inlezen SIKB0102: 80% Export naar SIKB0102: 80% Deponeringstool: 0-80% bestaande extensie van Odile4, onderzoeken of die geschikt gemaakt kan worden voor de nieuwe database Archieftool: 0%
Systeem overzicht Odile 4 Converter + conversieprogramma Deponeringsgegevens Bevragen archief Archief database SIKB0102 XML bestand
Converter Flexibele converter: programmeerbaar (geen grafische schil) complex vanwege de conceptuele verschillen tussen specifiek project en generiek uitwisselformaat voorziet in routines om generieke taken te doen koppelobjecten aanmaken aanmaken stabiele identifiers opslag attributen niet in SIKB0102 Python multi-platform
Conversie programma 'Structuur' from odilebaseimport import *! class TransferData(OdileBaseImport):! _tablename = 'STRUCTUUR'! _dataquery = 'ARCH_STRUCTUUR'! _datatype = ''! _classname = 'Structuur'! _datafields = {}! _codelists = {}! _datafields['beschryf'] = 'informatie'! _datafields['datering'] = 'beginperiode'! _datafields['structuur'] = 'structuurtype'! _codelists['structuur'] = 'structuur'! _codelists['datering'] = 'abrdat'! _customattributes = {}! _keyfields = []! _mastermap = {}! _mastermapobjrel = {}! _masterfields = {}! _masterkeyfields = {}! def item_processing(self, sourceitem, destitem):! destitem.eindperiode = destitem.beginperiode!
Conversie, aanmaken objecten def item_processing(self, sourceitem, destitem):! waarneming = ADM.Waarneming()! waarneming.objectid = uuid.uuid1()! waarneming.bronid = destitem.bronid + ".waarneming"! waarneming.planumid = destitem.vlakid! waarneming.projectid = destitem.projectid! waarneming.spoorid = destitem.objectid! # waarneming.methode: afgeleid uit vlaknummer! if sourceitem['vlak'] < 101:! waarneming.methode = 'Vlak'! else:! waarneming.methode = 'Profiel'! self.add_to_keymap(waarneming.bronid, waarneming.objectid)! self.adbsession.add(waarneming!
Verdere mogelijkheden strategie Converter kan eenvoudig geschikt gemaakt worden om elke Access database in te lezen in de archiefdatabase (niet alleen Odile databases) Web-ontsluiting
Tijdspad Q4 2012 Converter projectdatabase archiefdatabase Export SIKB0102 Import SIKB0102 Deponeringstool Archieftool
Samenvatting export proces Unieke ID's aanmaken omnummeren link met bronid bewaren relaties aanpassen herhaalde export dataset: data-id's identiek, export versie wel met unieke identifier en datum Structuur: mapping tabellen, attributen naam splitsen, samenvoegen, nieuwe objecten aanmaken relaties aanpassen (in centrale tabel plaatsen) attributen voor informatiebehoud onderbrengen in aparte set generieke tabellen Codes mappen naar geharmoniseerde veelal handmatig invoeren (bewaren dus!) Controle uitvoeren niet elke controle kan in XSD validatie gevangen worden specifieke aandacht voor: waarnemingen (verbind sporen en putten/vlakken, controle niet mogelijk)
Verder, afspraken Gebruik bronid voor oorspronkelijke nummer kan niet zomaar, wegens andere structuur afspraak en/of aanpassing nodig Aanpassing nodig voor meezenden van de originele coderingen met betekenis en vertaling kan nu wel te duur/complex
Wat levert het op? Uitwisseling deponering 3 e partijen Archief alle brondata (detail, originele codes) uniform te bevragen centraal
Volwaardige uitwisselling! Opgraver Archis Depot Onderzoek
FAQ Moet je nu voor elk project een nieuwe converter maken? Nee, zolang de voor de conversie gebruikte tabellen en velden bestaan volstaat 1 conversie programma (meer tabellen en meer velden in dezelfde tabel geeft niet). Hoe moeilijk is het nu eigenlijk? Niet echt, met de juiste queries kan de export voorbereid worden. De noodzakelijke queries zijn met bijv. de MS Access wizzards wel te maken. Daarna is nog wel export en nabewerking nodig met een XSLT, of export met bijv. Python of via VBA. Tijdsinvestering? Het is vooral de optelsom van een aantal op zich niet moelijke operaties, in combinatie met de hoeveelheid, die export tot een flinke klus maken, reken op minimaal een week, maar waarschijnlijk meer. De grootste valkuil is misschien nog wel de metadata (bestandenlijsten, projectinformatie, etc), aangezien dat wat complexere XML structuren zijn dan de archeologische inhoud. Hoe kom ik aan die UUIDs? Zie eerder in de presentatie (MS Access Replicatie ID; genereren met een programmeertaal, bijv. Python; genereren in een andere database met een uuid module, bijv. PostgreSQL).