Datentransformation im hbz

Offene Infrastruktur

hbz-interne Infoveranstaltung,
WWW, 20. Januar 2022

https://slides.lobid.org/2022-01-metafacture-hbz/
Creative Commons License

Annahmen

Transformationen von Metadaten gehören im hbz & in größeren wissenschaftlichen Bibliotheken zum täglichen Geschäft.

Es gibt viele unterschiedliche Methoden, die meist Programmierkenntnise voraussetzen (z.B. Perl-Skripts).

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 kollaborativer, effizienter, bequemer zu gestalten.

Anwendungsszenarien für Datentransformationen

Datenanreicherung: z.B. Ergänzung von Daten aus Wikidata in lobid

Datenaggregation aus unterschiedlichen Quellen: z.B. für DigiBib IntrOX oder ONIX-Verlagsdaten für we:kb

Systemmigration: z.B. nach Alma oder Folio oder weg von Allegro

Datenbereitstellung: z.B. Publikation von Linked Open Data in lobid

Agenda

  1. Was ist Metafacture?
  2. Zur Historie
  3. Aktuelle Entwicklungen & Ziele
  4. Strategie
  5. Nächste Schritte
  6. Diskussion

1. 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, Batch-Verarbeitung, on-the-fly

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

Was kann man mit Metafacture machen?

Daten analysieren (z.B. Felder oder Werte zählen)

Daten zusammenführen / anreichern (z.B. Katalog/Wikipedia)

Daten transformieren (z.B. von MARC zu JSON)

Daten extrahieren / laden (z.B. von OAI-PMH zu Elasticsearch)

Wo wir Metafacture nutzen

Transformation der Daten des Verbundkatalogs für die Indexierung als JSON-LD

hbz linked data service: Web-APIs und Suchoberflächen für Titel- und Normdaten (lobid.org)

Auf Basis von Lobid: Nordrhein-Westfälische Bibliographie (nwbib.de)

Metadaten aus verschiedenen Quellen im OER Suchindex aggregieren (OERSI)

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 bearbeiten 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

In Entwicklung: Metafacture-Playground zum einfachen Ausprobieren in einer Web-Oberfläche

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

Dokumentation

Was für Module gibt es? Was machen die?


$ flux.sh # oder flux.bat auf Windows
				

https://github.com/metafacture/metafacture-documentation/blob/master/flux-commands.md

https://metafacture.org/

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

Daten analysieren

Beispiel: Feldwerte zählen

Anzahl unterschiedlicher Werte im Edition-Feld (032@.a)


$ gedit count.xml &
				


					

$ gedit count.flux &
					

"bib-data.pica.gz"
|open-file
|as-lines
|decode-pica
|morph("count.xml")
|stream-to-triples
|count-triples(countBy="object")
|template("${o} | ${s}")
|write("stdout");
					

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

Beispiel: Feldwerte zählen


1 | (1. Aufl.)
1 | (16.-20. Taus.)
2 | (2. Aufl.)
1 | (2. Aufl.) - 1:10 000
1 | (2. ed.)
1 | (3. rev. ed.)
1 | (Ausg. 1971/72)
1 | (Ausg. für die Volkswirtschaft), 1. Ausg., Stand der Unterlagen: 1977
1 | (Ausg. für die Volkswirtschaft), 1. Ausg., Stand der Unterlagen: 1986
1 | (Ausg. für die Volkswirtschaft), 1. Ausg., Stand der Unterlagen: 1987
1 | (Ausg. für die Volkswirtschaft), 3. Ausg., Stand der Unterlagen: 1980
2 | (Ausg. für die Volkswirtschaft), 3. Ausg., Stand der Unterlagen: 1981
3 | (Ausg. für die Volkswirtschaft), 3. Ausg., Stand der Unterlagen: 1982
1 | (Rechtsstand: 1. Nov. 1963)
1 | (Stand: 1. Sept. 1965)
1 | (Stand: Januar 1990)
1 | (Versión rev.), 4. ed.
1 | 05/1974
2 | 1. - 10. Tsd.
1 | 1. - 3. Tsd.
1 | 1. - 5. Tsd.
1 | 1. - 9. Tsd.
494 | 1. Aufl.
1 | 1. Aufl. d. Neubearb.
1 | 1. Aufl. d. Neuübers.
3 | 1. Aufl. dieser Ausg.
1 | 1. Aufl., 1. - 50. Tsd.
14 | 1. Aufl., 1. Dr.
...
22 | Dt. Erstausg.
4 | Dt. Erstausg., 1. Aufl.
...
26 | Orig.-Ausg.
8 | Orig.-Ausg., 1. Aufl.
...
					

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

Daten zusammenführen / anreichern

Wurmloch

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

Daten zusammenführen


$ gedit enrich-wiki.flux &
				

"authority-persons.pica.gz"
|open-file
|as-lines
|decode-pica
|stream-to-triples
|@X;

