2020.06 2021.06 2023.06

Mapping von Klassifikationen

Allgemein

Es gibt zwei Arten von Klassifikationsmapping, die im Folgenden erläutert werden.

x-Mapping

Wenn Metadaten z.B. über die OAI-Schnittstelle an externe Services ausgeliefert werden sollen, werden häufige andere Klassifikationseinträge benötigt. Um Mehrfacheingaben zu vermeiden, bietet MyCoRe mit dem Klassifikationsmapping die Möglichkeit, dass nur eine primäre Klassifikation erfasst werden muss. MyCoRe ergänzt dann die äquivalenten Einträge der anderen Klassifikationen automatisch.

Für einen DINI-konformen Betrieb der OAI-Schnittstelle müssen verschiedene Sets unterstützt werden. Sets werden im OAI-PMH Standard verwendet, um Dokumente zu gruppieren. Sie ermöglichen selektives Harvesting und entsprechen konzeptionell den Klassifikationen in MyCoRe. Deshalb wurden zunächst Klassifikationen für die Sets erstellt, die für das DINI-Zertifikat zu implementieren sind. Sie stehen auf mycore.de/classifications als ddc.xml, diniPublType.xml und diniVersion.xml zur Verfügung und müssen in die eigene Anwendung übernommen werden.

Sollen Dokumente im xMetaDissPlus-Format ausgeliefert werden, sind weitere Klassifikationen zu verwenden: dctermsDCMIType.xml und XMetaDissPlusThesisLevel.xml

Im einfachsten Fall lassen sich diese Klassifikationen direkt in einem MyCoRe-Datenmodell verwenden. Allerdings werden die meisten MyCoRe-Anwendungen eigene Klassifikationen besitzen, z.B eine detaillierte DDC oder detailliertere Klassifikation für Dokumententypen. Für solche Fälle wurde das Klassifikationsmapping implementiert.

xPath-Mapping

Es gibt Fälle, wo das klassische Klassifikationsmapping nicht ausreicht. Für ein erweitertes Mapping wird deswegen seit LTS 2023.06 das xPath-Mapping angeboten. Auch dieses alternative Mapping kann dazu benutzt werden, Fremdklassifikationen einer vorhanden Klassifikation zuzuordnen und doppelte Eingaben zu vermeiden. Dadurch, dass Zuordnungen in den Fremdklassifikationen durch xPath-Ausdrücke festgelegt werden, ist das Mapping flexibler in seiner Definition.

Anreicherung der Klassifikation

x-Mapping

Die Definition des Mappings erfolgt, indem die Klassifikationseinträge um ein Label mit dem künstlichen Sprach-Attribut x-mapping erweitert werden. Als Wert wird Klassifikations-ID und Kategorie-ID getrennt durch einen Doppelpunkt dort eingetragen. Mehre Werte können durch Leerzeichen getrennt werden. z.B.:

1
2
3
4
5
6
7
8
    <category ID="TYPE0003.006">
        <label xml:lang="de" text="Dissertation"/>
        <label xml:lang="en" text="dissertation"/>
        <label xml:lang="x-mapping"
               text="diniPublType:doctoralThesis dctermsDCMIType:Text
    XmetaDissPlusThesisLevel:thesis.doctoral diniVersion:publishedVersion"/>
    </category>
    

xPath-Mapping

Die Definition des Mappings erfolgt, indem die Klassifikationseinträge in der Zielklassifikation um ein Label mit dem künstlichen Sprach-Attribut x-mapping-xpath erweitert werden. Als Wert wird ein xPath-Ausdruck eingetragen. z.B.:

1
2
3
4
5
6
7
    <category ID="journal-article">
        <label xml:lang="de" text="Zeitschriftenartikel"/>
        <label xml:lang="en" text="Journal article"/>
        <label xml:lang="x-mapping-xpath"
               text="mods:genre[substring-after(@valueURI,'#')='article'] and mods:relatedItem[@type='host']/mods:genre[substring-after(@valueURI,'#')='journal']"/>
    </category>
    

Es gibt weiterhin eine Variante des xPath-Mappings, das Sprach-Attribut x-mapping-xpathfb. Diese wird als Fallback-Mechanismus genutzt, falls keiner der xPath-Ausdrücke einer Klassifikation zutrifft. Das heißt, der xPath, der für dieses Sprachattribut hinterlegt ist, wird nur dann ausgewertet, wenn keiner der anderen xPaths der Klassifikation einen Treffer erzielt. z.B.:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
    <category ID="journal-article">
        ...
        <label xml:lang="x-mapping-xpath" text="..."/>
    </category>
    <category ID="newspaper-article">
        ...
        <label xml:lang="..."/>
    </category>
    <category ID="online-resource">
        ...
        <label xml:lang="x-mapping-xpathfb" text="mods:genre[substring-after(@valueURI,'#')='article']"/>
    </category>
    

