SIKB0102 !? Wouter Boasson Kennis delen
Opgraving -> Pakbon Opgraving Objecten
Documentatie Records
Relaties
Relatiemodel
Pakbon Kaartenbak
Gefilterde objecten, prima
Pakbon
Uitwisselen archeologische data Opgraving Objecten
Documentatie Records
Relaties
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
Uitwisselstandaard Standaard structuur
tabellen
tabellen
attributen
attributen
relaties
relaties
Eigen coderingen maximaal detail
Standaard coderingen harmonisatie
Object georienteerd model
Rekbaar uitwisselformaat
SIKB0102 Informatiegroepen Structuur
Bergingsmateriaal
put-vlak-profiel sporen Hoogtemetingen Bestanden scans foto's rapporten
Metadata Projectinformatie ...
vondsten Geodata GML Bestanden XYZ
monsters
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
Put
Mapping
Planum
Put Vlak Spoor
Spoor
Vulling Vondst
Vulling
Vondst Splits Mat. A Mat. B
Veldvondst ...
Vondst
Mapping en koppelingen
Put
Put
Planum
Vlak
Waarneming
Spoor Spoor
Vulling Vondst
Vulling
Vondst Splits Mat. A Mat. B
Vondstcontext Veldvondst
...
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
12
Pietje
7
vondst
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
Objectrelaties Codereferenties
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 SIKB0102 XML bestand
Bevragen archief
Deponeringsgegevens
Archief database
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 3e 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).