"wiki-persons.foma.gz"
|open-file
|as-lines
|decode-formeta
|morph("enrich-wiki.xml")
|stream-to-triples(redirect="true")
|@X;

@X
|wait-for-inputs("2")
|sort-triples(by="subject")
|collect-triples
|encode-formeta(style="multiline")
|write("stdout");
					

$ flux.sh enrich-wiki.flux
					

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

Daten zusammenführen


'118514768' {
	'001A' {
		'0': '1250:01-07-88'
	},
	'001B' {
		'0': '1140:26-07-13',
		't': '08:58:08.000'
	},
	'001D' {
		'0': '1220:16-06-08'
	},
	'001U' {
		'0': 'utf8'
	},
	'001X' {
		'0': '0'
	},
	'002@' {
		'0': 'Tp1'
	},
	'003@' {
		'0': '118514768'
	},
	'003U' {
		'a': 'http://d-nb.info/gnd/118514768',
		'z': 'http://d-nb.info/gnd/1022091077'
	},
	...
	'lccn': 'n/79/18801',
	'ndl': '00434255',
	'viaf': '2467372',
	'imdb': '0106517',
	'category': 'Bertolt Brecht',
	'category': 'Autor',
	'category': 'Literatur (20. Jahrhundert)',
	'category': 'Literatur (Deutsch)',
	'category': 'Literatur (Berlin)',
	'category': 'Lyrik',
	'category': 'Drama',
	'category': 'Novelle',
	'category': 'Essay',
	'category': 'Politische Literatur',
	'category': 'Theaterregisseur',
	'category': 'Liedtexter',
	'category': 'Drehbuchautor',
	'category': 'Filmregisseur',
	'category': 'Hanns Eisler',
	'category': 'Helene Weigel',
	'category': 'NS-Opfer',
	'category': 'Emigrant aus dem Deutschen Reich zur Zeit des Nationalsozialismus',
	'category': 'Träger des Nationalpreises der DDR I. Klasse für Kunst und Literatur',
	'category': 'Mitglied der Akademie der Künste (DDR)',
	'category': 'Deutscher',
	'category': 'Österreicher',
	'category': 'DDR-Bürger',
	'category': 'Künstler (DDR)',
	'category': 'Künstler (Augsburg)',
	'category': 'Schriftsteller (Berlin)',
	'category': 'Geboren 1898',
	'category': 'Gestorben 1956',
	'category': 'Mann',
	'category': 'Deutscher Widerstand gegen den Nationalsozialismus in den USA'
}
'11852884X' {
	'001A' {
		'0': '1250:01-07-88'
	},
	'001B' {
		'0': '1510:27-05-08',
		't': '09:39:52.000'
	},
	'001D' {
		'0': '9999:06-04-08'
	},
	'001U' {
		'0': 'utf8'
	},
	'001X' {
		'0': '0'
	},
	'002@' {
		'0': 'Tp1'
	},
	'003@' {
		'0': '11852884X'
	},
	'003U' {
		'a': 'http://d-nb.info/gnd/11852884X'
	},
	...
	'lccn': 'n/79/21285',
	'ndl': '00438594',
	'viaf': '108299403',
	'imdb': '0248767',
	'category': 'Umberto Eco',
	'category': 'Philosoph (20. Jahrhundert)',
	'category': 'Philosoph (21. Jahrhundert)',
	'category': 'Autor',
	'category': 'Literatur (20. Jahrhundert)',
	'category': 'Literatur (21. Jahrhundert)',
	'category': 'Literatur (Italienisch)',
	'category': 'Semiotiker',
	'category': 'Roman, Epik',
	'category': 'Erzählung',
	'category': 'Essay',
	'category': 'Medienwissenschaftler',
	'category': 'Kulturwissenschaftler',
	'category': 'Herausgeber',
	'category': 'Hochschullehrer (Bologna)',
	'category': 'Pataphysik',
	'category': 'Träger des Großen Bundesverdienstkreuzes mit Stern',
	'category': 'Träger des Verdienstordens der Italienischen Republik (Großkreuz)',
	'category': 'Träger des Ordre des Arts et des Lettres (Komtur)',
	'category': 'Träger des Pour le Mérite (Friedensklasse)',
	'category': 'Träger des Österreichischen Staatspreises für Europäische Literatur',
	'category': 'Mitglied der Ehrenlegion (Offizier)',
	'category': 'Ehrendoktor einer Universität',
	'category': 'Ehrendoktor der Freien Universität Berlin',
	'category': 'Ehrendoktor der Hebräischen Universität Jerusalem',
	'category': 'Ehrendoktor der Universität Tartu',
	'category': 'Ehrendoktor der Universität Tel Aviv',
	'category': 'Italiener',
	'category': 'Geboren 1932',
	'category': 'Mann'
}
					

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

Daten transformieren

Transformationsmodul

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

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

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

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

Beispiel: Datentransformation