In diesem Beispiel würde ein Klassifikations-Mapping auf eine Online-Resource dann passieren, wenn keiner der anderen xPaths der Klassifikation eine Übereinstimmung hat.

Damit nicht alle Klassifikationen nach dem Sprach-Attribut x-mapping-xpath durchsucht werden müssen, werden die Klassifikationen, die solche Attribute enthalten, in einer Property angegeben:

1
2
     MCR.Category.XPathMapping.ClassIDs=orcidWorkType,kdsfPublicationType
    

Falls diese für eine Klassifikation nicht gesetzt ist, werden mögliche xPath-Mappings ignoriert. Das ist nützlich, falls man vorhandene Klassifikationen mit xPath-Mappings nachnutzen will, ohne die Funktionalität zu benötigen.

Patterns

Da xPath-Ausdrücke recht lang sein und sich wiederholen können, gibt es für das xPath-Mapping einen Pattern-Mechanismus. Damit können wiederkehrende xPath-Ausdrücke in Properties abgelegt und mit Platzhalter versehen werden, z.B.:

1
2
     MCR.Category.XPathMapping.Pattern.genre=mods:genre[substring-after(@valueURI,'#')='{0}']
    

Diese Pattern können dann in Klassifikationen genutzt werden, um die Formulierung von xPaths abzukürzen:

1
2
3
4
5
6
7
    <category ID="journal-article">
        <label xml:lang="de" text="Zeitschriftenartikel"/>
        <label xml:lang="en" text="Journal article"/>
        <label xml:lang="x-mapping-xpath"
               text="{pattern:genre(article)} and not(mods:relatedItem[@type='host'])"/>
    </category>
    

Aus der Konfiguration in diesem Beispiel würde sich folgender xPath ergeben:
mods:genre[substring-after(@valueURI,'#')='article'] and not(mods:relatedItem[@type='host']).
Die allgemeine Syntax lautet:
{pattern:<Name der Property>(<Komma-separierte Liste der einzusetzenden Werte>)}
im jeweiligen xPath und
MCR.Category.XPathMapping.Pattern.<pattern name>=<XPath with optional placeholders>
in den Properties.

Technische Umsetzung

in einer "klassischen" MyCoRe-Anwendung

Das Datenmodell wird um ein Datenfeld mappings/mapping ergänzt werden. Dieses Feld wird dann beim Einfügen oder Aktualisieren der Dokumente automatisch befüllt.

1
2
3
4
5
        <element name="mappings" minOccurs='0' maxOccurs='1'>
            <mcrmetaclassification name="mapping"
                                   class="MCRMetaClassification" minOccurs='1' maxOccurs='unbounded'/>
        </element>
        

Das Mapping wird per EventHandler aktiviert und sollte möglichst früh aufgerufen werden, zumindest noch vor dem Start der Indexierung.

1
2
         MCR.EventHandler.MCRObject.015.Class=org.mycore.common.events.MCRClassificationMappingEventHandler
        

in einer MyCoRe-Anwendung mit MODS-Datenmodell

Wird das MODS-Datenmodell genutzt, muss kein zusätzlichen Datenfeld ergänzt werden. In diesem Fall werden die generierten Einträge als zusätzliche mods:classification Elemente abgespeichert.

Für dieses Verhalten wurde ein weiterer Eventhandler implementiert:

1
2
         MCR.EventHandler.MCRObject.016.Class=org.mycore.mods.classification.MCRClassificationMappingEventHandler
        

Im resultierenden MODS wird der Eintrag durch das Attribut generator eindeutig identifizierbar. Dieses enthält immer das Suffix -mycore und setzt sich weiterhin aus:

  • Quell-Klassifikations-ID und Ziel-Klassifikations-ID, oder
  • dem Präfix "xpathmapping" und der Ziel-Klassifikations-ID zusammen

Siehe dazu nachfolgende Beispiele:

1
2
3
4
5
        <mods:classification
                generator="mir_genres2diniPublType-mycore"
                authorityURI="http://localhost:8291/mir/classifications/diniPublType"
                valueURI="http://localhost:8291/mir/classifications/diniPublType#doctoralThesis"/>
        
1
2
3
4
        <mods:classification generator="xpathmapping2orcidWorkType-mycore"
                             authorityURI="/classifications/orcidWorkType"
                             valueURI="/classifications/orcidWorkType#online-resource"/>