Offene Infrastruktur
hbz-interne Infoveranstaltung,
WWW, 20. Januar 2022
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.
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
[...] 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)
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)
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)
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
Aus: Christoph Böhme, http://swib.org/swib13/slides/boehme_swib13_131.pdf
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
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
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
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
'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
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
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
Aus: Christoph Böhme, http://swib.org/swib13/slides/boehme_swib13_131.pdf
$ 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
'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
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)
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
"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
'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
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
https://metafacture.org/playground
webbasierte Oberfläche zum Herumspielen
für Tutorials, Workshops, Dokumentation
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
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"}
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"}
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
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
Unterstützung der Reconciliation API
SKOS Lookups (zum Andocken an SkoHub Vocabs)
Fix-Standardisierung
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
Aufsetzen einer zentralen Dokumentationsumgebung und Verbesserung der Dokumentation
parallel zur Nutzung für Alma, OERSI, RPB
hbz-intern, verbundweit und darüber hinaus
Hands-On-Lab beim Bibliothekskongress in Leipzig