Datentransformation mit Metafacture – Aktuelle Entwicklungen

Adrian Pohl & Fabian Steeg

Offene Infrastruktur, Hochschulbibliothekszentrum NRW (hbz)


KIM Workshop,
WWW, 2. Mai 2022

https://slides.lobid.org/2022-05-02-kim-ws/ (PDF)
Creative Commons License

Agenda

  1. Kontext: Datentransformation
  2. Was ist Metafacture?
  3. Metafacture Fix
  4. Metafacture Playground
  5. Ausblick
  6. Fragen & Diskussion

1. Kontext: Datentransformation

Anwendungsszenarien

Datenanalyse, z.B. Feldabdeckung im Katalog

Datenaufbereitung, z.B. zur Visualisierung mit Kibana

Datenanreicherung, z.B. Ergänzung von Daten aus Wikidata

Datenaggregation aus unterschiedlichen Quellen, z.B. OERSI

Systemmigration, z.B. nach Alma oder Folio

Annahmen

Transformationen von Metadaten gehören zum täglichen Geschäft wissenschaftlicher Bibliotheken.

Es gibt viele unterschiedliche Methoden, die meist Programmierkenntnisse voraussetzen.

Datentransformationen werden meist im Zusammenspiel von Fachabteilungen & IT umgesetzt, verbunden mit größerem Kommunikationsaufwand.

Bereits existierende, von anderen entwickelte Transformationsprozesse können nur bedingt entdeckt und nachgenutzt werden.

Das heißt:

Es gibt großes Potential, eine immer wiederkehrende Arbeit zugänglicher, kollaborativer und effizienter zu gestalten.

Übergeordnete Ziele

Ermächtigung der Fachebene zur Konfiguration von Datentransformationen

Förderung von Praktiken zum Teilen und Auffinden von Transformationsprozessen

2. Was ist Metafacture?

Was ist Metafacture?

[...] zur Verarbeitung von semi-strukturierten Daten mit dem Fokus auf Bibliotheksdaten

Ein vielseitiges Werkzeug: nutzbar als Kommandozeilentool, als Java/JVM library, für Batch-Verarbeitung oder on-the-fly

Ein offenes Framework: Wiederverwendung und Austausch (von einzelnen Modulen und ganzen Workflows)

Metafacture-Historie

2011: Start der Entwicklung durch DNB im Rahmen von Culturegraph; damals schon Austausch mit dem hbz

2013: Umzug auf GitHub, Open-Source-Projekt geworden

2019: Mit der Zeit immer weniger DNB-Ressourcen für Metafacture, hbz wird Maintainer

2019: Start von Metafacture Fix

2021: Start von Metafacture Playground

Wie Metafacture funktioniert

Grundidee: Daten fließen durch mehrere Module:
→ read → decode → transform → encode → write →

Jedes Modul erwartet Input eines bestimmten Typs und erzeugt Output eines bestimmten Typs

Verschiedene Formate werden unterstützt (z.B. PICA, MARC), erweiterbares Framework für eigene Formate

Durch Kombination einzelner Module, durch die unsere Daten fließen, bauen wir den Workflow

Ein Workflow

Aus: Christoph Böhme, http://swib.org/swib13/slides/boehme_swib13_131.pdf

Workflows konfigurieren und ausführen

Workflows können in Flux (einer speziellen Konfigurationssprache) oder mit Java (typsicher über Java Generics) bearbeitet werden

Flux-Workflows können in einem Texteditor editiert und auf der Kommandozeile ausgeführt werden, Java-Workflows funktionieren wie andere Java-Komponenten

Workflow-Beispiel

Ausgabe des Inhalts von bib-data.pica.gz als Formeta


$ gedit sample1.flux &
					

"bib-data.pica.gz" 
|open-file|as-lines|decode-pica|encode-formeta|write("stdout");
					

$ flux.sh sample1.flux
					

https://github.com/hbz/metafacture-flux-examples/tree/master/sample1

Workflow-Beispiel

Ausgabe des Inhalts von bib-data.pica.gz als Formeta


$ gedit sample1.flux &
					

"bib-data.pica.gz"
|open-file
|as-lines
|decode-pica
|encode-formeta(style="multiline")
|write("stdout");
					

$ flux.sh sample1.flux
					

https://github.com/hbz/metafacture-flux-examples/tree/master/sample1

Workflow-Beispiel: Ausgabe


