Metamorph

Innerhalb von Metafacture nimmt Metamorph die Rolle einer DSL (“Domain-specific language”) ein, mit welcher einzelne Schlüssel-Wert-Paare (sogenannte Literale) von Datensätzen transformiert oder gefiltert werden. Dafür werden Regeln (“Metamorph”- oder kurz “Morph-Definition”) festgelegt, welche anschliessend durch Metafacture auf einzelne Felder (identifiert durch Schlüssel-/Feldnamen) angewendet werden. Diese Regeln sind als XML-Elemente formuliert, und daher sind auch Metamorph-Dateien “normale” XML-Dateien.

Einen umfassenden Überblick über die erlaubten Elemente gibt das Metamorph-Schema.

XML-Struktur

Jede Morph-Definition muss innerhalb des <metamorph>-Elementes abgelegt werden:

<?xml version="1.0" encoding="UTF-8"?>
<metamorph xmlns="http://www.culturegraph.org/metamorph" version="1">
  <!-- Hier kommen die Definitionen hin -->
</metamorph>

Direkt unterhalb des <metamorph>-Elementes können folgende Elemente definiert werden:

Metamorph selbst hat zwei eigene Attribute:

Verwendung von Metamorph-Definitionen in Metafacture

In Metafacture werden Workflows mithilfe von sogenannten Flux”-Skripten festgelegt. Flux besteht aus einer Reihe von Befehlen (commands), die jeweils einen Teil des Workflows beschreiben (bspw. das Öffnen einer Datei oder das Dekodieren eines Formates).

Ein Überblick der zur Verfügung stehenden Flux-Befehle ist hier zu finden.

Um eine Morph-Definition in einem solchen Flux-Skript zu verwenden, wird der Befehl morph('/pfad/zur/morph/datei') benutzt.

Daneben gibt es noch einen zweiten Befehl, der ebenfalls mit Morph-Definitionen arbeitet: filter('/pfad/zur/morph/datei'). In einer solchen Morph-Datei werden Regeln definiert - meistens das Vorhandensein einzelner Felder -, welche von einem Datensatz erfüllt werden müssen, damit er im Workflow weitergeleitet wird. Vielfach macht es Sinn, einen solchen Filter mit einer nachfolgenden Transformation zu kombinieren, so beispielsweise um zu vermeiden, dass Datensätze in die Transformation geschickt werden, welche nicht “regelkonform” sind und daher zu unerwarteten Resultaten führen können.

Ein Beispiel für einen solchen Fall ist die “baseline”, ein Datenworkflow in linked-swissbib, wo die Existenz eines gewissen Feldes - MARC-Feld 245*.a - Voraussetzung dafür ist, dass weitere Felder eines Datensatzes im Morph-Schritt korrekt zusammengefügt werden.