
\chapter{Datenbank}
\label{ch:datenbank}

Zur Speicherung der Datensätze verwendet WikiWord ein relationales Datenbanksystem, konkret MySQL \q{MYSQL}. Das interne Datenmodell ist daher in Form von Entitäten und ihren Beziehungen definiert, die sich in Datenbanktabellen und \nospell{-feldern} manifestieren. Diese Datenbankstruktur von lokalen und globalen Datensätzen ist in den Abschnitten \rr{sec:datenbankstruktur} und \rr{sec:datenbank-tabellen} beschrieben, die Abschnitte \rr{sec:DAO} und \rr{sec:DAO-Builder} befassen sich mit der \nom{Datenzugriffsschicht} (\lingo{DAO-Layer}), die die Einzelheiten der Kommunikation mit der Datenbank kapselt.

Datensätze haben in WikiWord Namen und werden in Kollektionen zusammengefasst (\rr{sec:begriffe}). Der Name muss innerhalb einer Kollektion eindeutig sein, die Kombination aus dem Namen der Kollektion und dem Namen des Datensatzes (der "`\emph{qualifizierte Datensatzname}"') muss innerhalb einer Datenbank einmalig sein --- idealerweise dient er als eindeutiger Bezeichner innerhalb der Organisation, die den Thesaurus erstellt (vergleiche \rr{sec:uris}). Es gibt zwei Arten von Datensätzen: einerseits \emph{lokale}, die aus einem bestimmten Korpus (also einer bestimmten Wikipedia) extrahiert wurden (siehe \rr{sec:ImportConcepts}) --- sie tragen in der Regel den Sprachcode als Namen, der der Sprache des Korpus entspricht; und andererseits \emph{globale}, die äquivalente Konzepte aus den verschiedenen lokalen Datensätzen zu sprachunabhängigen Konzepten verbinden (siehe \rr{sec:BuildThesaurus}). Im Allgemeinen gibt es in jeder Kollektion nur einen globalen Datensatz und dieser bezieht sich auf alle lokalen Datensätze der Kollektion.

\label{p:db-prefix}
MySQL betrachtet eine "`Datenbank"' als eine Menge von Tabellen mit Namen, die innerhalb der Datenbank eindeutig sind, eine Aufteilung der Datenbank in "`Schemas"' wird nicht unterstützt (der Begriff "`Schema"' wird im Folgenden als Synonym für "`Datenbankstruktur"' verwendet, nicht als Bezeichnung für eine organisatorische Unterteilung von Datenbanken). WikiWord kann alle Datensätze aus allen Kollektionen in einer einzigen Datenbank verwalten, indem dem Namen jeder Datenbanktabelle ein \emph{Präfix} vorangestellt wird, der aus dem Namen der Kollektion und dem Namen des Datensatzes erzeugt wird. Zum Beispiel ergibt sich der Präfix "`\sqlid{full2008_de_}"' für den Datensatz \sqlid{de} in der Kollektion \sqlid{full2008}, die Tabelle \sqlid{concept} für diesen Datensatz würde also den Namen \sqlid{full2008_de_concept} tragen.

\section{Datenbankstruktur}
\label{sec:datenbankstruktur}
\label{model:lokales-datenmodell} \label{model:globales-datenmodell}

  \later{grafik}

Das relationale Datenbank-Schema, das WikiWord benutzt, um die aus der Wikipedia extrahierten Daten zu speichern und zu verarbeiten, repräsentiert Konzepte und Terme sowie Relationen zwischen Konzepten und zwischen Konzepten und Termen, das heißt, es implementiert das \nom{Konzeptmodell}. Zusätzlich zu den primären Strukturen, aus denen der Thesaurus besteht, werden Strukturen für Sekundärdaten und temporäre Daten benötigt. 

Zu beachten ist, wie sich die \nom{lokale} von der \nom{globalen} Ausprägung des Datenbank-Schemas unterscheidet: das lokale Schema beschreibt Datensätze, die direkt aus \emph{einer} einzelnen Wikipedia extrahiert wurden (\rr{entwurf:lokales-datenmodell}), also Daten in einer bestimmten Sprache. Das globale Schema beschreibt den Datensatz, der sich aus dem Zusammenführen der einzelnen lokalen Datensätze ergibt (\rr{entwurf:globales-datenmodell}). An den Tabellen und Feldern im Abschnitt \rr{sec:datenbank-tabellen} ist jeweils angegeben, ob sie nur im globalen oder nur im lokalen Schema verwendet werden oder in beiden.

\label{sec:referenzen}\label{p:denormalisiert}\label{p:deferred-ids}
Die Datenbankstrukturen, die WikiWord zur Speicherung der Datensätze verwendet, sind nicht vollständig \nom{normalisiert} --- zwar sind die Entitäten und Relationen in einzelnen Tabellen repräsentiert und durch Referenzen verbunden, die Tabellen enthalten aber an einigen Stellen redundante Informationen. Insbesondere sind die Referenzen auf Konzepte an vielen Stellen doppelt realisiert: einmal über numerische ID des Konzeptes und einmal über den Namen. Diese gezielte \nom{Denormalisierung} des Datenbankmodells hat folgende Vorteile:

\begin{itemize}
  \item Namensbasierte Referenzen erlauben einen schnellen Aufbau des Datenbestandes dadurch, dass Beziehungen zwischen Konzepten gespeichert werden können, wenn nur ihr Name, aber (noch) nicht ihre numerische ID bekannt ist. In diesem Fall würde in der Relation nur ein Verweis auf den Namen des Konzeptes abgelegt, das Feld, das die ID referenziert, bliebe zunächst \sqlid{NULL} und würde erst in einem Nachbereitungsschritt gesetzt (\rr{p:resolve-ids}). Zwar könnten die Relationen auch gänzlich auf der Basis von Namen arbeiten, so dass keine IDs verwaltet werden müssen --- das bedeutet allerdings eine deutlich schlechtere Performanz bei Datenbankoperationen, insbesondere wenn eine große Zahl von Verknüpfungen auf einmal verarbeitet werden muss, wie das bei einem \lingo{Join} (\nom{Verbund}) der Fall ist.
  
  Namensbasierte Referenzen vermeiden also den Aufwand, bei jeder Referenz die ID des entsprechenden Konzeptes durch eine Datenbankabfrage bestimmen und gegebenenfalls einen Eintrag für das Konzept anlegen zu müssen. Andererseits müssen die IDs am Ende in einem zusätzlichen Arbeitsschritt nachgeführt werden. Eine Alternative ist, die Abbildung von Konzeptnamen auf numerische IDs vollständig im Arbeitsspeicher zu verwalten --- was allerdings, abhängig von der Anzahl zu speichernder Konzepte, eine große Menge RAM erfordert (siehe \rr{p:id-manager}).
  
  \item Ein weiterer Vorteil, Referenzen doppelt für Namen und IDs zu führen, ist, dass auf diese Weise häufig ein \lingo{Join} auf die Tabelle \sqlid{concept} gänzlich vermieden werden kann --- nämlich dann, wenn der Konzepteintrag nur benötigt wird, um den menschenlesbaren Namen des Konzeptes zu bestimmen. Einen \lingo{Join} zu vermeiden bedeutet einerseits bessere Performanz und andererseits einfachere Abfragen, die leichter zu warten und weniger fehleranfällig sind.
  
  \item Auch bei der Fehlersuche und \nospell{-analyse} ist es hilfreich, Beziehungen direkt in einer "`lesbaren"' Form, also zwischen Name und Name, betrachten zu können. Das vermeidet zusätzlichen Aufwand und neue Fehlerquellen bei der manuellen Navigation der Datenbank.
\end{itemize}

Die Verwendung des Namens eines Konzeptes zur Identifikation ist allerdings auf lokale Datensätze beschränkt: für globale Datensätze sind die Namen weniger aussagekräftig und auch zunehmend "`unhandlich"', da sie aus der Konkatenation aller Namen von lokalen Konzepten bestehen, die das globale Konzept kombiniert. Auch ist der Nutzen der doppelten Referenzen hier geringer, weil kein schrittweise Aufbau der Daten stattfindet und somit die numerischen IDs aller Konzepte im Vorhinein bekannt sind. 

\section{Datenbanktabellen}
\label{sec:datenbank-tabellen} 

Dieser Abschnitt erläutert die Struktur und Funktion der einzelnen Datenbanktabellen.

\subsection*{\sqlid{concept}}
\label{sec:concept-table}

Die Tabelle \sqlid{concept} repräsentiert die einzelnen Konzepte des Thesaurus. Die Konzepte bilden das Herzstück der Datenstruktur, sie sind die Entitäten, auf die sich sämtliche Relationen beziehen.

Diese Tabelle existiert sowohl in lokalen als auch in globalen Datensätzen. Sie enthält die folgenden Felder:

\begin{description}
 \item[\sqlid{id}:]     Interne ID, automatisch vergeben. Eindeutig innerhalb eines Datensatzes.
 \item[\sqlid{random}:] Zufallswert zwischen 0 und 1, um effizient zufällige Konzepte wählen zu können.
 \item[\sqlid{name}:]   Name des Konzeptes, hergeleitet von dem Namen der betreffenden Wikipedia-Seite. Der Name ist eindeutig innerhalb eines Datensatzes. Er hat \emph{keine} Bedeutung im Thesaurus, kann aber zur Anzeige verwendet werden. In einem lokalen Datensatz ist dieses Feld ein \nom{Schlüssel} der Tabelle \sqlid{concept} und erlaubt einen effizienten Zugriff auf einzelne Einträge (vergleiche \rr{sec:referenzen}) -- für globale Datensätze ist das \emph{nicht} der Fall, dort ist der Name rein informativ.
 \item[\sqlid{type}:]   Typ des Konzeptes, wie von \javaid{ConceptType} definiert. Siehe auch \rr{sec:konzeptklassifikation}.
 \item[\sqlid{resource} (nur lokal):]  Referenz auf den Eintrag in der Tabelle \sqlid{resource} für diejenige Wiki-Seite, die dieses Konzept beschreibt. Die Ressource ist der Ort der autoritativen Definition des Konzeptes.
 \item[\sqlid{language_bits} (nur global):]   Oder-Verknüpfung der Sprach-Bits der lokalen Konzepte, die das globale Konzept zusammenfasst (\rr{p:language-bits}). Die entsprechenden lokalen Konzepte sind über die Tabelle \sqlid{origin} verknüpft (\rr{sec:origin-table}).
 \item[\sqlid{language_count} (nur global):]  Anzahl der lokalen Konzepte, die das globale Konzept zusammenfasst. Erlaubt den Aufbau einer Statistik darüber, wie stark lokale Konzepte zusammengefasst werden konnten.
\end{description}

\subsection*{\sqlid{resource}}
\label{sec:resource-table}
Zusätzlich zu den Konzepten werden im lokalen Datensatz auch Einträge für \nom{Ressourcen}, also Wiki-Seiten, angelegt und an verschiedenen Stellen referenziert. So wird für die Konzepte und viele der Relationen angegeben, aus welcher konkreten Seite sie extrahiert wurden (\rr{sec:import-aus-wikitext}). Das macht die Herkunft einzelner Beziehungen nachvollziehbar und hilft so bei der Fehlersuche. Außerdem ist diese Information Voraussetzung für selektive Updates der Informationen aus einzelnen Ressourcen.

Die Tabelle \sqlid{resource} enthält Einträge für all die Ressourcen, aus denen Informationen extrahiert wurden. Diese Einträge beziehen sich auf einen konkreten Korpus, daher existiert diese Tabelle nur für lokale Datensätze.

\begin{description}
 \item[\sqlid{id}:] Interne ID, automatisch vergeben. Eindeutig innerhalb eines Datensatzes.
 \item[\sqlid{name}:] Name der Ressource, eindeutig innerhalb eines Datensatzes. Entspricht dem Namen der Wiki-Seite.
 \item[\sqlid{type}:] Code für den Typ der Ressource, wie von \javaid{ResourceType} definiert. Wichtige Typen sind \javaid{ARTICLE}, \javaid{REDIRECT}, \javaid{DISAMBIGUATION} und \javaid{CATEGORY}. Siehe auch \rr{sec:ressourcenklassifikation}.
 \item[\sqlid{timestamp}:] Zeitstempel der letzten Änderung an der Ressource. Wird direkt aus der Datenquelle (also dem Dump) übernommen und kann für selektive Updates verwendet werden.
\end{description}

\subsection*{\sqlid{definition}}
\label{sec:definition-table}
Die Tabelle \sqlid{definition} speichert die Definitionssätze (Glossen) für die einzelnen Konzepte, wie sie aus den Wikipedia-Artikeln extrahiert wurden (\rr{sec:analyzer:glossen}). Definitionen sind natürlich an eine bestimmte Sprache und daher an einen konkreten Korpus gebunden, daher gibt es diese Tabelle nur für lokale Datensätze. 
\begin{description}
 \item[\sqlid{concept}:] Verweis auf den Eintrag in der Tabelle \sqlid{concept}, für den die Definition gilt.
 \item[\sqlid{definition}:] Der Text der Definition. Dieser Text sollte vollständig von Wiki-Markup bereinigt sein.
\end{description}

\subsection*{\sqlid{broader}}
\label{sec:broader}
Die Tabelle \sqlid{broader} repräsentiert die Subsumtionsrelation zwischen Konzepten: sie verbindet also allgemeinere Konzepte mit ihnen untergeordneten, konkreteren, wobei jedes Konzept beliebig viele über- wie auch untergeordnete Konzepte haben kann. Das entspricht der klassischen \nom{Hyperonym}-Beziehung (die NT/BT-Relation nach \q{ISO:2788}), bezieht sich aber auf Konzepte und nicht auf Terme. Die Tabelle enthält die folgenden Felder:

\label{sec:broader-table}
\begin{description}
 \item[\sqlid{narrow} (lokal und global) und \sqlid{narrow_name} (nur lokal):] Verweise auf den Eintrag in der Tabelle \sqlid{concept}, der das konkretere Konzept enthält. \sqlid{narrow} ist ein Verweis auf das Feld \sqlid{id}, \sqlid{narrow_name} auf das Feld \sqlid{name}. Während des Imports kann \sqlid{narrow} zunächst NULL sein und würde dann später nachgeführt (siehe \rr{p:deferred-ids}).
 \item[\sqlid{broad} (lokal und global) und \sqlid{broad_name} (nur lokal):] Verweise auf den Eintrag in der Tabelle \sqlid{concept}, der das allgemeinere Konzept enthält. \sqlid{broad} ist ein Verweis auf das Feld \sqlid{id}, \sqlid{broad_name} auf das Feld \sqlid{name}. Während des Imports kann \sqlid{broad} zunächst NULL sein und würde dann später nachgeführt.
 \item[\sqlid{resource} (nur lokal):] Verweis auf den Eintrag in der Tabelle \sqlid{resource} für die Wiki-Seite, aus der diese Verknüpfung extrahiert wurde.
 \item[\sqlid{rule} (nur lokal):] ID der Regel, die verwendet wurde, um diese Verknüpfung zu extrahieren (siehe \rr{p:extraction-rules}). Das erlaubt eine Evaluation der Verwendung und Akkuratheit einzelner Regeln (Heuristiken).
\end{description}

\subsection*{\sqlid{langlink}}
\label{sec:langlink-table} 

Die Tabelle \sqlid{langlink} enthält die Language-Links (siehe \rr{p:wp-features}), die in den einzelnen Wikipedia-Seiten definiert wurden. Sie repräsentieren eine \nom{semantische Ähnlichkeit} oder gar \nom{Äquivalenz} zwischen Konzepten in Datensätzen verschiedener Sprachen. Die Information, die in dieser Verknüpfung enthalten ist, ist essentiell für das Zusammenführen von lokalen Konzepten zu sprachunabhängigen (siehe \rr{sec:BuildThesaurus} und insbesondere \rr{sec:Merging}).

\begin{description}
 \item[\sqlid{concept} und \sqlid{concept_name}:] Verweise auf den Eintrag in der Tabelle \sqlid{concept}, von dem die Verknüpfung ausgeht. \sqlid{concept} ist ein Verweis auf das Feld \sqlid{id}, \sqlid{concept_name} auf das Feld \sqlid{name}.
 \item[\sqlid{language}:] Der Name des lokalen Datensatzes, auf den verwiesen wird (also der Sprachcode der betreffenden Wikipedia). Der betreffende Datensatz muss nicht unbedingt in der vorliegenden Kollektion enthalten sein.
 \item[\sqlid{target}:]   Der Name des ähnlichen oder äquivalenten Konzeptes in dem anderen Datensatz (also der Name der Seite in der entsprechenden Wikipedia).
 \item[\sqlid{resource}:] Verweis auf den Eintrag in der Tabelle \sqlid{resource} für die Wiki-Seite, aus der diese Verknüpfung extrahiert wurde.
\end{description}

\subsection*{\sqlid{link}}
Die Tabelle \sqlid{link} repräsentiert Referenzen zwischen Konzepten, wie sie sich aus Hypertext-Verknüpfungen zwischen den Seiten, die die Konzepte beschreiben, ergeben. Sie speichert außerdem den für die Verknüpfung verwendeten Link-Text (\nom{Label}), und stellt somit eine Verbindung zwischen solchen Link-Texten als Termen und Konzepten (nämlich den Zielen des Verweises) her (\rr{sec:analyzer:links} und \rr{p:import:link-text}). Die Tabelle \sqlid{link} wird auch dann zum Speichern für solche Zuordnungen von Termen und Konzepten verwendet, wenn diese nicht aus einem Hyperlink resultieren --- in diesem Fall gibt es kein Quell-Konzept, das heißt, \sqlid{anchor} und \sqlid{anchor_name} sind \sqlid{NULL}.
\label{sec:link-table}
\begin{description}
 \item[\sqlid{anchor} (lokal und global) und \sqlid{anchor_name}  (nur lokal):] Verweise auf den Eintrag in der Tabelle \sqlid{concept}, von dem die Verknüpfung ausgeht. \sqlid{anchor} ist ein Verweis auf das Feld \sqlid{id}, \sqlid{anchor_name} auf das Feld \sqlid{name}. In Fällen einer bloßen Zuordnung eines Terms zu einem Konzept sind diese Felder NULL.
 \item[\sqlid{target} (lokal und global) und \sqlid{target_name}  (nur lokal):] Verweise auf den Eintrag in der Tabelle \sqlid{concept}, auf den die Verknüpfung zielt. \sqlid{target} ist ein Verweis auf das Feld \sqlid{id}, \sqlid{target_name} auf das Feld \sqlid{name}. Diese Felder bestimmen also, welches Konzept mit dem in \sqlid{term_text} gespeicherten Term gemeint ist.
 \item[\sqlid{resource} (nur lokal):] Verweis auf den Eintrag in der Tabelle \sqlid{resource} für die Wiki-Seite, aus der diese Verknüpfung extrahiert wurde.
 \item[\sqlid{term_text}:] Term, der dem in \sqlid{target} referenzierten Konzept zugeordnet wird, zum Beispiel weil er als Link-Text (\nom{Label}) eines Hyperlinks auf dieses Konzept vorkommt.
 \item[\sqlid{rule} (nur lokal):] ID der Regel, die verwendet wurde, um diese Verknüpfung zu extrahieren (siehe \rr{p:extraction-rules}). Das erlaubt einerseits eine Evaluation der Verwendung und Akkuratheit einzelner Regeln (Heuristiken), andererseits dient es auch der Bestimmung der Verlässlichkeit von Termzuweisungen selbst: Die Werte im Feld \sqlid{rule} in der Tabelle \sqlid{meaning}, die für das Cutoff beim Export des Thesaurus verwendet wird (\rr{sec:cutoff}), basieren auf den Werten dieses Feldes.
\end{description}

\subsection*{\sqlid{section}}
\label{sec:section}
Die Tabelle \sqlid{section} ist eine temporäre Ablage für Artikel\emph{abschnitte}, die als Ziel eines Hyperlinks dienen (siehe \rr{sec:anker}). Für solche Abschnitte wird später jeweils ein eigener Konzepteintrag erstellt, der dann dem Konzept des Artikels, der den Abschnitt enthält, untergeordnet wird (siehe \rr{sec:import-nachbereitung}). Wird nur in lokalen Datensätzen verwendet.
\label{sec:section-table}
\begin{description}
 \item[\sqlid{resource}:] Verweis auf den Eintrag in der Tabelle \sqlid{resource} für die Wiki-Seite, auf der sich die Verknüpfung befindet, die auf den Abschnitt verweist.
 \item[\sqlid{section_name}:]	Der volle Name des Abschnitts (in der Form \txt{Seite\#Abschnitt}), eindeutig innerhalb eines Datensatzes.
 \item[\sqlid{concept_name}:]	Der Name des Konzeptes, den die Seite, in der der Abschnitt liegt, beschreibt.
\end{description}

\subsection*{\sqlid{alias}}
Die Tabelle \sqlid{section} speichert alle Aliase, also alle sekundären Namen von Konzepten, wie sie sich \zB aus \nom{Weiterleitungsseiten} (\rr{sec:wikitext:magicwords}) in der Wikipedia oder anderen Quellen ergeben (zum Beispiel der Zuordnung von \nom{Hauptartikeln} zu Kategorien, \rr{p:Hauptartikel}). Diese Tabelle dient vor allem dazu, später alle Vorkommen des sekundären Namens durch eine Referenz auf das eigentliche Konzept zu ersetzen. Die Ersetzung kann sich auf Verknüpfungen über die \sqlid{link} und \sqlid{langlink} Tabellen beziehen (siehe dazu \rr{sec:import-nachbereitung} \bzw \rr{sec:global-import}) oder auf Über- \bzw Unterordnung über die Tabelle \sqlid{broader} (siehe dazu wieder \rr{sec:import-nachbereitung}). Die Tabelle \sqlid{alias} wird nur in lokalen Datensätzen verwendet.
\label{sec:alias-table}
\begin{description}
 \item[\sqlid{scope}:] Code für die Art von Beziehungen, auf die sich der Alias bezieht (wie in \javaid{AliasScope} definiert). Ein Alias gilt entweder für alle Beziehungen oder nur für die Subsumtionsrelation (also die Tabelle \sqlid{broader}).
 \item[\sqlid{source} und \sqlid{source_name}:] Verweise auf den Eintrag in der Tabelle \sqlid{concept}, der zu ersetzen ist.
 \item[\sqlid{target} und \sqlid{target_name}:] Verweise auf den Eintrag in der Tabelle \sqlid{concept}, durch den der alte Wert ersetzt werden soll.
 \item[\sqlid{resource}:] Verweis auf den Eintrag in der Tabelle \sqlid{resource} für die Wiki-Seite, auf der der Alias definiert ist. 
\end{description}

\subsection*{\sqlid{meaning}}
\label{sec:meaning}
Die Tabelle \sqlid{meaning} assoziiert Terme mit Konzepten --- sie repräsentiert die \nom{Bedeutungsrelation}\index{Bedeutungsrelation} und ist ist damit, neben der Tabelle \sqlid{broader}, das Herzstück des Thesaurus. Die Daten in dieser Tabelle werden direkt aus der Tabelle \sqlid{link} gewonnen (siehe \rr{sec:import-nachbereitung}).

Die Tabelle \sqlid{meaning} ist sprachspezifisch und wird daher nur für lokale Datensätze verwendet. Soll ein globales Konzept für einen Term in einer bestimmten Sprache gefunden werden, so wird zunächst über die Tabelle \sqlid{meaning} das lokale Konzept für diese Sprache gefunden, und dann das zugehörige globale Konzept über die Tabelle \sqlid{origin} im globalen Datensatz.
\label{sec:meaning-table}
\begin{description}
 \item[\sqlid{concept} und \sqlid{concept_name}:] Verweise auf den Eintrag in der Tabelle \sqlid{concept}, der das Konzept, also die Bedeutung, enthält. Dabei ist \sqlid{concept} ein Verweis auf das Feld \sqlid{id}, \sqlid{concept_name} auf das Feld \sqlid{name}. 
 \item[\sqlid{term_text}:] Der Term, der als Bezeichnung für dieses Konzept verwendet wird.
 \item[\sqlid{freq}:] Gibt an, wie oft der Term in \sqlid{term_text} für das das Konzept in \sqlid{concept} verwendet wurde.  Das kann zum Beispiel für einen Cutoff zur Steigerung der Präzision der Bedeutungszuweisung verwendet werden (siehe \rr{sec:cutoff}).
 \item[\sqlid{rule}:] Gibt den \emph{maximalen} Code aller derjenigen Extraktionsregeln (\rr{p:extraction-rules}) an, die diesen Term diesem Konzept zuordnen (es ist also Gruppen-Maximum des \sqlid{rule} Feldes aus der Tabelle \sqlid{link}). Das ist vor allem nützlich, um festzustellen, ob ein Term einem Konzept \emph{nur} durch Verwendung als Link-Text zugewiesen wurde, oder ob auch eine "`stärkere"' Regel Anwendung fand, wie zum Beispiel eine explizite Weiterleitung (\rr{p:wp-features}). Das kann zum Beispiel für einen intelligenten Cutoff zur Steigerung der Präzision der Bedeutungszuweisung verwendet werden (siehe \rr{sec:cutoff} und \rr{sec:eval-termzuordnung}).
\end{description}

\subsection*{\sqlid{origin}}
Die Tabelle \sqlid{origin} verbindet Konzepte im globalen Datensatz mit Konzepten in den einzelnen lokalen Datensätzen. Sie definiert also, welche lokalen Konzepte zu einem globalen Konzept zusammengefasst wurden und ist damit ein Kernstück des multilingualen Thesaurus: sie dient als Bindeglied zwischen den einzelnen Sprachen (siehe auch \rr{sec:global-import} und \rr{p:globale-struktur}). Die Tabelle \sqlid{origin}  gibt es nur in globalen Datensätzen.
\label{sec:origin-table}
\begin{description}
 \item[\sqlid{global_concept}:] Verweis auf den Eintrag in der Tabelle \sqlid{concept} im globalen Datensatz.
 \item[\sqlid{lang} und \sqlid{lang_bit}:] Diese Felder identifizieren den lokalen Datensatz, indem sich das lokale Konzept befindet, das dem globalen Konzept zugeordnet werden soll. \sqlid{lang} ist der Sprachcode (und damit der Name des Datensatzes), \sqlid{lang_bit} ist die der betreffenden Sprache zugeordnete Bit-Maske (siehe \rr{p:language-bits}).
 \item[\sqlid{local_concept} und \sqlid{local_concept_name}:]  Verweise auf einen Eintrag in der Tabelle \sqlid{concept} in dem lokalen Datensatz, der durch \sqlid{lang} identifiziert ist. \sqlid{local_concept} bezieht sich auf das Feld \sqlid{id}, \sqlid{local_concept_name} auf das Feld \sqlid{name}.

\end{description}

\subsection*{\sqlid{relation}}
Die Tabelle \sqlid{relation} speichert zusätzliche semantische Beziehungen zwischen Konzepten, insbesondere \nom{Verwandtheit} und \nom{Ähnlichkeit}. 
\label{sec:relation-table}
\begin{description}
 \item[\sqlid{concept1} und \sqlid{concept2}] sind Verweise auf Einträge in der Tabelle \sqlid{concept} für die beiden Konzepte, die durch die Relation verbunden werden.
 \item[\sqlid{langref} (nur global)] gibt an, ob sich zwei Konzepte \nom{ähnlich} sind, weil das eine über einen Language-Link auf das andere verweist. Diese Beziehungen werden beim Aufbau des globalen Datensatzes in der Importphase aus dem Inhalt der Tabelle \sqlid{langlink} berechnet (siehe \rr{sec:global-import}). Dabei bleibt die Beziehung zunächst asymmetrisch und wird nur als Verweis interpretiert --- diese Information wird dann benutzt, um Paare von Konzepten zu finden, die sich gegenseitig über Language-Links referenzieren. Solche Paare sind Kandidaten dafür, in einem sprachübergreifenden Konzept zusammengeführt zu werden (siehe \rr{sec:Merging}). In der Nachbereitungsphase (\rr{sec:global-nachbreitung}) wird diese Beziehung dann für die verbleibenden Paare symmetrisch ergänzt, so dass sie als "`Ähnlichkeit"' interpretiert werden kann. Diese Ähnlichkeit besteht zwischen Konzepten, die entweder nur in eine Richtung durch einen Language-Link verknüpft sind, oder die zwar beidseitig verknüpft sind, aber dennoch nicht vereinigt werden konnten, weil sie zueinander in Konflikt stehen (siehe \rr{sec:Merging}).
 %Eine Verknüpfung über die \sqlid{langref}-Eigenschaft spiegelt sich in einem Eintrag in diesem Feld in dem Feld \sqlid{similar} in der Tabelle \sqlid{concept_info} wieder.
  Da diese Relation nur zwischen Konzepten aus unterschiedlichen Sprache bestehen kann, existiert dieses Feld nur im globalen Datensatz.
 
 \item[\sqlid{langmatch}] besagt, ob sich zwei Konzepte \nom{ähnlich} sind, weil sie über einen Language-Link auf dasselbe Konzept in einer anderen Sprache verweisen.  Diese Beziehungen werden in der Nachbereitungsphase des Imports aus dem Inhalt der Tabelle \sqlid{langlink} berechnet (\rr{p:finish-relations}).
 % Eine Verknüpfung über die \sqlid{langmatch}-Eigenschaft spiegelt sich in einem Eintrag in diesem Feld in dem Feld \sqlid{similar} in der Tabelle \sqlid{concept_info} wieder. 
 
 \item[\sqlid{bilink}] gibt an, ob zwei Konzepte \nom{verwandt} sind, weil sie \emph{gegenseitig} über einen Wiki-Link aufeinander verweisen. Diese Information wird in der Nachbereitungsphase des Imports  aus der Tabelle \sqlid{link} berechnet (\rr{p:finish-relations}). 
 %Ein Eintrag in diesem Feld spiegelt sich ein einem Eintrag in dem Feld \sqlid{related} in der Tabelle \sqlid{concept_info} wieder.
\end{description}
% 
% \subsection*{\sqlid{langprep}}
% Die Tabelle \sqlid{langprep} speichert temporär potentiell zu vereinigende Paare von Konzepten im globalen Datensatz. Sie wird verwendet, um Konzepte zu finden, die sich gegenseitig über einen Eintrag in der Tabelle \sqlid{langlink} referenzieren (sieh \rr{sec:Merging}).
% \label{sec:langprep-table}
% \begin{description}
%  \item[\sqlid{concept} und \sqlid{target}:] Referenz auf die potentiell zu vereinigenden Konzepte.
%  \item[\sqlid{concept_bits} und \sqlid{target_bits}:] Die Bit-Masken, die die in den beiden Konzepten zusammengefassten Sprachen repräsentieren. Wenn die beiden Konzepte eine Sprache gemeinsam haben (wenn also eine logische Und-Verknüpfung der beiden Bit-Masken einen von Null verschiedenen Wert liefert), so können die Konzepte nicht vereinigt werden.
% \end{description}

\subsection*{\sqlid{merge}}
Die Tabelle \sqlid{merge} ist ein Hilfsmittel für das Zusammenführen von Konzepten im globalen Datensatz. Sie speichert vorübergehend eine Abbildung von IDs von veralteten Konzepten und ihrem jeweiligen Ersatz. Das funktioniert ähnlich wie bei der Tabelle \sqlid{alias}: beim Zusammenführen wird ein neues, vereinigtes Konzept aus zwei alten erzeugt, und dann werden für die beiden alten Konzepte Einträge in der Tabelle \sqlid{merge} angelegt, welche die IDs der alten Konzepte auf die ID des neu erzeugten Konzeptes abbilden. Jede Referenz auf die alten Konzepte wird dann in einem weiteren Schritt durch eine Referenz auf das neue, vereinigte Konzept ersetzt (\rr{sec:Merging}).
\label{sec:merge-table}
\begin{description}
 \item[\sqlid{old}:] Verweis auf den Eintrag in der Tabelle \sqlid{concept}, der zu ersetzen ist.
 \item[\sqlid{new}:] Verweis auf den Eintrag in der Tabelle \sqlid{concept}, durch den die alten Werte ersetzt werden sollen.
\end{description}

\subsection*{\sqlid{concept_description}}
\label{sec:concept-description-table}
Die Tabelle \sqlid{concept_description} ist ein \lingo{Property Cache} für die sprachspezifischen Eigenschaften von Konzepten in einem lokalen Datensatz (siehe \rr{sec:BuildConceptInfo}).
\begin{description}
 \item[\sqlid{concept}:]  Verweis auf den Eintrag in der Tabelle \sqlid{concept}, für den die Eigenschaften gelten.
 \item[\sqlid{terms}:]	Serialisierte Liste von Termen (mit Frequenzangaben), die für dieses Konzept verwendet werden; abgeleitet aus der  Tabelle \sqlid{meaning}.
\end{description}

\subsection*{\sqlid{concept_info}}
\label{sec:concept-info-table}
Die \sqlid{concept_info} Tabelle ist ein \lingo{Property Cache} für Beziehungen zwischen Konzepten (siehe \rr{sec:BuildConceptInfo}).
\begin{description}
 \item[\sqlid{concept}:] Verweise auf den Eintrag in der Tabelle \sqlid{concept}, für den die Beziehungen gelten.
 \item[\sqlid{inlinks}:] Serialisierte Liste von Konzepten (ID und IDF-Wert, in lokalen Datensätzen auch der Name), die auf dieses Konzept verweisen; abgeleitet aus der Tabelle \sqlid{link}.
 \item[\sqlid{outlinks}:] Serialisierte Liste von Konzepten (ID und IDF-Wert, in lokalen Datensätzen auch der Name), auf die dieses Konzept verweist; abgeleitet aus der Tabelle \sqlid{link}.
 \item[\sqlid{broader}:] Serialisierte Liste von Konzepten (ID und inverser LHS-Wert, in lokalen Datensätzen auch der Name), die diesem Konzept übergeordnet sind; abgeleitet aus der Tabelle \sqlid{broader}.
 \item[\sqlid{narrower}:] Serialisierte Liste von Konzepten (ID und inverser LHS-Wert, in lokalen Datensätzen auch der Name), die diesem Konzept untergeordnet sind; abgeleitet aus der Tabelle \sqlid{broader}.
 \item[\sqlid{similar}:] Serialisierte Liste von Konzepten (nur ID), die diesem Konzept ähnlich sind; abgeleitet aus der Tabelle \sqlid{relation} unter Betrachtung des \sqlid{langmatch} und des \sqlid{langref} Feldes.
 \item[\sqlid{related}:] Serialisierte Liste von Konzepten (nur ID), die mit diesem Konzept verwandt sind; abgeleitet aus der Tabelle \sqlid{relation} unter Betrachtung des \sqlid{bilink} Feldes.
 \item[\sqlid{langlinks}]: Serialisierte Liste von Konzepten (\sqlid{language} und \sqlid{target} Feld), auf die dieses Konzept per Language-Link verweist; abgeleitet aus der Tabelle \sqlid{langlink}.
\end{description}

\subsection*{\sqlid{terms}}
Die Tabelle \sqlid{terms} speichert die \nom{Termfrequenzverteilung}, das heißt, sie weist allen Termen im Korpus aufgrund ihrer Verwendungsfrequenz\index{Termfrequenz} einen Rang zu (\rr{sec:BuildStatistics}). Dies ist nützlich als Übersicht über das verwendete Vokabular (\rr{ch:statistik}).
\label{sec:terms-table}
\begin{description}
 \item[\sqlid{term}:] Text des Terms.
 \item[\sqlid{freq}:] Verwendungsfrequenz, abgeleitet aus der Tabelle \sqlid{meaning}.
 \item[\sqlid{rank}:] Rang, gemäß der Frequenz. Kann auch als ID des Terms verwendet werden.
 \item[\sqlid{random}:] Zufallswert zur effizienten Auswahl eines zufälligen Terms.
\end{description}

\subsection*{\sqlid{degree}}
\label{sec:degree-table}

Die Tabelle \sqlid{degree} speichert die \nom{Knotengradverteilungen}\index{Knotengrad}, das heißt, sie weist jedem Konzept im Korpus den Rang zu, der sich aus dem \nom{Grad} des Konzeptes als Knoten in dem von der Tabelle \sqlid{link} aufgespannten Graphen ergibt (siehe auch \rr{sec:BuildStatistics}). Dies ist nützlich für eine Untersuchung der Netzwerkstruktur (\rr{ch:statistik}) (vergleiche \qq{Barabasi1999esrn}{steyvers2005lss}).
\begin{description}
 \item[\sqlid{concept} und \sqlid{concept_name}:] Verweise auf den Eintrag in der Tabelle \sqlid{concept}, der das betreffende Konzept enthält. Dabei ist \sqlid{concept} ist ein Verweis auf das Feld \sqlid{id}, \sqlid{concept_name} auf das Feld \sqlid{name}. 
 \item[\sqlid{in_degree} und \sqlid{in_rank}:] Grad und entsprechender Rang bezüglich eingehender Referenzen aus der Tabelle \sqlid{link}.
 \item[\sqlid{out_degree} und \sqlid{out_rank}:] Grad und entsprechender Rang bezüglich ausgehender Referenzen aus der Tabelle \sqlid{link}.
 \item[\sqlid{link_degree} und \sqlid{link_rank}:] Grad und entsprechender Rang bezüglich eingehender und ausgehender Referenzen zusammengenommen aus der Tabelle \sqlid{link} (also Betrachtung als ungerichteter Graph).
 \item[\sqlid{idf} und \sqlid{idf_rank}:] \lingo{Inverse Document Frequency}\index{IdF}\index{Dokumentfrequenz} (wobei die Dokumentfrequenz die Zahl eingehender Links ist) und der entsprechende Rang, vergleiche \q{Salton:86}.
 \item[\sqlid{lhs} und \sqlid{lhs_rank}:] \lingo{Local Hierarchy Score} (\nom{Zentralität}\index{Zentralität}) und der entsprechende Rang, nach \q{muchnik2007sekt} (ohne symmetrische Ergänzung).
\end{description}

\subsection*{\sqlid{stats}}
\label{sec:stats-table}
Die Tabelle \sqlid{stats} speichert eine Übersicht über verschiedene statistische Werte, die für den Datensatz erhoben wurden.
\begin{description}
 \item[\sqlid{block}:] Name des Wert-Blocks (des \lingo{Records})
 \item[\sqlid{name}:]  Name des Wertes (eindeutig innerhalb eines Blocks)
 \item[\sqlid{value}:] Wert
\end{description}

\section{Zugriffsschicht für die Datenabfrage}
\label{sec:DAO}

  \later{DAO: UML}

Der Zugriff auf die Datenbankstruktur (\rr{sec:datenbank-tabellen}) ist in einer \lingo{Data Access Object}-Schicht\index{Data Access Object} (DAO\index{DAO}, auch bekannt als \lingo{Data Accessor}, siehe \qs{nock2004dap}{9ff} sowie \q{JAVA:DAO}) gekapselt. Im Gegensatz zu einem \lingo{Object/Relational Mapping}\index{Object/Relational Mapping} (ORM\index{ORM}, siehe \qs{nock2004dap}{53ff}), wie es \zB von \q{zesch2007aaw} verwendet wird, bietet dieser Ansatz zwar geringere Abstraktion von dem verwendeten Datenbanksystem, dafür aber mehr Kontrolle über die Verwendung der Datenbank. Auch erlaubt es die Nutzung von systemspezifischen Funktionen. Das ist insbesondere deshalb wichtig, weil wesentliche Teile der Verarbeitung aus Effizienzgründen direkt in der Datenbank ausgeführt werden: das Datenbanksystem wird von WikiWord nicht nur zur reinen Speicherung von Datensätzen verwendet, es spielt vielmehr eine wichtige Rolle bei der eigentlichen Verarbeitung und Aufbereitung der Daten, siehe insbesondere \rr{sec:import-nachbereitung} und \rr{transform:zusammenfuehren}. 

Die DAO-Schicht ist in verschiedene \lingo{Stores} für unterschiedliche Arten von Daten gegliedert, die im Package \javaid{de.brightbyte.wikiword.store} definiert und implementiert sind.

\later{chunked queries}

\subsection*{\javaid{WikiWordConceptStore}}
Das Interface \javaid{WikiWordConceptStore}, implementiert durch \javaid{DatabaseWikiWordConceptStore}, ist die abstrakte Basis für alle DAO-Klassen, die als Speicher für Konzepte dienen. Ein Objekt dieses Typs repräsentiert also einen konkreten Datensatz.

\javaid{WikiWordConceptStore} definiert im Wesentlichen die folgenden Methoden:
\begin{description}
 \item[\javaid{getNumberOfConcepts}] gibt an, wie viele Konzepte in diesem Store gespeichert sind.
 \item[\javaid{listAllConcepts}] gibt Referenz-Objekte für alle Konzepte zurück.
 \item[\javaid{getConcept}] gibt ein einzelnes Konzeptobjekt zurück (von dem Typ, der für die konkrete Implementation passend ist).
 \item[\javaid{pickRandomConcept} und \javaid{getRandomConcept}] gibt eine Referenz auf ein zufälliges Konzept zurück, \bzw direkt ein zufälliges Konzept-Objekt. Der Bereich, aus dem ausgewählt wird, kann über den Rang der Konzepte beschränkt werden.
\end{description}

\subsection*{\javaid{LocalConceptStore}}
Das Interface \javaid{LocalConceptStore}, implementiert durch \javaid{DatabaseLocalConceptStore}, ist ein \nom{Store} für einen lokalen Datensatz, also einen Store, der konzeptionell Objekte vom Typ \javaid{LocalConcept} enthält. Es definiert im Wesentlichen folgende Methoden:
\begin{description}
 \item[\javaid{listMeanings} und \javaid{getMeanings}] liefert alle Konzepte (Bedeutungen) für einen gegebenen Term (als Referenz \bzw Konzeptobjekt).
 \item[\javaid{getNumberOfTerms}] liefert die Anzahl der unterschiedlichen Terme, die in dem Store mit Konzepten assoziiert sind.
 \item[\javaid{getAllTerms}] liefert alle Terme, die in dem Store verwendet werden.
 \item[\javaid{pickRandomTerm}] liefert einen zufälligen Term. Der Bereich, aus dem ausgewählt wird, kann über den Rang der Terme beschränkt werden.
\end{description}

\subsection*{\javaid{GlobalConceptStore}}
Das Interface \javaid{GlobalConceptStore}, implementiert durch \javaid{DatabaseGlobalConceptStore}, ist ein \nom{Store} für einen globalen Datensatz, also ein Store, der konzeptionell Objekte vom Typ \javaid{GlobalConcept} enthält. Es definiert im Wesentlichen folgende Methoden:
\begin{description}
 \item[\javaid{listMeanings} und \javaid{getMeanings}] liefert alle Konzepte (Bedeutungen) für einen gegebenen Term aus einer gegebenen Sprache (als Referenz \bzw Konzeptobjekt).
 \item[\javaid{getLocalConcepts}] liefert für ein gegebenes globales Konzept alle lokalen Konzepte, die in ihm zusammengefasst sind.
 \item[\javaid{getLanguages}] liefert die Sprachen aller lokalen Datensätze, die von dem globalen Store zusammengefasst werden.
\end{description}

\section{Zugriffsschicht für die Datenspeicherung und Verarbeitung}
\label{sec:DAO-Builder}

Das Speichern und Ändern von Daten in der Datenbank erfolgt über \lingo{Builder}-Objekte. Ein \lingo{Builder} ist ein \nom{Datenzugriffsobjekt} (DAO), das darauf ausgelegt ist, einen Datensatz aufzubauen oder zu manipulieren: er bietet also eine andere Perspektive auf den Datensatz als ein \lingo{Store}. Insbesondere bieten die \lingo{Builder}-Klassen eine Schnittstelle zum Einfügen von Daten in einen Datensatz, die nicht nur die Kommunikation mit der Datenbank per SQL kapselt, sondern auch den Zugriff in transparenter Weise weiter optimiert. Zwei wichtige Techniken sind dabei:

\begin{itemize}
  \item Neue Datensätze werden nicht sofort in die Datenbank geschrieben, sondern zunächst in einem Puffer zwischengespeichert. Ist der Puffer voll, so wird er \emph{im Hintergrund} in die Datenbank geschrieben, während bereits ein neuer Puffer befüllt werden kann. Dieser Mechanismus wurde bereits in \rr{p:db-flush} beschrieben. Das erlaubt einen sehr hohen Datendurchsatz beim anfänglichen Import der Daten (\rr{sec:import-aus-wikitext}).
  \item Manipulationen großer Datenmengen, wie sie in den späteren Phasen der Verarbeitung vorkommen (\rr{transform:import-finish}, \rr{transform:zusammenfuehren}, \rr{sec:BuildStatistics}, etc.), werden automatisch in kleinere Schritte unterteilt (\lingo{Chunking}) --- das kann einerseits die Verarbeitung insgesamt beschleunigen, weil unter Umständen ein Überlaufen der internen Puffer des Datenbanksystems vermieden wird. Aber vor allem erlaubt es auch das Fortsetzen unterbrochener Import-Vorgänge (\rr{sec:agenda}), ohne dass aufwändig berechnete Daten erneut berechnet werden müssen. Die Größe der "`\lingo{Chunks}"' kann über den Tweak-Wert \cli{dbstore.updateChunkSize} gesteuert werden, per Default werden jeweils zehntausend Einträge auf einmal verarbeitet.
\end{itemize}

Die folgenden Klassen bilden die Schnittstelle für den Aufbau der Datensätze:

\subsection*{\javaid{LocalConceptStoreBuilder}}
\label{sec:LocalConceptStoreBuilder}

Die Klasse \javaid{LocalConceptStoreBuilder} wird vor allem von \javaid{ConceptImporter} bei der Transformation von Daten aus dem Ressourcenmodell in das WikiWord-Datenmodell (das \nom{Konzeptmodell}) verwendet (\rr{sec:import-aus-wikitext}). Sie enthält im Wesentlichen die folgenden Methoden:

\begin{description}
 \item[\javaid{storeResource}] legt einen Ressource-Eintrag an, mit Name, Ressource-Typ und Zeitstempel, und gibt die ID des neuen Ressource-Eintrags zurück (siehe auch \rr{sec:resource-table}, \rr{sec:ImportConcepts}).
 \item[\javaid{storeConcept}] legt einen Konzept-Eintrag an, mit Name und Konzept-Typ, und gibt die ID des neuen Konzept-Eintrags zurück (siehe auch \rr{sec:concept-table}, \rr{sec:ImportConcepts}).
 \item[\javaid{storeDefinition}] speichert einen Definitionstext (Glosse\index{Glosse}) zu einem gegebenen Konzept (siehe auch \rr{sec:definition-table}).
 \item[\javaid{storeLink}] speichert einen Verweis zwischen zwei Konzepten unter Angabe des Link-Textes, fügt also einen Eintrag in die Bedeutungsrelation\index{Bedeutungsrelation} ein und definiert eine Referenz zwischen Konzepten (siehe auch \rr{sec:link-table}).
 \item[\javaid{storeReference}] speichert die Verwendung eines Terms für ein Konzept, fügt also einen Eintrag in die Bedeutungsrelation\index{Bedeutungsrelation} ein (siehe auch \rr{sec:link-table}).
 \item[\javaid{storeSection}] speichert die Verwendung eines Artikelabschnitts als Link-Ziel (siehe \rr{sec:anker},  \rr{sec:section-table}).
 \item[\javaid{storeConceptBroader}] speichert eine Subsumtion\index{Subsumtion}, also eine Über- \bzw Unterordnung eines Konzeptes (siehe auch \rr{sec:broader-table}).
 \item[\javaid{storeConceptAlias}] definiert ein Konzept als Alias für ein anderes. Alias-Konzepte sind eine temporäre Hilfskonstruktion, sie kommen im fertigen Thesaurus nicht vor (siehe \rr{p:finish-aliases} und \rr{sec:alias-table}).
 \item[\javaid{storeLanguageLink}] \index{Language-Link} speichert eine Verknüpfung eines Konzeptes mit einem semantisch ähnlichen\index{semantische Ähnlichkeit} (oder äquivalenten) Konzept in einem anderen Wikipedia-Projekt (also einer anderen Sprache)  (siehe auch \rr{sec:langlink-table}).
\end{description}

Die Klasse \javaid{LocalConceptStoreBuilder} enthält zusätzlich eine Anzahl von Methoden zur Nachbereitung der Daten (Methoden der Form \javaid{finishXXX}). Diese werden im Abschnitt \rr{transform:import-finish} im einzelnen beschrieben.

\subsection*{\javaid{GlobalConceptStoreBuilder}}

Die Klasse \javaid{GlobalConceptStoreBuilder} definiert Methoden zum Zusammenführen von lokalen Datensätzen zu einem globalen Datensatz. Diese Methoden operieren auf den Datensätzen als Ganzes und werden von dem Programm \javaid{BuildThesaurus} direkt verwendet \rr{sec:global-import}:

\begin{description}
 \item[\javaid{importConcepts}] importiert alle Konzepte aus den lokalen Datensätzen in den globalen Datensatz. Dabei werden die Tabelle \sqlid{concept} (\rr{sec:concept-table}) und die Tabelle \sqlid{origin} (\rr{sec:origin-table}) aufgebaut und die Tabelle \sqlid{relation} (\rr{sec:relation-table}) teilweise initialisiert. 
 \item[\javaid{buildGlobalConcepts}] baut aus den importierten Konzepten einen multilingualen Thesaurus auf, indem Konzepte aus verschiedenen lokalen Datensätzen aufgrund ihrer semantischen Ähnlichkeit zusammengefasst werden (Siehe \rr{sec:Merging}). 
\end{description}

Die Funktion dieser Methoden wird im Abschnitt \rr{sec:global-import} im einzelnen erläutert.

\chapter{Datenstrukturen}
\label{ch:datenstrukturen}

Dieses Kapitel beschreibt wichtige Datenstrukturen, die von WikiWord zur Repräsentation verschiedener Entitäten verwendet werden.

\section{\javaid{WikiPage}}
\label{sec:analyzer:WikiPage}\label{model:ressourcenmodell}

Die Klasse \javaid{WikiTextAnalyzer.WikiPage} repräsentiert eine Seite im Wiki und implementiert damit das Ressourcenmodell\index{Ressourcenmodell}\index{Ressource} von WikiWord, das bereits in \rr{entwurf:ressourcenmodell} kurz beschrieben wurde. Ihre Eigenschaften spiegeln die Eigenschaften der Seite \bzw des Konzeptes, das die Seite beschreibt, so wie sie von \javaid{WikiTextAnalyzer} extrahiert wurden. Dabei werden die einzelnen Eigenschaften verzögert initialisiert, also erst dann berechnet, wenn sie zum ersten Mal verwendet werden. Im Einzelnen hat \javaid{WikiTextAnalyzer.WikiPage} folgende Eigenschaften:

\begin{description}
\item [\javaid{categories}:] die Menge aller Wiki-Links mit Kategorisierungssemantik, also der Links mit dem \javaid{magic}-Wert \javaid{LinkMagic.CATEGORY} (siehe \rr{sec:analyzer:links}).
\item [\javaid{cleanedText}:] der Text der Seite nach Anwendung von \javaid{WikiTextAnalyzer.stripClutter} (siehe \rr{sec:analyzer:bereinigen}).
\item [\javaid{conceptType}:] der Typ des Konzeptes, das die Seite beschreibt (siehe \rr{sec:konzeptklassifikation})
\item [\javaid{disambigLinks}:] die Links auf die unterschiedlichen Bedeutungen des zu klärenden Terms, falls die Seite eine Begriffsklärungsseite ist (siehe \rr{sec:analyzer:disambig}).
\item [\javaid{flatText}:] der Text der Seite nach Anwendung von \javaid{WikiTextAnalyzer.stripBoxes} auf den \javaid{cleanedText}  (siehe \rr{sec:analyzer:bereinigen}).
\item [\javaid{links}:] alle auf der Seite definierten Wiki-Links (siehe \rr{sec:analyzer:links}).
\item [\javaid{name}:] der normalisierte Titel der Seite.
\item [\javaid{namespace}:] die numerische ID des Namensraums der Seite. Die ID ist über ein Objekt vom Typ \javaid{Namespace} mit den Namen des Namensraumes assoziiert. Sie ist über \javaid{WikiTextAlanyzer.getNamespaceId} verfügbar. 
\later{namespaces aus dump, und aus prop-file}
\item [\javaid{pageTerms}:] die Menge von Termen, die als Bezeichnung für das Konzept des Artikels direkt aus der Seite, insbesondere aus dem Titel, abgeleitet werden können (siehe \rr{sec:analyzer:terme}).
\item [\javaid{plainText}:] der Text der Seite nach Anwendung von \javaid{WikiTextAnalyzer.stripMarkup} auf den \javaid{flatText}  (siehe \rr{sec:analyzer:bereinigen}).
\item [\javaid{redirect}:] das Ziel der Weiterleitung, falls die Seite eine Weiterleitung ist. Um den Weiterleitungslink zu finden, wird das Muster verwendet, das in \javaid{WikiConfiguration.redirectPattern} definiert ist.
\item [\javaid{resourceType}:] der Typ der Seite (siehe \rr{sec:ressourcenklassifikation})
\item [\javaid{sections}:] eine Liste aller Abschnittsüberschriften, wie sie von \javaid{WikiTextAnalyzer.extractSections} bestimmt wurde.
\item [\javaid{templates}:] alle auf der Seite verwendeten Vorlagen und ihre Parameter (siehe \rr{sec:analyse:vorlagen}). 
\item [\javaid{text}:] der vollständige, unveränderte Wiki-Text der Seite, wie in der Wikipedia verwendet.
\item [\javaid{titleBaseName}:] der Basisname der Seite, also der Titel ohne Klammerzusatz (siehe \rr{sec:analyzer:terme}).
\item [\javaid{titleSuffix}:] der Klammerzusatz des Seitennamens, falls vorhanden (siehe \rr{sec:analyzer:terme}), ohne die Klammern selbst.
\end{description}

\section{Transferobjekte}
\label{sec:transferobjekte}
Die DAO-Objekte benutzen \nom{Transferobjekte}\index{Transferobjekt}, um die eigentlichen Daten darzustellen. Sie modellieren die Kernkonzepte von WikiWord, insbesondere Terme und Konzepte, und sind im Package \javaid{de.brightbyte.wikiword.model} definiert.

Die Transferobjekte sind als nicht-modifizierbare Dateneinheiten ausgelegt. Die wichtigsten Klassen seien im Folgenden kurz beschrieben:

\begin{description}
 \item[\javaid{WikiWordReference}:] Basisklasse für Referenz-Objekte; Referenz-Objekte enthalten die ID und den Namen des referenzierten Objektes, sowie optional Annotationen zu Frequenz und/oder Relevanz des Objektes. Referenz-Objekte werden vor allem bei der Auflistung von Suchergebnissen verwendet.
 \item[\javaid{TermReference}:] Referenz-Objekte für Terme. Der Term selbst ist als der Name des Referenz-Objektes gespeichert, die ID ist ungenutzt.
 \item[\javaid{GlobalConceptReference} und \javaid{LocalConceptReference}:] Referenz-Objekte für lokale \bzw globale Konzepte (also Konzepte aus dem globalen \bzw aus einem lokalen Datensatz).
 \item[\javaid{WikiWordConcept}:] Basisklasse für Konzeptobjekte. Konzeptobjekte enthalten Listen von Referenzen auf andere Konzeptobjekte, bieten also Zugriff auf die Relationen, die zwischen den Konzepten definiert sind. Das entspricht den Informationen, die in \rr{sec:BuildConceptInfo} im \lingo{Property Cache} gespeichert werden. 
 
 \label{p:konzepteigenschaften} Konzepte haben in diesem Modell insbesondere die folgenden Eigenschaften:
  
  \begin{description}
    \item[\javaid{id}:] Eine interne ID (aus der Tabelle \sqlid{concept} \rr{sec:concept-table}).
    \item[\javaid{name}:] Der Name des Konzeptes, abgeleitet aus dem Namen der Wikipedia-Seite(n), die das Konzept definieren (aus der Tabelle \sqlid{concept}).
    \item[\javaid{terms}:] Die Terme (\rr{sec:analyzer:terme}), die dem Konzept über die Bedeutungsrelation zugeordnet sind (aus der Tabelle \sqlid{meaning}).
    \item[\javaid{type}:] Der Konzepttyp (\rr{sec:konzeptklassifikation}), der dem Konzept zugeordnet ist (aus der Tabelle \sqlid{concept}).
    \item[\javaid{definition}:] Die Definition (\rr{sec:analyzer:glossen}), die dem Konzept zugeordnet ist (aus der Tabelle \sqlid{definition} \rr{sec:definition-table}).
    \item[\javaid{broader}:] Übergeordnete Konzepte (\rr{sec:import-aus-wikitext}), die dem Konzept über die Subsumtionsbeziehung zugeordnet sind (aus der Tabelle \sqlid{broader} \rr{sec:broader-table}).
    \item[\javaid{narrower}:] Untergeordnete Konzepte (\rr{sec:import-aus-wikitext}), die dem Konzept über die Subsumtionsbeziehung zugeordnet sind (aus der Tabelle \sqlid{broader}).
    \item[\javaid{related}:] Verwandte Konzepte (\rr{p:finish-relations}), die dem Konzept zugeordnet sind (aus der Tabelle \sqlid{relation} \rr{sec:relation-table}).
    \item[\javaid{similar}:] Ähnliche Konzepte (\rr{p:finish-relations}), die dem Konzept zugeordnet sind (aus der Tabelle \sqlid{relation}).
    \item[\javaid{inLinks}:] Konzepte, die auf dieses Konzept verweisen (aus der Tabelle \sqlid{link} \rr{sec:link-table}).
    \item[\javaid{outLinks}:] Konzepte, auf die dieses Konzept verweist (aus der Tabelle \sqlid{link}).
  \end{description}
 
 \item[\javaid{LocalConcept}:] Konkrete Klassen für Konzeptobjekte, die lokale Konzepte repräsentieren (also Konzepte aus einem lokalen Datensatz). Zusätzlich zu den durch \javaid{WikiWordConcept} definierten Eigenschaften bietet sie direkten Zugriff auf die Definition des Konzeptes (die Glosse\index{Glosse}) sowie auf die Terme, die für das Konzept verwendet wurden (annotiert mit der Frequenz der Verwendung).
 \item[\javaid{GlobalConcept}:] Konkrete Klassen für Konzeptobjekte, die globale Konzepte repräsentieren (also Konzepte aus dem globalen Datensatz). Zusätzlich zu den durch \javaid{WikiWordConcept} definierten Eigenschaften bietet sie auch Zugriff auf die \javaid{LocalConcept}-Objekte derjenigen lokalen Konzepte, die in dem globalen Konzept zusammengefasst sind.
\end{description}