'482147350' {
	'001@' {
		'a': '5',
		'0': '1-2'
	},
	'001A' {
		'0': '1100:15-10-94'
	},
	'001B' {
		'0': '9999:12-06-06',
		't': '16:10:17.000'
	},
	'001D' {
		'0': '9999:99-99-99'
	},
	'001U' {
		'0': 'utf8'
	},
	'001X' {
		'0': '0'
	},
	'002@' {
		'0': 'Aag'
	},
	'003@' {
		'0': '482147350'
	},
	'006U' {
		'0': '94,P05'
	},
	'007E' {
		'0': 'U 70.16407'
	},
	'007I' {
		'S': 'o',
		'0': '74057548'
	},
	'011@' {
		'a': '1970'
	},
	'017A' {
		'a': 'rh'
	},
	'021A' {
		'a': 'Die @Berufsfreiheit der Arbeitnehmer und ihre Ausgestaltung in völkerrechtlichen Verträgen',
		'd': 'Eine Grundrechtsbetrachtg'
	},
	'028A' {
		'9': '106884905',
		'7': 'Tn3',
		'A': 'gnd',
		'0': '106884905',
		'a': 'Projahn',
		'd': 'Horst D.'
	},
	'033A' {
		'p': 'Würzburg'
	},
	'034D' {
		'a': 'XXXVIII, 165 S.'
	},
	'034I' {
		'a': '8'
	},
	'037C' {
		'a': 'Würzburg, Jur. F., Diss. v. 7. Aug. 1970'
	}
}
'958090564' {
	'001@' {
		'0': '1',
		'a': '5'
	},
	'001A' {
		'0': '1140:08-12-99'
	},
	'001B' {
		'0': '9999:05-01-08',
		't': '22:57:29.000'
	},
	'001D' {
		'0': '9999:99-99-99'
	},
	'001U' {
		'0': 'utf8'
	},
	'001X' {
		'0': '0'
	},
	'002@' {
		'0': 'Aa'
	},
	'003@' {
		'0': '958090564'
	},
	'004A' {
		'f': 'kart. : DM 9.70, EUR 4.94, sfr 8.00, S 68.00'
	},
	'006U' {
		'0': '00,B05,0285'
	},
	'007I' {
		'S': 'o',
		'0': '76088278'
	},
	'011@' {
		'a': '1999'
	},
	'017A' {
		'a': 'rb',
		'a': 'si'
	},
	'019@' {
		'a': 'XA-AT'
	},
	'021A' {
		'a': 'Zukunft Bildung',
		'h': 'Politische Akademie. [Hrsg. von Günther R. Burkert-Dottolo und Bernhard Moser]'
	},
	'028C' {
		'9': '130681849',
		'7': 'Tp1',
		'V': 'piz',
		'A': 'gnd',
		'0': '130681849',
		'E': '1952',
		'a': 'Burkert',
		'd': 'Günther R.',
		'B': 'Hrsg.'
	},
	'033A' {
		'p': 'Wien',
		'n': 'Polit. Akad.'
	},
	'034D' {
		'a': '79 S.'
	},
	'034I' {
		'a': '24 cm'
	},
	'036F' {
		'x': '299 12',
		'9': '551720077',
		'g': 'Adn',
		'7': 'Tb1',
		'A': 'gnd',
		'0': '1040469-7',
		'a': 'Politische Akademie',
		'g': 'Wien',
		'Y': 'PA-Information',
		'h': 'Politische Akademie, WB',
		'p': 'Wien',
		'J': 'Politische Akad., WB',
		'l': '99,2'
	},
	'036F/01' {
		'x': '12',
		'9': '025841467',
		'g': 'Advz',
		'i': '2142105-5',
		'Y': 'Aktuelle Fragen der Politik',
		'h': 'Politische Akademie',
		'p': 'Wien',
		'J': 'Politische Akad. der ÖVP',
		'l': 'Bd. 2'
	},
	'045E' {
		'a': '22',
		'd': '18',
		'm': '370'
	},
	'047A' {
		'S': 'FE',
		'a': 'ta'
	}
}
					

https://github.com/hbz/metafacture-flux-examples/tree/master/sample1

Transformationsmodul

Manipulation von Feldnamen und -werten; filtern, kombinieren, normalisieren etc.

Feldwerte aus Lookup-Tabellen in externen Dateien (z.B. Freitextfelder -> kontrollierte Vokabulare)

Morph: XML-basiert, Feld- / Metadaten-Event-Ebene

Fix: eigene, Catmandu-Fix-artige Sprache, Record-basiert