z.B. Titel, Verlag, Erscheinungsort und -jahr aus den PICA-Feldern 021A.a, 033A.n, 033A.p, 011@.n verwenden

Verlag und Erscheinungsort sollen in einem neuen Feld kombiniert werden

Als Feldnamen wollen wir sprechende, nicht-numerische Bezeichnungen haben

Beispiel: Datentransformation


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

$ gedit simple-transformation.xml &
					

<data source="021A.a" name="Title"></data>
<data source="011@.n" name="Year">
	<regexp match="\[(\d+)\]" format="${1}"/>
</data>
<combine name="Publisher" value="${Publisher}: ${Place}">
	<data source="033A.n" name="Publisher"></data>
	<data source="033A.p" name="Place"></data>
</combine>
					

$ flux.sh simple-transformation.flux
					

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

Beispiel: Datentransformation


'576121444' {
	'Year': '1939',
	'Title': 'Die @Nathanaelfrage unserer Tage',
	'Publisher': 'Schwarzmann: Köln'
}
'958090564' {
	'Title': 'Zukunft Bildung',
	'Publisher': 'Polit. Akad.: Wien'
}
'780510143' {
	'Title': 'Christa Dichgans, "Unsere Welt"',
	'Publisher': 'Galerie Springer: Berlin'
}
'361809549' {
	'Title': 'Hundert Jahre Buchdrucker-Innung Hamburg',
	'Publisher': 'Buchdrucker-Innung (Freie Innung): Hamburg',
	'Publisher': '[Verlagsbuchh. Broschek & Co.]: Hamburg'
}
'956745954' {
	'Title': 'Arbeit, Ausbildung und Qualifikation für Drogengebraucher in Substitutionsbehandlung',
	'Publisher': 'Dt. AIDS-Hilfe: Berlin'
}
'364457708' {
	'Title': 'Passau und der Bayerische Wald',
	'Publisher': 'Hoffmann u. Campe: Hamburg'
}
'963517473' {
	'Title': 'Fußball-Fan',
	'Publisher': 'Tomus: München'
}
'578515415' {
	'Title': 'Der @Galeerensklave',
	'Publisher': 'Gauverl. Bayreuth: Bayreuth'
}
'573885400' {
	'Year': '1919',
	'Title': 'In den Tagen des Antichristen',
	'Publisher': 'Verl. d. "Bücherboten": Düsseldorf'
}
'942958748' {
	'Title': 'Anleitung zur Erstellung eines Handbuches für die Materialwirtschaft in Versorgungsunternehmen',
	'Publisher': 'VDEW: Frankfurt am Main'
}
					

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

2. Zur Historie

2011: Start der Entwicklung durch DNB im Rahmen von Culturegraph; damals schon Austausch, Architektur-Anregungen durch hbz-Toolbox

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

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

2020: Metafacture ist Teil des einheitlichen Metadatenmanagements an der TU Dortmund

Ende 2020: Start der Projekte Metafacture-Fix und Metafacture Playground

3. Aktuelle Entwicklungen

Metafacture Playground

https://metafacture.org/playground

webbasierte Oberfläche zum Herumspielen

für Tutorials, Workshops, Dokumentation

Metafacture-Fix

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

Anknüpfung an existierende Konfigurationssprache aus Catmandu (mittelfristiges Ziel: Standardisierung)

Erleichterung der Transformationskonfiguration

Vergrößerung der Zielgruppe um Bibliothekar*innen und andere Metadatenfachleute

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

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

Alma-Daten mit Fix transformieren

Fix steht in Grundzügen (Danke für die gute Zusammenarbeit an die Gruppe Portale!)

wird nun von DigiBib und OI mit Alma-MARC-Daten genutzt und dabei optimiert

außerdem Nutzung für Transformationen in OERSI und zum initialen Aufbau der neuen RPB

4. Strategie

Community vergrößern

Metafacture hbz-intern als zentrales Tool etablieren

mehr Bibliotheken im hbz-Verbund als Nutzer:innen gewinnen

mehr Nutzer:innen und Mitentwickler:innen außerhalb des Verbunds (wieder)gewinnen

Standards nutzen und aufbauen

Unterstützung der Reconciliation API

SKOS Lookups (zum Andocken an SkoHub Vocabs)

Fix-Standardisierung

ETL Hub

ETL: Extract, Transform, Load

mehr Kollaboration, Teilen & Auffinden von Workflows ermöglichen

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

5. Nächste Schritte

Dokumentation verbessern

Aufsetzen einer zentralen Dokumentationsumgebung und Verbesserung der Dokumentation

parallel zur Nutzung für Alma, OERSI, RPB

Metafacture Workshops

hbz-intern, verbundweit und darüber hinaus

Hands-On-Lab beim Bibliothekskongress in Leipzig

6. Fragen und Diskussion

Wer hat Interesse an einem hbz-/verbundinternen Metafacture-Workshop teilzunehmen?

https://metafacture.org