Morph


1{a: Faust, b {n: Goethe, v: JW}, c: Weimar}
2{a: Räuber, b {n: Schiller, v: F}, c: Weimar}
					

<?xml version="1.0" encoding="UTF-8"?>
<metamorph xmlns="http://www.culturegraph.org/metamorph" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="1">
  <rules>
    <data source="_id" name="id"/>
    <data source="a" name="title"/>
    <combine value="${first} ${last} aus ${place}" name="author">
      <data source="b.v" name="first" />
      <data source="b.n" name="last" />
      <data source="c" name="place" />
    </combine>
  </rules>
</metamorph>
					

{"id":"1", "title":"Faust", "author":"JW Goethe aus Weimar"}
{"id":"2", "title":"Räuber", "author":"F Schiller aus Weimar"}
					

Beispiel im Playground

Zwischenfazit

Erfahrung hat gezeigt: Metafacture ist durch seine Modularität und Erweiterbarkeit sehr vielseitig einsetzbar, aber die Transformation mit Morph ist sehr komplex

Kernproblem: Transformationsregeln beziehen sich konzeptuell auf ganze Records (z.B. wenn in Feld x das und das steht, dann mach mit Feld y das und das)

Grundsätzlich bahandelt man in Morph aber wie vorhin beschrieben quasi Feld-Events, wird sehr schnell unintuitiv

3. Metafacture Fix

Metafacture Fix: Ziele

Wechsel von einem Feld-basierten zu einem Record-basierten Verarbeitungsansatz bei der Transformation

Anknüpfung an existierende Konfigurationssprache aus Catmandu (mittelfristiges Ziel: Standardisierung, s. https://github.com/elag/FIG)

Erleichterung der Transformationskonfiguration

Vergrößerung der Zielgruppe um Bibliothekar:innen und andere Metadatenfachleute (bei uns z.B. in OERSI, erster Anwendungsfall und Entwicklungsbegleitung zu Fix)

Fix


1{a: Faust, b {n: Goethe, v: JW}, c: Weimar}
2{a: Räuber, b {n: Schiller, v: F}, c: Weimar}
					

move_field(_id, id)
move_field(a, title)
paste(author, b.v, b.n, '~aus', c)
retain(id, title, author)
					

{"id":"1", "title":"Faust", "author":"JW Goethe aus Weimar"}
{"id":"2", "title":"Räuber", "author":"F Schiller aus Weimar"}
					

Beispiel im Playground

Aktueller Stand Fix

Beispiele: produktiv in OERSI (diverse Web-Quellen → JSON), im Aufbau für hbz-Verbundkatalog (MARC → JSON) und Rheinland-Pfälzische Bibliographie (Allegro → JSON)

Tests: unit (Simulation von Input-Output-Events und Fix auf Code-Ebene; aktuell 436 pass / 26 skip), integration (Input, Flux, Fix, Output als Dateien wie bei Real-World-Setup; aktuell 161 pass / 67 skip, d.h. aktuell 70% "conformance")

d.h. vieles geht schon, aber es gibt auch noch einiges zu tun

Aktuelle Dokumentation, GitHub-Repo, Playground

4. Metafacture Playground

Metafacture Playground

Webbasierte Oberfläche zum Ausprobieren und Austauschen von Workflows

Ziel: Einstiegshürde für Metafacture senken, neben Morph-Komplexität unserer Erfahrung nach ein weiteres zentrales Problem bei der Metafacture-Nutzung

Für Entwicklung, Dokumentation, Tutorials, Workshops

https://metafacture.org/playground

5. Ausblick

Community vergrößern

Metafacture hbz-intern als zentrales Tool etablieren

Weitere Nutzer:innen und Mitentwickler:innen innerhalb und außerhalb des hbz-Verbunds gewinnen

Standards nutzen und aufbauen

SKOS Lookups (zum Andocken an SkoHub Vocabs)

Entity Reconciliation mit OpenRefine-kompatiblen Diensten

Fix-Standardisierung, s. https://github.com/elag/FIG

ETL Hub

ETL: Extract, Transform, Load

mehr Kollaboration, Teilen & Auffinden von Workflows ermöglichen (nicht nur für Metafacture)

Entwicklung von Best Practices zur Paketierung und Beschreibung von ETL-Konfigurationen

Aufbau eines ETL Hubs zum Entdecken existierender ETL-Prozesse für die einfache Nachnutzung und Anpassung

6. Fragen und Diskussion

https://metafacture.org