IBM Cloud Docs
AQL-Referenz (Annotation Query Language)

AQL-Referenz (Annotation Query Language)

Annotation Query Language (AQL) ist die primäre Sprache für die Erstellung von Extraktoren für erweiterte Regeln in IBM Watson® Knowledge Studio.

  • Datenmodell: Das Datenmodell für AQL ähnelt dem relationalen Standardmodell, das von einer SQL-Datenbank wie DB2® verwendet wird. Alle Daten in AQL werden in Tupeln, Datensätzen einer oder mehrerer Spalten oder Feldern gespeichert. Eine Gruppe von Tupeln bildet eine Ansicht. Alle Tupel in einer Ansicht müssen dasselbe Schema, d. h. gleiche Namen und Typen der Felder in allen Tupeln, aufweisen.
  • Ausführungsmodell: Die Laufzeitkomponente verwendet ein Ausführungsmodell, mit dem Dokumente einzeln verarbeitet werden. Die Laufzeitkomponente erhält eine Sammlung von Dokumenten und führt den Extraktor für jedes Dokument aus, um Informationen aus diesem Dokument zu extrahieren.
  • AQL-Anweisungen: Mithilfe von AQL-Anweisungen können Sie Module, Ansichten, Tabellen, Wörterverzeichnisse und Funktionen erstellen und anschließend verwenden.
  • Integrierte Funktionen: AQL verfügt über eine Reihe integrierter Funktionen zur Verwendung in Extraktionsregeln.
  • Anweisung 'create function': Wenn Sie Operationen für extrahierte Werte ausführen möchten, die nicht durch AQL unterstützt werden, können Sie angepasste Funktionen definieren, die in Extraktionsregeln verwendet werden. Diese Funktionen werden als benutzerdefinierte Funktionen (User-defined Functions, UDF) bezeichnet.

AOL-Syntax (AOL, Annotation Query Language)

Wie viele Programmiersprache basiert AQL auf einheitlicher Syntax und Grammatik.

Die lexikalische Struktur einer Programmiersprache besteht aus den elementaren Regeln, die die Tokens oder Basiskomponenten dieser Sprache definieren, wie z. B. die reservierten Wörter, Kennungen, Konstanten usw.

Die Syntax von AQL ähnelt der Syntax von SQL, es gibt jedoch einige wichtige Unterschiede:

  • Bei AQL muss die Groß-/Kleinschreibung beachtet werden.

  • AQL unterstützt derzeit keine erweiterten SQL-Features, wie z. B. korrelierte Unterabfragen und rekursive Abfragen.

  • AQL verfügt über den neuen Anweisungstyp extract, der in SQL nicht vorhanden ist.

  • AQL lässt keine Schlüsselwörter (reservierte Wörter) als Ansichts-, Spalten- oder Funktionsnamen zu.

  • AQL lässt die Angabe von regulären Ausdrücken in Perl-Syntax zu; dies ist jedoch nicht erforderlich. Wie bei der Perl-Syntax beginnen reguläre Ausdrücke mit einem Schrägstrich (/) und enden mit einem Schrägstrich (/). AQL ermöglicht auch reguläre Ausdrücke, die mit einem einfachen Anführungszeichen (') beginnen und mit einem einfachen Anführungszeichen (') enden. Sie können beispielsweise /regex/ anstelle von 'regex' als regulären Ausdruck in AQL verwenden.

  • Kennungen: Kennungen werden zur Definition der Namen von AQL-Objekten verwendet. Hierzu gehören die Namen von Modulen, Ansichten, Tabellen, Wörterverzeichnissen, Funktionen, Attributen und Funktionsparametern.

  • Reservierte Wörter: Reservierte Wörter sind Wörter, die im Kontext der AQL-Struktur eine festgelegte Bedeutung haben und nicht neu definiert werden können. Schlüsselwörter sind reservierter Wörter, die in der Sprachsyntax bestimmte Bedeutungen haben.

  • Konstanten: Konstanten sind festgelegte Werte, die einen der folgenden Datentypen aufweisen können: Zeichenfolge (String), ganze Zahl (Integer), Gleitkommawert (Float) oder boolescher Wert (Boolean).

  • Kommentare: Mit Kommentaren können Sie den AQL-Code durch grundlegende Beschreibungen ergänzen, um den Code für andere Benutzer zu erläutern und selbstbeschreibende, kompilierte Module zu generieren.

  • Ausdrücke: Ein AQL-Ausdruck ist eine Kombination aus einem oder mehreren skalaren Werten und Funktionen, der in einen einzelnen skalaren Wert ausgewertet wird.

Kennungen

Kennungen werden zur Definition der Namen von AQL-Objekten verwendet. Hierzu gehören die Namen von Modulen, Ansichten, Tabellen, Wörterverzeichnissen, Funktionen, Attributen und Funktionsparametern.

Es sind zwei Typen von AQL-Kennungen (bei denen die Groß-/Kleinschreibung beachtet werden muss) verfügbar:

  • Einfache Kennungen

    Eine einfache ID muss mit einem Kleinbuchstaben (a-z), einem Großbuchstaben (A-Z) oder einem Unterstreichungszeichen (_) beginnen. Nachfolgende Zeichen können Klein-oder Großbuchstaben, das Unterstreichungszeichen oder Ziffern (0-9) sein. Eine einfache Kennung muss sich von einem beliebigen AQL-Schlüsselwort unterscheiden.

  • Kennungen in doppelten Anführungszeichen

    Eine ID in Anführungszeichen beginnt und endet mit einem Anführungszeichen ("). Sie können ein beliebiges Zeichen zwischen dem ersten und dem letzten Anführungszeichen verwenden. Kennungen in doppelten Anführungszeichen dürfen keinen Punkt (.) enthalten. Wenn ein Name ein doppeltes Anführungszeichen enthält, muss diesem ein Backslash-Zeichen (\) als Escapezeichen vorangestellt werden, z. B. \”.

Reservierte Wörter

Reservierte Wörter sind Wörter, die im Kontext der AQL-Struktur eine festgelegte Bedeutung haben und nicht neu definiert werden können. Schlüsselwörter sind reservierter Wörter, die in der Sprachsyntax bestimmte Bedeutungen haben.

Die folgenden für AQL reservierten Schlüsselwörter können nicht als Kennungen verwendet werden, da sie jeweils für einen bestimmten Zweck in der Sprache definiert sind:

  • all
  • allow
  • allow_empty
  • always
  • and
  • annotate
  • as
  • ascending
  • ascii
  • attribute
  • between
  • blocks
  • both
  • by
  • called
  • case
  • cast
  • ccsid
  • character
  • characters
  • columns
  • consolidate
  • content\_type
  • count
  • create
  • default
  • descending
  • detag
  • detect
  • deterministic
  • dictionary
  • dictionaries
  • document
  • element
  • else
  • empty\_fileset
  • entries
  • exact
  • export
  • external
  • external_name
  • extract
  • fetch
  • file
  • first
  • flags
  • folding
  • from
  • function
  • group
  • having
  • import
  • in
  • include
  • infinity
  • inline_match
  • input
  • into
  • insensitive
  • java
  • language
  • left
  • lemma_match
  • like
  • limit
  • mapping
  • matching_regex
  • minus
  • module
  • name
  • never
  • not
  • null
  • on
  • only
  • order
  • output
  • part_of_speech
  • parts_of_speech
  • parameter
  • pattern
  • point
  • points
  • priority
  • regex
  • regexes
  • retain
  • required
  • return
  • right
  • rows
  • select
  • separation
  • set
  • specific
  • split
  • table
  • tagger
  • then
  • token
  • Token
  • tokens
  • unicode
  • union
  • up
  • using
  • values
  • view
  • views
  • when
  • where
  • with

Die folgenden reservierten Wörter sind Namen integrierter Skalartypen:

  • Text
  • Span
  • Integer
  • Float
  • String
  • Boolean
  • ScalarList

Weitere reservierte Namen, die nicht als Kennungen verwendet werden können, sind nachfolgend aufgeführt:

  • Dictionary
  • Regex
  • Consolidate
  • Block
  • BlockTok
  • Sentence
  • Tokenize
  • RegexTok
  • PosTag

Konstanten

Konstanten sind festgelegte Werte, die einen der folgenden Datentypen aufweisen können: String, Integer, Float oder Boolean.

Konstanten werden in der Auswahlliste einer select- oder extract-Klausel oder als Argumente in integrierten Funktionen oder UDFs und Vergleichselementen verwendet. AQL unterstützt die folgenden Konstantentypen:

  • Zeichenfolgekonstante

    Eine Zeichenfolge, die in einfache Anführungszeichen (‘) gesetzt wird, z. B. ‘eine Zeichenfolge’.

  • Ganzzahlige Konstante

    Ein 32-Bit-Ganzzahlwert mit Vorzeichen, der nicht in Anführungszeichen gesetzt wird, z. B. 10 oder -1.

  • Gleitkommakonstante

    Ein 32-Bit-Gleitkommawert mit einfacher Genauigkeit, der nicht in Anführungszeichen gesetzt wird, z. B. 3,14 oder -1,2.

  • Boolesche Konstante

    Der Wert 'true' oder 'false' ohne Anführungszeichen.

  • Nullkonstante

    Der Wert 'null' ohne Anführungszeichen.

Kommentare

Mit Kommentaren können Sie den AQL-Code durch grundlegende Beschreibungen ergänzen, um den Code für andere Benutzer zu erläutern und selbstbeschreibende, kompilierte Module zu generieren.

Mithilfe von Kommentaren können AQL-Entwickler den AQL-Code durch grundlegende Beschreibungen zur Erläuterung des AQL-Quellcodes ergänzen und selbstbeschreibende kompilierte AQL-Module generieren. In AQL werden drei Arten von Kommentaren unterstützt:

  • Einzeilige Kommentare

    Einzeilige Kommentare beginnen mit doppelten Bindestrichen (--).

  • Mehrzeilige Kommentare

    Mehrzeilige Kommentare beginnen mit einem Schrägstrich und einem Stern (/*) und enden mit einem Stern und einem Schrägstrich (*). Mehrzeilige Kommentare können nicht verschachtelt werden. Der folgende verschachtelte mehrzeilige Kommentar ist z. B. nicht zulässig:

    /*
    A comment with a /*nested comment*/
    */
    
  • AQL Doc-Kommentare

    AQL Doc-Kommentare bieten eine Möglichkeit, ein Modul oder AQL-Objekt in einfacher Sprache und mithilfe verschiedener Aspekte zu beschreiben und so anderen Benutzern verständlichen Kontext zur Verfügung zu stellen. Im Gegensatz zu einzeiligen und mehrzeiligen Kommentaren, die vom AQL-Compiler ignoriert werden, werden AQL Doc-Kommentare in den Metadaten kompilierter Module serialisiert (.tam-Dateien) und sind zur externen Verwendung verfügbar.

    Alle Kommentare in AQL Doc für Anweisungen und Module weisen das folgende Format auf:

    • Der Kommentar besteht aus einfachem Text (es werden keine HTML-Tags unterstützt).

    • Der Kommentar beginnt mit einem Schrägstrich gefolgt von zwei Sternen (/**) und endet mit einem Stern (*/). Optional kann jede Zeile mit einem Stern (*) beginnen.

    • Vor dem Stern können beliebig viele Leerzeichen stehen.

    • Spezielle Tags, denen ein Symbol für ein kommerzielles A (@) vorangestellt ist, können am Anfang jeder Zeile oder nach dem optionalen Stern verwendet werden.

    • AQL Doc-Kommentare können nicht verschachtelt werden. Im AQL Doc-System werden zwei Granularitätsebenen unterstützt. Das Format für das Dokumentieren der einzelnen Artefakte ist im Abschnitt zur jeweiligen Anweisung und Syntax detailliert beschrieben.

    • Kommentare auf Modulebene

      Kommentare auf Modulebene sind in einer speziellen Datei mit dem Namen 'module.info' enthalten, die sich direkt unter dem Modulordner befindet. Die Kommentare sollen die Semantik des Moduls und das Schema der Ansicht Document des Moduls beschreiben.

    • Kommentare auf Anweisungsebene

      Kommentare auf Anweisungsebene befinden sich in der AQL-Quellendatei und stehen unmittelbar vor der Anweisung, mit der ein AQL-Objekt erstellt wird. Einzeilige und mehrzeilige Kommentare sind zwischen dem AQL Doc-Kommentar einer Anweisung und der Anweisung selbst zulässig.

      Für die folgenden AQL-Anweisungen der höchsten Ebene ist das Dokumentieren mit AQL-Kommentaren möglich:

      • Anweisung create external view
      • Anweisung create external table
      • Anweisung create external dictionary
      • Funktion create
      • Anweisung detag
      • Anweisung select... into AQL Doc-Kommentare werden in der kompilierten Darstellung eines Moduls serialisiert.

Ausdrücke

Ein AQL-Ausdruck ist eine Kombination aus einem oder mehreren skalaren Werten und Funktionen, der in einen einzelnen skalaren Wert ausgewertet wird.

Ausdrücke können einen der folgenden Typen aufweisen:

  • Konstante
  • Spaltenreferenz
  • Skalarfunktionsaufruf
  • Aggregatfunktionsaufruf

Konstante

Bei einem Ausdruck kann es sich um eine Konstante des Typs Integer, Float oder String handeln, wie im folgenden Beispiel veranschaulicht:

select 'positive' as polarity

Der Ausdruck ist die Zeichenfolgekonstante positive.

Spaltenreferenz

Bei einem Ausdruck kann es sich um eine Spaltenreferenz handeln, wie im folgenden Beispiel veranschaulicht:

create view Person as
select F.name as firstname, L.name as lastname
from FirstName F, LastName L
where FollowsTok(F.name, L.name, 0, 0);

Diese Ansicht identifiziert Text, der als vollständiger Name einer Person interpretiert werden kann (zum Beispiel “Samuel Davis”, “Vicky Rosenberg”). Die Ausdrücke F.name und L.name sind Spaltenreferenzausdrücke, die die Namensspalte der Ansichten F bzw. L zurückgeben. Die Anweisung from definiert die Ansichten F und L als lokale Namen für die Ansichten FirstName und LastName (die gültige Vor- und Nachnamen definieren und in diesem Beispiel nicht dargestellt sind).

Skalarfunktionsaufruf

Ein Ausdruck kann aus einem oder mehreren Skalarfunktionsaufrufen bestehen, von denen jeder Argumente enthalten kann, bei denen es sich ebenfalls um Ausdrücke des Typs Konstante, Spaltenreferenz oder Skalarfunktion handelt. Ein Skalarfunktionsaufruf kann eine der integrierten Skalarfunktionen oder eine benutzerdefinierte Skalarfunktion sein. Sehen Sie sich dazu das folgende Beispiel an:

create view FamilyMembers as
    select ToLowerCase(GetText(P.lastname)) as lastname, List( (GetText(P.firstname))) as firstnames
    from Person P
    group by GetText(P.lastname);

Diese Ansicht identifiziert potenzielle Familienmitglieder, indem Personen mit demselben Nachnamen in Gruppen zusammengefasst werden, und gibt alle Namen aus, wobei die Nachnamen in Kleinbuchstaben ausgegeben werden (zum Beispiel lastname keaton, firstnames (Elyse, Alex, Diane)). Die Ausgaben der GetText-Funktionsaufrufe werden als Argumente für den Funktionsaufruf ToLowerCase verwendet, um die Namen in Kleinbuchstaben anzuzeigen. Die scalar-Funktionsaufrufausdrücke in diesem Beispiel sind ToLowerCase, (GetText(P.lastname), ToLowerCase(GetText(P.firstname)) und GetText(P.lastname).

Aggregatfunktionsaufruf

Ein Ausdruck kann ein Aggregatfunktionsaufruf sein. Für diesen Ausdruckstyp können andere Ausdrücke des Typs 'Spaltenreferenz' oder 'Skalarfunktionsaufruf' als Argumente verwendet werden. Im folgenden Beispiel ist ein Aggregatfunktionsaufruf mit einem Ausdruck des Typs 'Spaltenreferenz' dargestellt:

create view CountLastNames as
select Count(Person.lastname)
from Person;

Der Ausdruck lautet Count(Person.lastname) und ermittelt die Anzahl der Person.lastname-Annotationen im Dokument. Ein Beispiel für einen Aggregatfunktionsaufruf mit dem Ausdruckstyp 'Skalarfunktionsaufruf' ist List(GetText(P.firstname)) im vorherigen Beispiel. Dabei verwendet die Aggregatfunktion List die Skalarfunktion GetText als Argument zur Generierung einer Liste mit Vornamen. Aggregatfunktionsaufrufausdrücke sind nur als Ausdrücke in der select-Auswahlliste einer Anweisung select zulässig. Aggregatfunktionsaufrufausdrücke sind in der select-Auswahlliste einer Anweisung extract oder als Argumente für einen Skalarfunktionsaufruf oder Aggregatfunktionsaufruf nicht zulässig.

Datenmodell

Das Datenmodell für AQL ähnelt dem relationalen Standardmodell, das von einer SQL-Datenbank wie DB2® verwendet wird. Alle Daten in AQL werden in Tupeln, Datensätzen einer oder mehrerer Spalten oder Feldern gespeichert. Eine Gruppe von Tupeln bildet eine Ansicht. Alle Tupel in einer Ansicht müssen dasselbe Schema, d. h. gleiche Namen und Typen der Felder in allen Tupeln, aufweisen.

Der Inhalt des Eingabedokuments wird als spezielle Ansicht mit der Bezeichnung 'Document' dargestellt.

Die Felder eines Tupels müssen zu einem der integrierten AQL-Datentypen gehören:

  • Boolesch

    Ein Datentyp, dessen Wert 'true' oder 'false' lautet.

  • Gleitkomma

    Eine Gleitkommazahl mit einfacher Genauigkeit.

  • Ganze Zahl

    Eine 32-Bit-Ganzzahl mit Vorzeichen.

  • ScalarList

    Eine Gruppe von Werten mit demselben Skalartyp (Integer, Float, Text oder Span). Ein Wert mit dem Datentyp 'ScalarList' kann als Ergebnis der integrierten AQL-Aggregatfunktion List() oder als Ergebnis einer benutzerdefinierten Funktion abgerufen werden.

  • Bereich

    Ein Span ist ein zusammenhängender Bereich eines Textobjekts, der durch Anfangs- und Endoffsets im Textobjekt identifiziert wird. Beispiel für einen Eingabetext:

    Amelia Earhart is a pilot.
    

    Der Text in Span [0-6] lautet Amelia.

    Dieser Span kann wie folgt visualisiert werden:

    0A1m2e3l4i5a6
    

    Entsprechend lautet der Text in Span [20-25] pilot.

    Der Span [x-x] stellt den Bereich zwischen dem Ende eines Zeichens und dem Beginn des nächsten Zeichens dar. Im vorherigen Beispiel ist [0-0] eine leere Zeichenfolge vor dem Buchstaben A. Ebenso ist der Bereich [3-3] eine leere Zeichenfolge zwischen den Zeichen e und l.

    Ein Wert des Typs 'Span' kann als Ergebnis einer Anweisung extract, einer integrierten Skalarfunktion oder einer benutzerdefinierten Funktion abgerufen werden.

  • Text

    Ein AQL-Datentyp, der eine Zeichenfolge darstellt. Ein Textobjekt enthält eine Unicode-Zeichenfolge, die als Zeichenfolgewert des Objekts bezeichnet wird. Bei einer Zeichenfolge, die als Verknüpfung getrennter Unterzeichenfolgen eines anderen Textobjekts formatiert ist, sind auch ein Verweis auf das ursprüngliche Textobjekt und relevante Informationen zur Offsetzuordnung enthalten. Zwei Textobjekte gelten als gleich, wenn alle Komponenten des einen Textobjekts jeweils identisch mit den entsprechenden Komponenten des anderen Textobjekts sind.

  • Werte des Typs 'Span' und Werte des Typs 'Text' vergleichen Priorisierungsfaktoren wirken sich auf Vergleiche zwischen den Werten des Typs 'Span' und Werten des Typs 'Text' aus.

Werte des Typs 'Span' und Werte des Typs 'Text' vergleichen

Priorisierungsfaktoren wirken sich auf Vergleiche zwischen den Werten des Typs 'Span' und Werten des Typs 'Text' aus.

Werte des Typs 'Span' und Werte des Typs 'Text' werden wie folgt verglichen:

  • Ein Nullwert des Typs 'Span' wird stets niedriger eingeordnet als andere Werte.
  • Ein Wert des Typs 'Text' wird stets höher eingeordnet als ein Wert des Typs 'Span'.
  • Werte des Typs 'Text' werden zuerst nach der lexikalischen Reihenfolge ihrer Zeichenfolgewerte sortiert, dann nach ihrer ursprünglichen Textreihenfolge sowie gegebenenfalls nach den Offsetzuordnungsinformationen.
  • Werte des Typs 'Span' werden zuerst nach ihren zugrunde liegenden Textobjekten sortiert, dann nach ihrem Anfangsoffset und anschließend nach ihrem Endoffset. Der Span mit dem kleineren Anfangsoffset wird niedriger eingeordnet. Zwischen zwei Spans mit demselben Anfangsoffset wird der Span mit dem kleineren Endoffset niedriger eingeordnet.

Ausführungsmodell

Die Laufzeitkomponente verwendet ein Ausführungsmodell, mit dem Dokumente einzeln verarbeitet werden. Die Laufzeitkomponente erhält eine Sammlung von Dokumenten und führt den Extraktor für jedes Dokument aus, um Informationen aus diesem Dokument zu extrahieren.

Ein Extraktor besteht aus einem oder mehreren AQL-Modulen für die Erstellung einer Gruppe von Ansichten, die jeweils eine Beziehung definieren. Einige dieser Ansichten sind als Ausgabeansichten festgelegt, andere als Ansichten ohne Ausgabe. Ansichten ohne Ausgabe können einige Ansichten umfassen, die in ein Modul importiert oder aus einem Modul exportiert werden. Es ist zu beachten, dass Ausgabeansichten und exportierte Ansichten unvereinbar sind. So kann z. B. eine exportierte Ansicht keine Ausgabeansicht sein. Zusätzlich zu diesen Ansichten stellt die eindeutige Ansicht Document das Eingabedokument dar, das von diesem Extraktor annotiert wird.

Document anzeigen

Auf der AQL-Modulebene ist die Ansicht Document eine spezielle Ansicht, die das aktuelle Dokument darstellt, das von diesem Modul annotiert wird. Wenn zwei oder mehr Module zu einem Extraktor kombiniert werden, ist die Union-Verknüpfung der Dokumentschemas aller Module ohne Duplikate die erforderliche Ansicht Document. Verwenden Sie die Anweisung require document with columns, um das Schema der Ansicht Document anzugeben. Wenn diese Anweisung in einem Modul nicht enthalten ist, ist das für die Ansicht Document angenommene Standardschema (text Text, label Text):

  • text

    Der Textinhalt des aktuellen Dokuments.

  • Bezeichnung

    Die Bezeichnung des aktuellen Dokuments, das annotiert wird.

Das Schlüsselwort 'Document' ist als Kennung für die Ansicht Document reserviert, die während der Ausführung automatisch gefüllt wird. Daher können Sie keine andere Ansicht oder Tabelle mit diesem Namen definieren. Das Wort 'Document' kann jedoch als Kennung für Attributnamen und Aliasnamen verwendet werden.

AQL-Anweisungen

Mithilfe von AQL-Anweisungen können Sie Module, Ansichten, Tabellen, Wörterverzeichnisse und Funktionen erstellen und anschließend verwenden.

Die folgenden Anweisungen werden in AQL unterstützt:

  • Anweisungen zur Erstellung von Modellen und zur Deklaration der Interaktion zwischen diesen Modulen

    Anweisung 'module'

    Anweisung 'export'

    Anweisung 'import'

  • Anweisungen zur Erstellung von AQL-Objekten: Ansichten, Wörterverzeichnisse, Tabellen oder Funktionen

    Anweisungen 'create dictionary' und 'create external dictionary'

    Anweisung 'create table'

    Anweisung 'create view'

    Anweisung 'create external view'

    Anweisung 'detag'

    Anweisung 'extract'

    Anweisung 'select'

    Anweisung 'require document with columns'

    Anweisung 'set default dictionary language'

    Anweisung 'create function'

Die Syntaxspezifikationen in den AQL-Anweisungen enthalten eckige Klammern ([ ]). Diese Spezifikationen geben an, dass die Klammern und die Konstrukte, die sie enthalten, optional sind, wenn die entsprechende Syntax beim Schreiben einer Anweisung verwendet wird. Darüber hinaus dienen sie als Platzhalter, wenn definiert werden soll, wie zusätzliche Instanzen eines Konstrukts oder Arguments angegeben werden.

Anweisung module

Mit der Anweisung module können Sie ein Modul erstellen, das über eigenständige erforderliche Ressourcen verfügt. Sie können diese Ressourcen als AQL-Objekte in andere Module exportieren und aus anderen Modulen importieren.

Syntax

module <module-name\>;

Beschreibung

  • <module-name\>

    Deklariert, dass die aktuelle Datei Teil des Moduls mit dem Namen <module-name\> ist Der Modulname muss eine einfache Kennung sein. Kennungen in doppelten Anführungszeichen sind als Modulnamen nicht zulässig.

    Jede AQL-Datei innerhalb des Moduls muss genau eine Moduldeklaration aufweisen und diese Deklaration muss die erste Anweisung in jeder Datei sein. Diese Deklaration erstellt einen Namensbereich, der mit dem Modulnamen übereinstimmt. Alle Ansichten (und andere Objekte wie Wörterverzeichnisse, Tabellen und Funktionen), die in AQL-Dateien innerhalb dieses Moduls deklariert sind, befinden sich in diesem einzelnen Namensbereich. Alle AQL-Dateien in diesem Namensbereich können darauf zugreifen.

    Alle Dateien, die als Teil des Moduls <module-name\> deklariert werden, müssen sich in einem Ordner namens <module-name\> befinden, um diesen Namensbereich zu erzwingen. In diesem Modulordner werden die AQL-Dateien nicht sortiert. Der AQL-Compiler überprüft alle AQL-Dateien des Moduls und bestimmte die korrekte Reihenfolge für die Kompilierung aller im Modul deklarierten Ansichten, Wörterverzeichnisse, Tabellen und Funktionen.

Hinweise zur Verwendung

  • Wenn sich die zugrunde liegende AQL-Datei nicht in einem Modul (modulares AQL) befindet und im Kompatibilitätsmodus kompiliert ist, wird diese Anweisung nicht unterstützt.
  • Schleifenabhängigkeiten zwischen Ansichten sind nicht zulässig.
  • AQL-Module unterstützen keine Untermodule.
  • AQL-Dateien in Unterordnern des Modulordners der höchsten Ebene werden ignoriert.

Beispiele

Beispiel 1: Modul 'sample'

Im folgenden Beispiel ist die Ansicht 'TheMentions' dem Modul mit dem Namen 'sample' zugeordnet.

module sample;

create dictionary GetTheDict as ('The', 'the');

create view TheMentions as
  extract dictionary 'GetTheDict' on D.text as theMention
  from Document D;

Anweisung export

Die Anweisung export in AQL wird verwendet, um ein AQL-Objekt aus dem aktuellen Modul zu exportieren, sodass es in andere Module importiert und dort verwendet werden kann.

Syntax

export view|dictionary|table|function <object-name\>;

Beschreibung

  • view|dictionary|table|function

    Definiert den Typ des zu exportierenden Objekts. Beim Objekttyp kann es sich um eine Ansicht, ein Wörterverzeichnis, eine Tabelle oder eine Funktion handeln.

  • <object-name\>

    Definiert den Namen des zu exportierenden Objekts. Die <object-name\> kann eine einfache ID oder eine ID in doppelten Anführungszeichen sein.

Hinweise zur Verwendung

  • Das Exportieren der importierten AQL-Objekte ist nicht möglich. Sie können den Effekt des erneuten Exportierens der Ansicht oder der Tabelle im aktuellen Modul erzielen, indem Sie eine neue Ansicht erstellen:

    select * from <imported_view_name_or_table_name>;
    
  • Die in den Beispielen dargestellten Anweisungen export view und output view sind unvereinbar. Dies bedeutet, dass eine Ausgabeansicht nicht automatisch eine exportierte Ansicht ist, sondern explizit mit einer Anweisung export exportiert werden muss. Eine exportierte Ansicht ist nicht automatisch eine Ausgabeansicht, sondern muss mit der Anweisung output view explizit als Ausgabeansicht definiert werden. In den Beispielen wird versucht, mit der Anweisung export die Ansicht 'PersonName.FirstName' zu exportieren, bei dieser Ansicht handelt es sich jedoch um eine importierte Ansicht. Dies führt zu einem Fehler. Der Entwickler muss die importierte Ansicht in eine neue Ansicht kopieren, die er dann anstelle der ursprünglichen Ansicht exportieren kann.

Beispiele

Beispiel 1: Ansichten und Wörterverzeichnisse erstellen und zur Verwendung in anderen Modulen exportieren

In diesem Beispiel werden die Ansichten 'FirstName' und 'NotFirstName' erstellt. Die Ansicht 'FirstName' sammelt Informationen zu den Vornamen, die im Wörterverzeichnis 'FirstNamesDictionary' enthalten sind. Die andere Ansicht sammelt die Namen, die übrig bleiben, wenn die Vornamen ausgeschlossen werden. Es sind zwei Wörterverzeichnisse erforderlich, um die Textextraktion zu vereinfachen. Ein Wörterverzeichnis enthält alle Vornamen, nach denen gesucht werden soll. Das zweite Wörterverzeichnis ('LastNamesDictionary') enthält die Nachnamen, nach denen gesucht werden soll. Das Wörterverzeichnis 'FirstNamesDictionary' wird exportiert, sodass es in anderen Modulen verwendet werden kann. Die Ansichten FirstName und NotFirstName werden auch exportiert, damit sie in andere Module, wie z. B. Modul 'person' in Beispiel 2, importiert und dort verwendet werden können.

module personName;

create dictionary FirstNamesDictionary as
('Smith', 'John', 'Mary', 'Sam', 'George');

-- export dictionary statement

export dictionary FirstNamesDictionary;


create view FirstName as
  extract dictionary 'FirstNamesDictionary'
  on D.text as firstName
from Document D;

-- export view statement

export view FirstName;

create dictionary LastNamesDictionary as
('Stewart', 'Johnson', 'Smith', 'Hopkins', 'George');

create view NotFirstName as
  select F.firstName as notFirstName from FirstName F
  where ContainsDict('LastNamesDictionary', F.firstName);

-- export view statement

export view NotFirstName;

Beispiel 2: Ansichten zur Verwendung importieren, jedoch fehlerhaft exportieren, wodurch ein Fehler verursacht wird

In diesem Beispiel ist der Import zweier Ansichten dargestellt. Diese Ansichten wurden aus dem Modul personName in Beispiel 1 exportiert. Die Modulperson kann diese Ansichten jetzt importieren und referenzieren. Dieses Modul versucht jedoch, dieselbe Ansicht, die importiert wurde, zu exportieren (FirstName). Dies verursacht einen Fehler.

module person;

-- Form 1

import view FirstName from module personName as PersonFirstName;

-- Form 2

import view NotFirstName from module personName;


-- ERROR
-- Reason: A view that is imported from one module
-- cannot be exported in the current module.
export view personName.FirstName;


output view PersonFirstName;

Der Grund für den Fehler in diesem Code besteht darin, dass eine Ansicht, die aus einem Modul importiert wird, im aktuellen Modul nicht exportiert werden kann. Darüber hinaus sind exportierte Ansichten nicht automatisch Ausgabeansichten, es sei denn, Sie haben eine Ausgabeansicht mit der Anweisung output view definiert.

Anweisung import

Mit der Anweisung import können Sie Objekte, die aus anderen Modulen exportiert werden, im Kontext des aktuellen Moduls referenzieren.

Syntax

import view|dictionary|table|function <object-name\>
     from module <module-name\> [as <alias\>];

Beschreibung

  • view\|dictionary\|table\|function

    Gibt den Typ des zu importierenden AQL-Objekts an. Der Objekttyp ist obligatorisch.

  • <object-name\>

    Die <object-name\> kann eine einfache ID oder eine ID in doppelten Anführungszeichen sein.

  • <module-name\>

    Die <module-name\> muss eine einfache Kennung sein.

  • <alias\>

    Dieses Format der Importanweisung, auch bekannt als alias import, importiert das angegebene AQL-Objekt unter dem Namen <alias\> (nicht dem ursprünglichen Namen) in den Namensbereich des aktuellen Moduls. Sie können auf das importierte Element verweisen, indem Sie entweder einen nicht qualifizierten Aliasnamen oder einen Aliasname verwenden, der mit dem aktuellen Modulnamen qualifiziert ist (das Modul, in dem das AQL-Objekt importiert wurde), Sie können 'originalModule.elementName' nicht verwenden, da die Anweisung alias import das Element nur unter dem Aliasnamen und nicht unter dem ursprünglichen qualifizierten Namen importiert.

Hinweise zur Verwendung

  • Eine Importanweisung ohne eine Aliasspezifikation importiert das angegebene AQL-Objekt in das aktuelle Modul. Sie macht das AQL-Objekt für AQL-Anweisungen zugänglich, die im aktuellen Modul unter seinem qualifizierten Namen <original\_module\_name\>.<object-name\> definiert wurden.

  • Die Anweisung 'Import' wird nur dazu verwendet, AQL-Objekte aus anderen Modulen zu importieren, nicht aus dem aktuellen Modul. Ein Objekt, das in einer AQL-Datei des Moduls deklariert ist, ist für jede andere AQL-Datei in demselben Modul sichtbar. Eine Importanweisung stellt Objekte in den Kontext des aktuellen Moduls und nicht in den Kontext der aktuellen Datei. Daher wird eine Ansicht, die von 1.aql im Modul A importiert wird, für 2.aql in demselben Modul sichtbar gemacht, ohne dass zusätzliche Importanweisungen erforderlich sind.

  • Alle Importanweisungen müssen unmittelbar auf die Moduldeklaration folgen und vor allen anderen Anweisungstypen stehen. Nur die AQL-Objekte, die explizit aus einem Modul exportiert werden, können in ein anderes Modul importiert werden. Wenn diese Anforderung nicht erfüllt ist, führt dies zu einem Kompilierungsfehler.

  • Ein Kompilierungsfehler tritt auf, wenn eine Anweisung import view einen Namenskonflikt mit einer beliebigen Anweisung create view oder mit anderen Importanweisungen in demselben Modul (nicht nur innerhalb der aktuellen Datei) verursacht. Diese Einschränkung gilt auch für den import anderer Objekte, nicht nur für Ansichten.

  • Der AQL-Compiler folgt den Namenskonventionen, die in früheren Versionen von AQL verwendet wurden:

    • Ein Modul kann nicht eine Ansicht und eine Tabelle mit demselben Namen enthalten.
    • Ein Wörterverzeichnis mit demselben Namen wie eine Tabelle oder Ansicht ist zulässig.
    • Eine Funktion mit demselben Namen wie eine Tabelle, eine Ansicht oder ein Wörterverzeichnis ist zulässig.
  • Ein Kompilierungsfehler tritt auf, wenn unterschiedliche Importanweisungen in einer oder mehreren AQL-Dateien im Modul verschiedenen AQL-Objekten denselben Namen geben.

  • Ein Kompilierungsfehler tritt auf, wenn eine AQL-Datei in einem Modul versucht, auf eine andere exportierte Ansicht in einem Modul zu verweisen, ohne die Anweisung import view zu verwenden. Dies gilt auch für Wörterverzeichnisse, Tabellen oder Funktionen.

  • Wenn zwei AQL-Dateien in einem Modul dieselbe Ansicht X aus einem anderen Modul unter zwei verschiedenen Aliasnamen importieren (z. B. A und B), werden die beiden Aliasnamen synonym behandelt. Diese Regel gilt auch für Tabellen, Wörterverzeichnisse und Funktionen.

Beispiele

Beispiel 1: Ansichten erstellen, die exportiert werden, um sie in andere Module zu importieren

In diesem Beispiel werden zwei Ansichten erstellt: FirstName und NotFirstName. Die Ansicht FirstName sammelt Informationen zu den Vornamen, die im Wörterverzeichnis FirstNamesDictionary enthalten sind. Die zweite Ansicht sammelt die Namen, die übrig bleiben, wenn die Vornamen ausgeschlossen werden. Es sind zwei Wörterverzeichnisse erforderlich, um die Textextraktion zu vereinfachen. Ein Wörterverzeichnis enthält alle Vornamen, nach denen gesucht werden soll. Das zweite Wörterverzeichnis, LastNamesDictionary, enthält die Nachnamen, nach denen gesucht werden soll. Die Ansichten FirstName und NotFirstName werden exportiert, damit sie in andere Module, wie z. B. Modul person in den Beispielen 2 und 3, importiert und dort verwendet werden können.

module personName;

create dictionary FirstNamesDictionary as
('Smith', 'John', 'Mary', 'Sam', 'George');

create view FirstName as
extract dictionary 'FirstNamesDictionary'
on D.text as firstName
from Document D;

export view FirstName;

create dictionary LastNamesDictionary as
('Stewart', 'Johnson', 'Smith', 'Hopkins', 'George');

create view NotFirstName as
select F.firstName as notFirstName from FirstName F
where ContainsDict('LastNamesDictionary', F.firstName);

export view NotFirstName;

Beispiel 2: Ansicht 'FirstName' mithilfe eines Aliasimports importieren

Dieses Beispiel importiert eine der Ansichten, die in Beispiel 1 erstellt und exportiert wurden. Anschließend wird die Ansicht PersonFirstName ausgegeben, sodass ihre Ergebnisse angezeigt werden können.

Die Beispielimportanweisung wird als Aliasimport bezeichnet. Sie importiert die Ansicht FirstName ohne Modulqualifikationsmerkmal in den Namensbereich des aktuellen Moduls person. Auf die importierte Ansicht kann nur über den Aliasnamen PersonFirstName und nicht in anderer Form zugegriffen werden. Beispiel: Sie können auf die importierte Ansicht nicht als personName.FirstName verweisen, da sie nur über den Aliasnamen importiert wird.

module person;

`import view FirstName from module personName as PersonFirstName;`

output view PersonFirstName;

Beispiel 3: Ansicht 'NotFirstname' ohne Aliasimport importieren

Diese Beispielimportanweisung importiert den qualifizierten Namen 'personName.NotFirstName' (nicht den nicht qualifizierten Namen der Ansicht) in den Namensbereich des aktuellen Moduls person. Verwenden Sie immer den qualifizierten Namen, wenn Sie sich auf die importierte Ansicht beziehen. Jede andere Bezugnahme wird als Compilerfehler markiert.

module person;

`import view NotFirstName from module personName;`


output view personName.NotFirstName;

Anweisung import module

Sie können die Anweisung import module verwenden, um vorhandene AQL-Module zu importieren und wiederzuverwenden.

Syntax

 import module <module-name\>;

Beschreibung

  • <module-name\>

    Gibt das zu importierende Modul an. Die <module-name\> muss eine einfache Kennung sein.

Hinweise zur Verwendung

  • Die Anweisung 'Import' wird nur dazu verwendet, AQL-Objekte aus anderen Modulen zu importieren, nicht aus dem aktuellen Modul.

  • Alle Importanweisungen müssen unmittelbar auf die Moduldeklaration folgen und vor allen anderen Anweisungstypen stehen. Nur die AQL-Objekte, die explizit aus einem Modul exportiert werden, können in ein anderes Modul importiert werden. Wenn diese Anforderung nicht erfüllt ist, führt dies zu einem Kompilierungsfehler.

  • Ein Kompilierungsfehler tritt auf, wenn eine Anweisung import view einen Namenskonflikt mit einer beliebigen Anweisung create view oder mit anderen Importanweisungen in demselben Modul (nicht nur innerhalb der aktuellen Datei) verursacht. Diese Einschränkung gilt auch für den import anderer AQL-Objekte, nicht nur für Ansichten.

  • Ein Kompilierungsfehler tritt auf, wenn eine AQL-Datei in einem Modul versucht, auf eine andere exportierte Ansicht in einem Modul zu verweisen, ohne die Anweisung import view zu verwenden. Dies gilt auch für Wörterverzeichnisse, Tabellen oder Funktionen.

  • Wenn zwei AQL-Dateien in einem Modul dieselbe Ansicht X aus einem anderen Modul unter zwei verschiedenen Aliasnamen importieren (z. B. A und B), werden die beiden Aliasnamen synonym behandelt. Diese Regel gilt auch für Tabellen, Wörterverzeichnisse und Funktionen.

Beispiele

In diesem Beispiel importiert die Anweisung import den qualifizierten Namen der beiden exportierten Ansichten personName.FirstName und personName.NotFirstName. Jede Ansicht, die nicht von dem Modul personName exportiert wird, wird nicht als Teil der Importanweisung importiert.

  • Beispiel 1: Sowohl Ansicht 'FirstName' als auch Ansicht 'NotFirstName' importieren

    In diesem Beispiel werden alle exportierten Ansichten aus dem Modul 'personName' angezeigt. Die Ansichten FirstName und NotFirstName wurden im Beispielabschnitt der Exportanweisung erstellt.

    module personOther;
    
    -- The following statement would import both views FirstName and NotFirstName.
    import module personName;
    

Anweisung set default dictionary language

Beim Entwickeln eines Extraktors ermöglicht es die Anweisung set default dictionary language, die Standardgruppe der Sprachen für den Wörterverzeichnisabgleich für das enthaltende Modul anzupassen.

Syntax

 set default dictionary language as '<language codes\>';

Beschreibung

  • <language codes\>

    Gibt die Sprache für die Kompilierung und den Abgleich für Wörterverzeichnisse des Moduls an, die ohne eine explizite Angabe with language as deklariert werden. Die Gruppe <language codes\> muss eine durch Kommas getrennte Liste ohne Leerzeichen um jeden Sprachencode sein. Wenn diese Anforderung nicht beachtet wird, kann dies zu einem Kompilierungsfehler führen.

    Diese Anweisung wirkt sich auf die folgenden Wörterverzeichnisse aus:

    • Wörterverzeichnisse, die im aktuellen Modul explizit mit der Anweisung create dictionary oder create external dictionary deklariert sind, wenn diese Anweisung keine Klausel with language as enthält.
    • Wörterverzeichnisse aus externen Dateien.
    • In einer Musterspezifikation einer Anweisung extract pattern Atome des Typs 'string' und Atome des Typs <'string' [match parameters]> ohne explizite with language as-Spezifikation. Wenn diese Anweisung in einem Modul fehlt, nimmt die Laufzeitkomponente standardmäßig den Sprachensatz Deutsch, Spanisch, Englisch, Französisch, Italienisch und die nicht angegebene Sprache x an. Sie ist als Gruppe definiert: [de,es,en,fr,it,x_unspecified]. In einem Modul kann nur eine Instanz dieser Anweisung enthalten sein.

Hinweise zur Verwendung

  • Die Anweisung set default dictionary language kann aktualisiert werden, um die durch den Extraktor abgedeckten Sprachen zu erweitern. Diese Möglichkeit, Sprachen hinzuzufügen, vereinfacht die Anpassung und die Wiederverwendung vorhandener Extraktoren.

Beispiele

**Beispiel 1: Sprachen angeben, die zum Suchen nach übereinstimmenden Wörterverzeichniseinträgen verwendet werden sollen. **

module Dictionaries;

-- Set the default dictionary matching language
--  for this module to English and French

set default dictionary language as 'en,fr';


/**
* Dictionary of English and French names. Because no language clause
* exists in dictionary definition, module level dictionary matching
* setting will be applied.
*/

create dictionary EnglishFrenchNames
from file 'en_fr_names.dict';

/**
* Dictionary of Italian names. Language clause in the dictionary
* definition will override the module level dictionary matching setting.
*/

create dictionary ItalianNames
with language as 'it'
as
(
'firstEntry','secondEntry'
);


/**
* View to extract pattern: Phone, followed by one to three tokens,
* followed by Email. Language clause at the atom level will override
* the module level dictionary setting.
*/

create view PhoneEmailPattern as
extract pattern <'Phone'[ with language as 'en']>
  <Token> {1,3} 'Email'
as match
from Document D;

output view PhoneEmailPattern;

Anweisung require document with columns

Mit der Anweisung require document with columns können Sie das Schema der speziellen Ansicht Document zum Zeitpunkt der Kompilierung definieren. Diese Schemadefinition gibt die Liste der erforderlichen Felder und deren Typen in den einzelnen Tupeln der Ansicht Document an.

Syntax

require document with columns  <columnName\> <columnType\>
     [and <columnName\> <columnType\>]*;

Beschreibung

  • <columnName\>

    Gibt den Namen der Spalte an, die im Schema verwendet werden soll. <columnName\> ist eine Attributkennung, bei der es sich um eine einfache Kennung oder eine Kennung in doppelten Anführungszeichen handelt.

  • <columnType\>

    Gibt den Spaltentyp an, der im Schema der Ansicht Document verwendet werden soll. <columnType\> kann einen der folgenden Datentypen aufweisen: Ganzzahl, Gleitkomma, Boolesch oder Text.

  • [ and <columnName\> <columnType\> ]*

    Gibt zusätzliche Spaltennamen und -typen für das Schema der Ansicht Document an. Sie folgen denselben Regeln wie <columnName\> und <columnType\>.

In früheren Versionen von AQL war das Schema der speziellen Ansicht Document so vordefiniert, dass es entweder ein einzelnes Feld (text Text) oder zwei Felder (text Text, label Text) enthielt. Die Entscheidung zwischen diesen Schemas wurde zum Zeitpunkt der Ausführung getroffen. Mit der Anweisung require document with columns können Sie das Standardeingabedokumentschema zum Zeitpunkt der Kompilierung überschreiben.

Hinweise zur Verwendung

  • Für modularen AQL-Code ist der Gültigkeitsbereich einer require document with columns-Anweisung das Modul, in dem sie definiert ist.
  • Es ist nur eine require document with columns-Anweisung pro AQL-Datei zulässig. Innerhalb eines einzelnen Moduls oder eines generischen Moduls können null, eine oder mehrere AQL-Dateien vorhanden sein, die eine require document with columns-Anweisung enthalten. Für alle AQL-Dateien innerhalb eines Moduls werden die require document with columns-Anweisungen auf Gesamtmodulebene zusammengeführt und bilden so eine require document with columns-Anweisung für das gesamte Modul. Diese Anweisung definiert das Schema der Ansicht Document für das betreffende Modul. Wenn keine der AQL-Dateien eines Moduls oder eines generischen Moduls eine Anweisung 'require' enthält, hat das Modul ein Standardschema für die Ansicht Document. Dieses Schema besteht aus zwei Spalten: (text Text, label Text). Für die spezielle Ansicht Document werden keine Standardspalten festgelegt, wenn mindestens eine AQL-Datei im Modul eine Anweisung require document with columns enthält.
  • Wenn mehrere Module zu einem Extraktor kombiniert werden, wird das Schema der Ansicht Document des gesamten Extraktors durch die Union-Verknüpfung der Dokumentschemas für jedes Modul ohne Duplikate definiert. Eine Ausnahmebedingung wird ausgelöst, wenn festgestellt wird, dass eine Spalte, die in mehreren Anweisungen require document with columns enthalten ist, widersprüchliche Typanforderungen in verschiedenen Modulen hat. Beispiel: Ein Modul erfordert eine Spalte X mit Typ Y, während ein anderes Modul, das zusammen mit ihm geladen wird, eine Spalte X mit dem Typ Z benötigt.
  • Eine Ausnahmebedingung wird ausgelöst, wenn Sie einen Extraktor ausführen, wenn das angegebene Eingabedokumenttupel nicht alle erforderlichen Spalten enthält. Des Weiteren wird eine Ausnahmebedingung ausgelöst, wenn eine Spalte nicht dem entsprechenden erforderlichen Typ entspricht.
  • Wenn die Anweisung require document with columns in einem Modul enthalten ist, muss jede Spalte der speziellen Ansicht Document, auf die verwiesen wird, in mindestens einer der Anweisungen require document with columns deklariert sein. Die Anweisung kann in verschiedenen AQL-Dateien in demselben Modul enthalten sein. Alle diese Anweisungen require document with columns würden jedoch auf der Ebene des Moduls zusammengeführt werden, um eine modulweite Anweisung require document with columns zu bilden.

Beispiele

Beispiel 1: Anweisung 'require document' mit ähnlichen Spaltentypen

Im folgenden Beispiel wird ein Dokumentschema definiert, das vier Felder des gleichen Typs enthält. In diesem AQL-Beispiel wird erwartet, dass jedes Dokumenttupel der Datensammlung vier Spalten enthält, wie im Dokumentschema definiert.

Details zur Erstellung eines Dokuments, das einem Schema entspricht, finden Sie in den Informationen zu JSON-Dokumentformaten.

module person;

-- Require document statement with similar field types

require document with columns
  inputDocumentText Text
  and inputDocumentLabel Text
  and documentAuthor Text
  and documentCreationDate Text;

Beispiel 2: Anweisung 'require document' mit unterschiedlichen Spaltentypen

Im folgenden Beispiel wird ein Dokumentschema definiert, das Spalten mit unterschiedlichen Feldtypen enthält.

module sample;

-- Require document statement with varying field types

require document with columns
  bookText Text
  and purchaseCount Integer
  and bookPrice Float
  and isBookPopular Boolean;

Beispiel 3: Dokumentschemas zusammenführen

In diesem Beispiel wird beschrieben, wie Dokumentschemas zusammengeführt werden, die die Dateien first.aql, last.aql und socialsecurity.aql verwenden.

first.aql:
    module person;
    require document with columns firstName Text;


last.aql:
    module person;
    require document with columns lastName Text;


socialsecurity.aql
    module person;
    require document with columns lastName Text
        and socialSecurityNo Integer;

Das zusammengeführte Schema ist (firstName Text, lastName Text, socialSecurityNo Integer).

Anweisung create view

Die Komponenten der höchsten Ebene eines AQL-Extraktors sind die Ansichten. Bei Ansichten handelt es sich um logische Anweisungen, die eine Gruppe von Tupeln definieren, diese jedoch nicht notwendigerweise berechnen.

Syntax

Die Anweisung create view kann eines von drei möglichen Formaten aufweisen. Das einfachste Format definiert eine logische Ansicht, die aus den Tupeln einer einzelnen Anweisung select oder extract besteht. Das zweite Format ist ein Multijoin-Format, das eine Ansicht definiert, die die Tupel umfasst, die aus der Multiset-Union-Verknüpfung mehrerer select- oder extract-Anweisungen entsteht. Das dritte Format definiert eine neue Ansicht, die die Differenz zwischen Tupeln aus zwei Anweisungen select oder extract enthält.

create view <viewname\> as  <select or extract statement\>;
create view <viewname\> as  (<select or extract statement\>) union all (<select or extract statement\>)...;
create view <viewname\> as  (<select or extract statement\>) minus (<select or extract statement\>);

Beschreibung

  • <viewname\>

    Die <viewname\> kann eine einfache ID oder eine ID in doppelten Anführungszeichen sein. Sie darf keinen Punkt enthalten.

  • <select or extract statement\>

    Die Anweisung select oder extract generiert eine Ausgabe, die verwendet wird, um die Tupel der übergeordneten Ansicht zu berechnen.

Hinweise zur Verwendung

  • Bei Ansichtsnamen muss die Groß-/Kleinschreibung beachtet werden. So sind beispielsweise Person, PERSON und person unterschiedliche Ansichtsnamen.
  • Zwei Ansichten im selben AQL-Modul können nicht denselben Namen haben, da es sich sonst um Duplikate handeln würde. Es können jedoch zwei Ansichten mit demselben Namen in zwei unterschiedlichen Modulen vorhanden sein, da ihre vollständig qualifizierten Namen eindeutig sind.
  • Standardmäßig ist eine mit der Anweisung create view definierte Ansicht eine Ansicht ohne Ausgabe, bis sie als Ausgabeansicht angegeben wird.
  • Die Anweisungen select oder extract der Formate union all und minus müssen über ein kompatibles Ausgabeschema verfügen. Zwei Schemas gelten als kompatibel für eine Operation union oder minus, wenn sie dieselbe Anzahl Spalten haben, sich die Spaltennamen in derselben Reihenfolge befinden und wenn sie kompatible Datentypen aufweisen:
    • Felder desselben Datentyps sind mit union oder minus kompatibel.
    • Die Datentypen 'Span' und 'Text' sind mit union oder minus kompatibel. Im Falle einer Verknüpfung zwischen einem Typ 'Span' und einem Typ 'Text' ist 'Span' der Ausgabetyp. Objekte des Typs 'Text' werden jedoch nicht automatisch in den Typ 'Span' konvertiert - die automatische Konvertierung erfolgt nur, wenn sie durch Funktionsaufrufe angefordert wird.
    • Zwei ScalarLists sind kompatibel mit union oder minus, unabhängig von dem zugrunde liegenden Skalartyp.

Beispiele

Beispiel 1: Ansicht mit einer select- oder extract-Anweisung erstellen

Im folgenden Beispiel verwendet die Ansicht Phone eine Anweisung extract zur Vorbereitung der Tupel. Die Ansicht PhoneNumber verwendet eine Anweisung select, um bestimmte Felder in der Ansicht Phone auszuwählen.

create view Phone as extract
  regexes /\+?([1-9]\d{2}\)\d{3}-\d{4}/
  and /\+?[Xx]\.?\d{4,5}/
  on D.text as num
from Document D;

create view PhoneNumber as
select P.num as num, LeftContextTok(P.num, 3) as lc
from Phone P;

Beispiel 2: Ansicht mit einer Anweisung 'Union All' erstellen

Die Ansicht AllPhoneNums bereitet eine Vereinigungsmenge (Union) aus den Tupeln der Ansichten Phone und Extension vor. Die beiden Ansichten, die verknüpft werden, haben dasselbe Schema.

create view Phone as
extract
    regex /\+?([1-9]\d{2}\)\d{3}-\d{4}/
    on D.text as match
from Document D;

create view Extension as
  extract
    regex /\+?[Xx]\.?\d{4,5}/
    on D.text as match
from Document D;

create view AllPhoneNums as
  (select P.match from Phone P)
union all
  (select E.match from Extension E);

Beispiel 3: Ansicht mit einer Anweisung 'minus' erstellen

Das folgende Beispiel veranschaulicht die Verwendung von minus, um nicht erwünschte Tupel aus einer Gruppe von Tupeln herauszufiltern.

create view Organization as
  (select * from OrganizationCandidates)
minus
  (select * from InvalidOrganizations);

Beispiel 4: Schemakompatibilität für 'minus'

Es muss beachtet werden, dass Spans über unterschiedlichen Zieltext nicht denselben Typ haben. Beachten Sie das folgende AQL-Beispiel, das diesen Unterschied anhand eines Zeichenfolgeliterals erläutert.

create view OneString as
  select 'a string' as match
  from Document D;

create view TheSameString as
  select 'a string' as match
  from Document D;

create view Subtraction as
  (select R.match from OneString R)
minus
  (select R.match from TheSameString R);

Anstelle der erwarteten Ausgabe einer leeren Tupelliste besteht die Ausgabe aus einer Reihe von Datensätzen mit einer Zeichenfolge (String) als Feldwert.

Obwohl der Inhalt der Ansichten OneString und TheSameString identisch scheint, weisen die tatsächlichen Textwerte unterschiedliche zugrunde liegende AQL-Objekte auf. Der Typ von OneString.match ist 'Span over OneString.match'. Der Typ von TheSameString.match lautet 'Span over TheSameString.match'. Da die Feldtypen unterschiedlich sind, sind sie zu Vergleichszwecken nicht kompatibel.

Um die gewünschte Ausgabe der leeren Tupelliste zu erhalten, müssen Sie Werte desselben Typs vergleichen. Im folgenden Beispiel konvertiert die Funktion GetString() Span-Objekte in Zeichenfolgeobjekte, um kompatible Typen an die Operation minus zu übergeben.

create view Subtraction as
(select GetString(R.match) from OneString R)
minus
(select GetString(R.match) from TheSameString R);

Anweisung create view mit AQL Doc dokumentieren

Der AQL Doc-Kommentar für eine Anweisung create view enthält die folgenden Informationen:

  • Allgemeine Beschreibung der Ansicht.
  • @field für jeden Spaltennamen in der Ansicht.

Beispiel

/**
* Extracts all spans that match a phone number pattern from
* the input documents. It uses a regular expression to match
* phone number patterns.
* @field num phone number
* @field lc 3 tokens to the left of phone number*/

create view PhoneNumber as
select P.num as num, LeftContextTok(P.num, 3) as lc
from
(
extract
    regexes /\+?([1-9]\d{2}\)\d{3}-\d{4}/ and /\+?[Xx]\.?\d{4,5}/
    on D.text as num
from Document D
) P;

Anweisung output view

Mit der Anweisung output view wird eine Ansicht als Ausgabeansicht definiert. Die Laufzeitkomponente gibt nur die Tupel von Ansichten aus, die als Ausgabeansichten gekennzeichnet sind. Der AQL-Compiler kompiliert nur Ansichten, die als Ausgabe oder Export markiert sind oder die von Ansichten erreichbar sind, die als Ausgabe oder Export markiert sind.

Syntax

output view <view-name\> [as '<alias\>'];

Beschreibung

  • <view-name\>

    Der Name der auszugebenden Ansicht, der im Namensbereich des aktuellen Moduls angegeben ist. <view-name\> ist eine einfache ID oder eine ID in doppelten Anführungszeichen. Die integrierte Ansicht Document kann keine Ausgabeansicht sein.

  • [as '<alias\>']*

    Definiert einen <alias\>-Namen für die Ausgabeansicht. Wenn der optionale Aliasname nicht angegeben ist, wird die Ansicht unter den folgenden Namen ausgegeben:

    • In modularer AQL wird die Ansicht unter dem Namen <module-name\>.<view-name\> ausgegeben, wobei <module-name\> der Name des Moduls ist, in dem die Ansicht ursprünglich definiert ist (was sich von dem Modul unterscheiden kann, in dem die Ansicht ausgegeben wird).
    • In AQL 1.4 oder früher wird die Ansicht unter dem Namen <view-name\> Die Anweisung output ... as <alias\> ist nützlich, wenn Sie einen Extraktor für verschiedene Domänen anpassen. Die Verwendung des Namens <alias\> beim Definieren einer Ausgabeansicht stellt sicher, dass Ausgabenamen in verschiedenen Implementierungen der Anpassung identisch sind.

    Der Name <alias\> kann nicht in einer anderen Anweisung select oder export verwendet werden. Sie müssen <alias\> in einfache Anführungszeichen einschließen und der <alias\>-Name kann Punkte enthalten.

Hinweise zur Verwendung

  • Wenn ein AQL-Extraktor ausgeführt wird, berechnet er resultierende Tupel für jede Ansicht, die als Ausgabeansicht definiert ist. Die Tupel einer beliebigen Ansicht ohne Ausgabe werden ebenfalls berechnet, jedoch nur dann, wenn sie für die Berechnung der resultierenden Tupel einer Ausgabeansicht erforderlich sind.
  • In modularem AQL-Code gibt die Anweisung output view die Tupel der Ansicht unter dem vollständig qualifizierten Ansichtsnamen aus, der durch den Modulnamen qualifiziert wird. Beachten Sie das folgende Beispiel, in dem die Anweisung output view Person; zur Ausgabe der Ansicht personModule.Person führt:
module personModule;

create view Person as
  extract dictionary 'FamousPeopleDict' on D.text as match
  from Document D;

output view Person;

Dieses Verhalten gilt für jede Ausgabeansicht ohne Aliasname, unabhängig davon, ob die Ansicht in dem Modul ausgegeben wird, in dem sie definiert wird, oder in einem Modul, in das sie importiert wird, selbst wenn sie unter Verwendung eines Aliasimports importiert wird. Beispiel: In der Ausgabeansicht MyPerson führt dieses Beispiel dazu, dass die Ausgabe unter dem ursprünglichen qualifizierten Namen personModule.Person ausgegeben wird und nicht unter dem lokalen Aliasnamen MyPerson.

module employeeModule;

import view Person from module personModule as MyPerson;

output view MyPerson;
  • Die Anweisung 'output view' ist hilfreich, wenn Sie Extraktorbibliotheken erstellen, in denen derselbe Entitätentyp abhängig von der Anwendungsdomäne oder der Sprache der Eingabedokumente verschiedene Implementierungen haben kann. Der Hauptnutzen der Verwendung eines Aliasnamens beim Definieren einer Ausgabeansicht besteht darin, eine konsistente Nomenklatur für die Ausgabeansichten sicherzustellen. Eine konsistente Nomenklatur wird von der Programmlogik eines Benutzers erwartet, wenn Sie mehrere Module verarbeiten, die alle eine semantisch ähnliche Ansicht ausgeben. In modularem AQL-Code werden die Tupel einer Ansicht unter dem angegebenen Aliasnamen ausgegeben, wenn ein Aliasname in einer Anweisung output view verwendet wird. Der folgende Code würde beispielsweise die Ergebnisse unter dem Aliasnamen 'PersonAlias' ausgeben und der Aliasname wird nicht mit dem Modulpräfix qualifiziert.
module personModule;

create view Person as
  extract dictionary 'FamousPeopleDict' on D.text as match
  from Document D;

output view Person as 'PersonAlias';

Beispiele

Das folgende Beispiel enthält die zwei Module personModuleFrench und personModuleEnglish. Jedes Modul generiert eine Ansicht: PersonNameFrench und PersonNameEnglish. Angenommen, es gibt ähnliche Module, die jeweils Ansichten ausgeben, die semantische Varianten eines Extraktors für Personennamen darstellen. Diese Module werden für verschiedene Sprachen mit der Varianz in der Anpassung dieser Ansicht für eine angegebene Eingabesprache angepasst. Darüber hinaus möchte ein Benutzer möglicherweise, dass ein Programm Module verwendet, in denen die gesuchte Ausgabeansicht den Namen 'PersonName' hat, unabhängig von den Modulen, die verarbeitet werden. Diese Erwartung ist normal, da jedes Modul, das für eine Sprache, eine Domäne oder einen anderen Zweck angepasst wird, erwartungsgemäß verschiedene Ergebnisse generiert. Der Nutzer dieser Module muss den Algorithmus seines Programms nicht ändern, um mehrere Namen von Ausgabeansichten zu berücksichtigen, wenn die zugrunde liegende Semantik ähnlich ist.

Weil in dem Beispiel der Aliasname PersonName verwendet wird, muss der Nutzer den gesuchten Ansichtsnamen nicht ändern. Die Ergebnisse können jedoch in Abhängigkeit von den verarbeiteten Modulen variieren. In dem Beispiel basieren die resultierenden Übereinstimmungen auf Französisch (Beispiel 1) und Englisch (Beispiel 2).

Beispiel 1: Übereinstimmungen basieren auf der französischen Sprache

Im folgenden Beispiel wird die Ansicht PersonNameFrench definiert und unter dem implementierungsneutralen Aliasnamen 'PersonName' ausgegeben.

module personModuleFrench;

create dictionary FrenchNames as
  ('Jean', 'Pierre', 'Voltaire', 'Francois', 'Marie', 'Juliette');

create view PersonNameFrench as
  extract dictionary 'FrenchNames'
  on D.text as name
  from Document D;

output view PersonNameFrench as 'PersonName';

Beispiel 2: Übereinstimmungen basieren auf der englischen Sprache

Im folgenden Beispiel wird die Ansicht PersonNameEnglish definiert und unter dem implementierungsneutralen Aliasnamen 'PersonName' ausgegeben.

module personModuleEnglish;

create dictionary EnglishNames as
  ('John', 'Peter', 'Andrew', 'Francis', 'Mary', 'Juliet');

create view PersonNameEnglish as
  extract dictionary 'EnglishNames'
  on D.text as name
  from Document D;

output view PersonNameEnglish as 'PersonName';

Der Nutzer der Beispielmodule kann die ausgegebenen Tupel über den Aliasnamen 'PersonName' aufrufen. Er muss das tatsächliche Modul, aus dem die Ergebnisse abgerufen werden, nicht kennen.

Anweisung extract

Die Anweisung extract wird dazu verwendet, grundlegende Merkmale direkt aus dem Text zu extrahieren.

Syntax

extract <select list>,
  <extraction specification>
from <from list>
[having <having clause>]
[consolidate on <column> [using '<policy>']]
[limit <maximum number of output tuples for each document>];

Beschreibung

  • <select list\>

    Ein durch Kommas begrenzte Liste mit Ausgabeausdrücken. Die Ergebnisse dieser Ausgabeausdrücke wird als Ausgabe der Anweisung extract zusammen mit den Tupeln zurückgegeben, die durch die Auswertung der Extraktionsanweisung generiert werden. Das Format für <select list\> entspricht dem Format <select list\> einer select-Anweisung.

  • <extraction specification\>

    Wendet die Extraktionsspezifikation auf alle Tupel aus den Ansichten an, die in <from list\>definiert sind. Dabei werden die Spalten von Tupeln entsprechend den Aliasnamen umbenannt, die in der Anweisung extract angegeben sind. Sie können eine der folgenden Extraktionsspezifikationen verwenden:

    • Reguläre Ausdrücke
    • Wörterbücher
    • Aufteilungen
    • Blöcke
    • Wortart
    • Sequenzmuster
  • <from list\>

    Eine durch Kommas begrenzte Liste, die die Quelle der Tupel ist, aus denen Merkmale ausgewählt werden sollen. Das Format von <from list\> ähnelt dem Format von <from list\> der Anweisung select. Wenn die Anweisung extract jedoch keine Musterspezifikation hat, kann <from list\> ein einzelnes Element enthalten.

  • [having <having clause\>]

    Gibt ein Filterprädikat (in <having clause\>) an, das auf jedes extrahierte Ausgabetupel angewendet wird. Die in <having clause\> angegebenen Feldnamen beziehen sich auf alle Aliasnamen, die in <select list\> angegeben sind. Diese Klausel ist optional.

  • [consolidate on <column\>[using '<policy\>' ]]

    Definiert, wie überlappende Bereiche wie in der Konsolidierung <policy\> definiert behandelt werden. In dieser Spezifikation muss <column\> der Name eines Ausgabefelds sein, das Teil der Anweisung extract ist. Diese Klausel ist optional.

  • [limit<maximum number of output tuples for each document\>]

    Begrenzt die Anzahl der Ausgabetupel für jedes Dokument auf den angegebenen Maximalwert. Diese Klausel ist optional.

Hinweise zur Verwendung

Die Semantik der Anweisung extract lautet wie folgt:

  • Werten Sie die Extraktionsspezifikation über jedes Tupel der Eingabebeziehung aus. Für jedes Ergebnis, das die Extraktion erzeugt, wird ein Ausgabetupel erzeugt, das die extrahierten Werte zusammen mit allen Spalten des ursprünglichen Tupels, die im <select list\>angegeben wurden, enthält.
  • Benennen Sie die Spalten des Ausgabetupels entsprechend den Aliasnamen um, die als Teil von <select list\> und <extraction specification\> angegeben wurden.
  • Wenden Sie Vergleichselemente in der optionalen Klausel having auf das resultierende Ausgabetupel an.
  • Konsolidieren Sie die Tupel, die die Vergleichselemente entsprechend der optionalen Klausel consolidation erfüllen, und fügen Sie die resultierenden Tupel zur Ausgabe hinzu.
  • Wenn die optionale Klausel limit vorhanden ist, begrenzen Sie die Ausgabe auf die angegebene Anzahl von Tupeln für jedes Dokument.

Die Semantik der Klausel from einer Anweisung extract pattern unterscheidet sich von anderen Formen von extract-Anweisungen, die nicht über eine Musterspezifikation verfügen. Wenn mindestens eine der Ansichten in <from list\> keine Tupel für ein bestimmtes Dokument enthält, ist die Ausgabe der Anweisung extract leer. Diese Ausgabe ist leer, weil alle Kombinationen von Tupeln in den Eingabeansichten leer sind.

Im speziellen Fall von extract pattern-Anweisungen ist die Klausel from ein Platzhalter, der die Namen der Beziehungen deklariert, die an der Musterspezifikation beteiligt sind. Die Semantik der Anweisung wird nur durch die Musterspezifikation gesteuert. Insbesondere kann die Ausgabe der Anweisung dann 'nicht leer' sein, wenn manche der Eingabeansichten leer sind.

Beispiele

Beispiel 1: Telefonnummern aus einer vordefinierten Ansicht extrahieren

Diese Beispielextraktionsanweisung wertet einen regulären Ausdruck für Telefonnummern in den Vereinigten Staaten für einen Eingabetext aus, der durch die vordefinierte Ansicht Document dargestellt wird. Die Ausgabe ist dann auf die ersten drei Telefonnummern beschränkt, die pro Dokument ermittelt werden. Feldnamen in der Klausel 'having' beziehen sich auf die Aliasnamen am Anfang der Anweisung extract.

create view PhoneNumbers as
  extract
    D.text as documentText,
    regex /\d{3}-\d{3}-\d{4}/ on D.text as phoneNumber
from Document D
having MatchesRegex(/\d{3}.*/, phoneNumber)
limit 3;

Beispiel 2: Blöcke von Wörtern mit großen Anfangsbuchstaben extrahieren

In diesem Beispiel identifiziert die Anweisung extract Blöcke aus zwei bis drei großgeschriebenen Wörtern. In AQL bezieht sich ein Block auf einen zusammenhängenden Span von Tokens, in diesem Fall zwei bis drei Tokens. In diesem Beispiel wird auch eine Konsolidierungsrichtlinie verwendet, um Blöcke, die in größeren Blöcken enthalten sind, von den Ausgabetupeln auszuschließen.

create view CapitalizedWord as
  extract
    regex /[A-Z][a-z]*/
            with flags 'CANON_EQ'
        on 1 token in D.text
        as word
from Document D;

create view TwoToThreeCapitalizedWords as
  extract blocks
  with count between 2 and 3
  and separation 0 tokens
  on CW.word as capswords
from CapitalizedWord CW
consolidate on capswords using 'ContainedWithin';

Die Klausel consolidate wird auf das Feld capswords durch die Spezifikation 'extract blocks' angewendet. Der Unterschied besteht darin, dass das Zielfeld, auf das die Klausel consolidation verweist, ein Ausgabefeld der Anweisung extract ist. Das Zielfeld der Anweisung select ist ein Eingabefeld. Dieses Verhalten ist ähnlich wie bei der Klausel having.

Beispiel 3: Verschachtelte extract- oder select-Anweisung als Ansichtsname

Die Eingabeansicht für eine Anweisung extract kann entweder ein Ansichtsname wie in Beispiel 2 oder eine verschachtelte Anweisung extract oder select wie im folgenden Beispiel sein:

create view SampleExtract as
  extract
  regex /foo/ on E.foobar as foo
  from
    (extract regex /foobar/ on D.text as foobar
  from Document D) E;

Beispiel 4: Anweisung mit einer Auswahlliste extrahieren

In diesem Beispiel werden Übereinstimmungen für ein Muster extrahiert; gleichzeitig werden mehrere Attribute in den Eingabeansichten ausgewählt.

create view Person as
  extract.F.first as first, M.initial as middle, L.last as last
          pattern ('Mr.'|'Ms.'|'Miss')? (<F.first> <M.initial>? <L.last>)
                    return group 0 as reference
                    and group 1 as salutation
                    and group 2 as name
  from FirstName F, MiddleInitial M, LastName L;
  • Reguläre Ausdrücke Verwenden Sie eine Extraktionsspezifikation 'regex', um übereinstimmende Muster zu ermitteln, die durch den regulären Ausdruck im Eingabetext erfasst werden.
  • Wörterverzeichnisse Verwenden Sie die Extraktionsspezifikation 'dictionary', um Zeichenfolgen aus Eingabetext zu extrahieren, die in einem Wörterverzeichnis von Zeichenfolgen enthalten sind.
  • Aufteilungen Verwenden Sie die Extraktionsspezifikation 'split', um einen größeren Span in mehrere kleinere Spans aufzuteilen.
  • Blöcke Verwenden Sie die Extraktionsspezifikation 'blocks', um Blöcke von zusammenhängenden Spans im Eingabetext zu identifizieren.
  • Wortart Verwenden Sie die Extraktionsspezifikation 'part of speech', um verschiedene Wortarten im Eingabetext zu identifizieren.
  • Sequenzmuster Verwenden Sie die Extraktionsspezifikation 'pattern', um einen Musterabgleich für ein Eingabedokument und andere Spans, die aus dem Eingabedokument extrahiert wurden, auszuführen.

Reguläre Ausdrücke

Verwenden Sie eine Extraktionsspezifikation 'regex', um übereinstimmende Muster zu identifizieren, die durch den regulären Ausdruck im Eingabetext erfasst werden.

Syntax

regex[es] /<regex1>/
         [and /<regex2>/ and ... and /<regex n>/]
       [with flags '<flags string>']
on <token spec>] <name>.<column>
<grouping spec>

Beschreibung

  • regex[es] /<regex1\>/

    Gibt die regulären Ausdrücke an, die in der Extraktion verwendet werden sollen. Standardmäßig verwendet AQL die Perl-Syntax für reguläre Ausdrücke, d. h., Literale in regulären Ausdrücken werden in zwei normale Schrägstriche (//) eingeschlossen. Escapezeichenfolgen für reguläre Ausdrücke haben Vorrang gegenüber anderen Escapezeichen. AQL lässt reguläre Ausdrücke in der SQL-Zeichenfolgesyntax zu, d. h., beide nachfolgend dargestellten Beispiele sind gültige reguläre Ausdrücke für Telefonnummern in den Vereinigten Staaten.

    /\d{3}-\d{5}/
    
    '\\d{3}-\\d{5}'
    
  • [and /<regex2\>/ and ... and /<regex n\>/ ]

    Listet weitere reguläre Ausdrücke auf, die in der Extraktion verwendet werden können.

  • [with flags '<flags string\>']

    Gibt eine Kombination von Flags an, mit denen der Abgleich anhand der regulären Ausdrücke gesteuert werden kann. Dieser Parameter ist optional. Diese Flags entsprechen einer Untergruppe der Flags, die in der Java™-Implementierung definiert sind. Wenn die Flagzeichenfolge nicht angegeben wird, verwendet AQL standardmäßig nur das Flag DOTALL.

    Zum Angeben mehrerer Flags trennen Sie diese mit dem Zeichen |. Wenn Sie beispielsweise eine mehrzeilige Suche, bei der die Groß-/Kleinschreibung nicht beachtet werden muss, sowie die Unicode-Zeichenumsetzung angeben möchten, verwenden Sie die Flagzeichenfolge 'MULTILINE|CASE_INSENSITIVE|UNICODE'.

  • [<token spec\>]

    Gibt an, ob der Abgleich durch den regulären Ausdruck nur an den Tokengrenzen angewendet werden soll.

    ... [[between <number> and] <number> token[s] in] ...
    

    Tokeneinschränkungen sind ein optionaler Teil der Spezifikation. Wenn keine Tokeneinschränkungen verwendet werden, gibt AQL die längste, nicht überlappende Übereinstimmung an jeder Zeichenposition im Eingabetext zurück. Wenn Tokeneinschränkungen bestehen, gibt die Anweisung extract die längste Übereinstimmung an jeder Tokengrenze zurück, die innerhalb des angegebenen Längenbereichs der Tokens liegt. Jede zurückgegebene Übereinstimmung muss am Anfang eines Tokens beginnen und am Ende eines Tokens enden. Wenn mehrere überlappende Übereinstimmungen vorhanden sind, gibt die Anweisung extract alle Übereinstimmungen zurück.

    Die Positionen der Tokengrenzen hängen davon ab, welchen Tokenizer die Laufzeitkomponente zum Zerlegen des Dokuments in Tokens verwendet. Wenn die Engine den Standardtokenizer verwendet, wird ein Token als eine Folge von Wortzeichen oder als einzelnes Interpunktionszeichen definiert.

    Beispielzeichenfolge:

    "The fish are pretty," said the boy.
    

    Die Tokengrenzen werden an den folgenden Positionen identifiziert:

    ["][The] [fish] [are] [pretty][,]["] [said] [the] [boy][.]
    
  • <name\>.<column\>

    Name der Ansicht und Name der Spalte, auf die der reguläre Ausdruck angewendet wird.

  • <grouping spec\>

    Legt fest, wie die Erfassung von Gruppen im regulären Ausdruck verarbeitet werden soll. Bei Erfassungsgruppen handelt es sich um Regionen von Übereinstimmungen mit regulären Ausdrücken, die in runden Klammern im ursprünglichen Ausdruck angegeben werden. Der Ausdruck (fish)(cakes) hat zum Beispiel drei Erfassungsgruppen:

    • Gruppe 0 ist die gesamte Übereinstimmung fishcakes.
    • Gruppe 1 ist fish.
    • Gruppe 2 ist cakes. Wenn Sie Gruppen-IDs in der Rückgabeklausel der Syntax angeben, muss jede Gruppen-ID einer gültigen Gruppe innerhalb jedes regulären Ausdrucks entsprechen, die als Teil der Regex-Klausel 'extract' in der Syntax angegeben wird.

    Dies ist das Format der Gruppierungsspezifikation:

    return
        group <number> as <name>
        [and group <number> as <name>]*
    

    Um nur Gruppe 0 (die gesamte Übereinstimmung) zurückzugeben, können Sie ein kürzeres, alternatives Format wie in Beispiel 1 verwenden. Dieses Format entspricht return group 0 as <name>. <name> kann eine einfache ID oder eine ID in Anführungszeichen sein.

Hinweise zur Verwendung

  • Im Allgemeinen unterstützt AQL dieselben Features wie die Java 5-Implementierung für reguläre Ausdrücke. Eine Beschreibung finden Sie unter 'Class Pattern: java.util.regex'. Die Laufzeitkomponente enthält mehrere Implementierungen einer Engine für reguläre Ausdrücke, einschließlich der integrierten Implementierung von Java. Während der Kompilierung überprüft das Optimierungsprogramm jeden regulären Ausdruck und wählt die Engine aus, die den Ausdruck am schnellsten ausführen kann.

  • Die alternativen Ausführungsengines haben möglicherweise eine leicht unterschiedliche Semantik für bestimmte Grenzfälle. Insbesondere wertet AQL die Alternativen nicht immer in derselben Reihenfolge aus.

    Beispiel: Angenommen, eine Anweisung 'extract' gleicht den regulären Ausdruck /fish|fisherman/ mit dem Text 'fisherman' ab. Die Anweisung stimmt entweder mit 'fish' oder mit 'fisherman' überein, abhängig davon, welche Engine für reguläre Ausdrücke intern verwendet wird.

AQL-Flagzeichenfolge Java-Flag Beschreibung
CANON_EQ CANON_EQ Kanonische Äquivalenz: Unterschiedliche Unicode-Codierungen desselben Zeichens werden als gleichwertig betrachtet.
CASE_INSENSITIVE CASE_INSENSITIVE Abgleich, bei dem die Groß-/Kleinschreibung nicht berücksichtigt wird. Standardmäßig werden dabei nur Zeichen im US-ASCII-Zeichensatz abgeglichen werden. Ein Abgleich, bei dem die Groß-/Kleinschreibung nicht berücksichtigt wird, kann für Unicode aktiviert werden, indem mit diesem Flag auch das Flag UNICODE angegeben wird.
UNICODE UNICODE_CASE Wenn angegeben ist, dass die Groß-/Kleinschreibung nicht beachtet werden soll, verwenden Sie die Unicode-Zeichenumsetzung, um zu bestimmen, ob zwei Zeichen bei einem Vergleich ohne Beachtung der Groß-/Kleinschreibung entsprechend dem Unicode-Standard äquivalent sind. Standardmäßig werden dabei nur Zeichen im US-ASCII-Zeichensatz abgeglichen werden. Hinweis: Das Verhalten dieses Flags ist nicht definiert, wenn es ohne das Flag CASE_INSENSITIVE verwendet wird.
DOTALL DOTALL Der Punkt . ergibt eine Übereinstimmung mit allen Zeichen, einschließlich Zeilenumbruch (Newline).
LITERAL LITERAL Der Ausdruck wird als Folge von Literalen verwendet, wobei die üblichen Escapezeichenfolgen für reguläre Ausdrücke ignoriert werden.
MEHRZEILIG MEHRZEILIG Die Zeichen ^ und $ ergeben eine Übereinstimmung mit dem Anfang und Ende jeder Zeile, nicht mit dem Anfang und Ende des gesamten Eingabetexts.
UNIX_LINES UNIX_LINES Nur das UNIX™-Zeilenvorschubzeichen als Zeilenumbruch verwenden und das Wagenrücklaufzeichen \r ignorieren.
  • Befolgen Sie die folgenden Richtlinien, um Ihre Extraktoren schneller ausführen und einfacher warten zu können:
    • Vermeiden Sie lange, komplexe reguläre Ausdrücke. Verwenden Sie stattdessen einfachere, kürzere reguläre Ausdrücke, die mit AQL-Anweisungen kombiniert werden.
    • Verzichten Sie möglichst auf die Verwendung von 'lookahead' und 'lookbehind' in regulären Ausdrücken. Sie können in der Regel den gleichen Effekt erzielen, indem Sie Vergleichselemente zur Klausel 'having' Ihrer Anweisung 'extract' hinzufügen.
    • Verwenden Sie Tokeneinschränkungen in den Extraktionsspezifikationen für reguläre Ausdrücke, soweit dies möglich ist.

Beispiele

Beispiel 1: Verwendung kanonischer Unicode-Äquivalenz zum Ermitteln von Übereinstimmungen

In diesem Beispiel wird gezeigt, wie großgeschriebene Wörter gefunden werden, die keine Namen sind. Die kanonische Äquivalenz für Unicode-Zeichen wird verwendet, um Übereinstimmungen zu ermitteln. Beachten Sie die Verwendung des Flags ‘CANON_EQ’ und dass 'regex' für Token ausgeführt wird:

create dictionary FirstNamesDict as
  (
  'Aaron', 'Matthew', 'Peter'
  );
create view NotFirstName as
  extract
    regex /[A-Z][a-z]*/
    with flags 'CANON_EQ'
    on 1 token in D.text
    as word
from Document D
  having Not(ContainsDict('FirstNamesDict', word));

Beispiel 2: Verwendung von Erfassungsgruppen

Das folgende Beispiel veranschaulicht die Verwendung von Erfassungsgruppen in einer Anweisung extract regex. Der Code extrahiert die Felder einer Telefonnummer in den Vereinigte Staaten, indem er Erfassungsgruppen verwendet:

create view Phone as
  extract regex /(\d{3})-(\d{3}-\d{4})/
    on between 4 and 5 tokens in D.text
    return
      group 1 as areaCode
      and group 2 as restOfNumber
      and group 0 as fullNumber
from Document D;

Beispiel 3: Mehrere reguläre Ausdrücke auf Eingabetext anwenden

Sie können mehrere reguläre Ausdrücke in derselben Anweisung extract regex angeben, indem Sie die Syntax regexes verwenden.

create view PhoneNum as
  extract regexes
    /(\d{3})-(\d{3}-\d{4})/ and /[Xx]\d{3,5}/
        on between 1 and 5 tokens in D.text as num
from Document D;

Beispiel 4: Unsachgemäßer Gebrauch der Gruppierungsspezifikation

Der reguläre Ausdruck in diesem Codebeispiel enthält weder group -1 noch group 3000. Dies führt zu einem Kompilierungsfehler.

create view ErrorExample as
    extract regex /(\d+)/
    on D.text
    return group -1 as wrongGroup and
          group 3000 as nonExistentGroup
from Document D;

Wörterbücher

Verwenden Sie die Extraktionsspezifikation 'dictionary', um Zeichenfolgen aus Eingabetext zu extrahieren, die in einem Wörterverzeichnis von Zeichenfolgen enthalten sind.

Syntax

    dictionar[y|ies]
        '<dictionary>'
        [and '<dictionary>' and ... and '<dictionary>']
        [with flags '<flags string>']

Beschreibung

  • '<dictionary\>'

    Referenziert ein Wörterverzeichnis, das erstellt wird, indem entweder die Anweisung create dictionary, die Anweisung create external dictionary oder eine Wörterverzeichnisdatei im Dateisystem verwendet wird.

  • [and '<dictionary\>' and ... and '<dictionary\>']

    Referenziert zusätzliche Wörterverzeichnisse, die für die Extraktion verwendet werden sollen.

  • [with flags'<flags string\>']

    Steuert den Wörterverzeichnisabgleich. Derzeit werden zwei Optionen unterstützt:

    • Exakt

      Liefert exakte Übereinstimmungen unter Berücksichtigung der Groß-/Kleinschreibung.

    • IgnoreCase

      Liefert Übereinstimmungen ohne Berücksichtigung der Groß-/Kleinschreibung.

Wenn kein Flag angegeben wird, erfolgt der Abgleich auf der Basis der Flags, die bei der Erstellung des Wörterverzeichnisses angegeben wurden. Wird bei der Erstellung kein Flag angegeben, wird für den Abgleich das Flag IgnoreCase verwendet.

Hinweise zur Verwendung

  • Wörterverzeichnisse werden stets an den Tokengrenzen ausgewertet. Ein Wörterverzeichniseintrag stimmt mit einer Textregion überein, wenn das erste Token des Eintrags mit dem ersten Token der Textregion übereinstimmt, das zweite Token des Eintrags mit dem zweiten Token der Textregion und so weiter. Zeichen zwischen zwei aufeinanderfolgenden Tokens werden ignoriert.

    Angenommen, Sie verwenden ein einfaches, auf Leerzeichen basierendes Modell zur Zerlegung in Tokens, das für eine Sprache wie Englisch geeignet ist. Außerdem wird davon ausgegangen, dass der Eingabetext “Let’s go fishing!” lautet Wenn ein Wörterverzeichnis mit dem Eintrag go fish vorhanden ist, gibt es im Text keine Übereinstimmung für Let's go fishing!. Wenn das Wörterverzeichnis jedoch aus dem Eintrag go fishing besteht (beachten Sie die zwei Leerzeichen zwischen 'go' und 'fishing'), gibt es eine Übereinstimmung im Text Let's go fishing!. Das Leerzeichen gibt an, dass go und fishing zwei unterschiedliche Tokens sind. Wenn ein oder mehr Leerzeichen zwischen den beiden Tokens go und fishing im Eingabetext enthalten sind, gibt es eine Übereinstimmung.

    Für jede Übereinstimmung eines Wörterverzeichniseintrags mit dem Eingabetext generiert die Anweisung extract dictionary ein Ausgabetupel.

Beispiele

Beispiel 1: Begriffe aus Wörterverzeichnisdateien extrahieren

Sie können nach Namen von Personen suchen, indem Sie Wörterverzeichnisdateien mit gängigen Vor- und Nachnamen und einen Abgleich mit Berücksichtigung der Groß-/Kleinschreibung verwenden.

create view Name as
  extract
    dictionaries
        'first.dict'
        and 'last.dict'
    with flags 'Exact'
        on D.text
        as name
from Document D;

Beispielinhalt von last.dict:

#Dictionary for surnames
Anthony
Aparicio
Cate
Lehmann
Radcliff

Beispielinhalt von first.dict:

#Dictionary for given names
Aaron
Candra
Freeman
Mathew
Matthew
Zoraida

Hinweis:

  • Ein Wörterverzeichnisdateisystem, das in einer Anweisung extract dictionary direkt referenziert wird, kann nicht explizit mit einer Gruppe von Sprachen konfiguriert werden, sodass die Wörterbücher während der Laufzeit kompiliert und angewendet werden. Stattdessen werden die Sprachen mit der Anweisung set default dictionary language angegeben, wenn das Modul diese Anweisung enthält.

    Daher wird die direkte Referenzierung von Wörterverzeichnisdateien in einer Anweisung extract dictionary nicht empfohlen. Möglicherweise wird sie in Zukunft nicht mehr unterstützt. Die bevorzugte Praxis besteht darin, ein Wörterverzeichnisobjekt explizit mit der Anweisung create dictionary from file zu definieren und dieses Wörterverzeichnis anschließend in der Anweisung 'extract' zu verwenden.

  • Der Compiler und die Laufzeitkomponente suchen nach den in AQLs referenzierten Wörterverzeichnisdateien im konfigurierten Suchpfad.

Beispiel 2: Begriff aus einem Inline-Wörterverzeichnis extrahieren

Sie können nach Konjunktionen suchen, indem Sie ein Inline-Wörterverzeichnis und den Standardabgleich ohne Berücksichtigung der Groß-/Kleinschreibung verwenden.

create dictionary ConjunctionDict as
  (
    'and', 'or', 'but', 'yet'
  );

create view Conjunction as
  extract
    dictionary 'ConjunctionDict'
        on D.text
        as name
from Document D;

Aufteilungen

Verwenden Sie die Extraktionsspezifikation 'split', um einen größeren Span in mehrere kleinere Spans aufzuteilen.

Syntax

split using <name>.<split point column>
    [retain [right|left|both] split point[s]]
    on <name>.<column to split>
    as <output name>

Beschreibung

Extraktionsspezifikation 'split' verwendet zwei Argumente:

  • Eine Spalte, die längere Spans mit Zieltext enthält.
  • Eine Spalte, die Aufteilungspunkte enthält.

Der Aufteilungsalgorithmus wird in zwei Durchgängen auf die Eingabeansicht angewendet. Der erste Durchgang gruppiert alle Eingabetupel anhand der Zielspalte. Der zweite Durchlauf geht die Tupel jeder Gruppe durch und teilt die Zielspalte mit jedem Wert der Aufteilungsspalte.

  • <name\>.<split point column\>

    Gibt die Aufteilungspunkte für die Extraktion an.

  • [retain [right|left|both] split point[s]]

    Gibt an, wie der linke und der rechte Endpunkt der einzelnen Ergebnisse behandelt werden sollen. Dieses Argument ist optional.

    • Wenn retain left split point angegeben wird, enthält jeder Ausgabespan auch den Aufteilungspunkt auf der linken Seite, sofern ein solcher Aufteilungspunkt vorhanden ist.
    • Wenn retain right split point angegeben wird, sorgt das System dafür, dass jeder Ausgabespan den Aufteilungspunkt auf der rechten Seite enthält.
    • Die Aufteilungsextraktion akzeptiert auch Nullwerte als Aufteilungspunkte. Für jeden solchen Wert gibt die Extraktion ein Tupel zurück, das den gesamten Eingabespan enthält.
  • <name\>.<column to split\>

    Gibt die Zielspalte für die Extraktion an.

  • <output name\>

    Definiert den Namen der Ausgabe der Extraktion.

Beispiele

Beispiel 1: Aufteilungspunkte und die Klausel retain

Wenn die Aufteilungspunkte alle Instanzen des Wortes 'fish' in der Wortfolge 'fish are swimming in the fish pond' sind, haben die verschiedenen Versionen der Klausel retain die folgenden Auswirkungen:

  • retain clause omitted

    " are swimming in the " and " pond"

  • retain right split point

    " are swimming in the fish" and " pond"

  • retain left split point

    "fish are swimming in the " and "fish pond"

  • retain both split points

    "fish are swimming in the fish" and "fish pond"

Beispiel 2: Aufteilungsextraktion

In diesem Beispiel wird das Dokument in Sätze aufgeteilt. Zuerst wird ein regulärer Ausdruck verwendet, um Satzgrenzen zu identifizieren. Anschließend wird die Spezifikation für die Aufteilung der Extraktion verwendet, um den Dokumenttext an Satzgrenzen zu teilen.

create dictionary AbbreviationsDict as
  (
  'Cmdr.',
  'Col.',
  'DR.',
  'Mr.',
  'Miss.');

create view Sentences as
  extract
    split using B.boundary
        retain right split point
        on B.text
        as sentence
  from (
    extract
        D.text as text,
        regex /(([\.\?!]+\s)|(\n\s*\n))/
        on D.text as boundary
        from Document D
    -- Filter the candidate boundaries.
      having Not(ContainsDict('AbbreviationsDict',
            CombineSpans(LeftContextTok(boundary, 1), boundary)))
      ) B;

Blöcke

Verwenden Sie die Extraktionsspezifikation 'blocks', um Blöcke von zusammenhängenden Spans im Eingabetext zu identifizieren.

Syntax

blocks
    with count [between <min\> and] <max\>
    and separation [between 0 and] <max\> (tokens| characters)
    on <name\>.<column containing spans\>
    as <output name\>

Beschreibung

  • with count [between<min\> and] <max\>

    Gibt an, wie viele Spans einen Block bilden können. Die Werte für <min\> und <max\> geben die minimale und maximale Anzahl von Bereichen an, die einen Block bilden können.

  • [between 0 and] <max\>

    Gibt den Trennungsabstand an, der zwischen Spans zulässig ist, bevor sie nicht mehr als zusammenhängend betrachtet werden.

  • (tokens| characters)

    Gibt an, ob der Trennungsabstand des Spans die Anzahl der Tokens oder die Anzahl der Zeichen darstellt.

  • <name\>.<column containing spans\>

    Der Ansichtsname und der Spaltenname, auf den der Operator 'block' angewendet werden soll.

  • <output name\>

    Gibt einen Namen für die Ausgabe des Operators 'block' an.

Hinweise zur Verwendung

  • Wenn sich in den Eingabespans mehrere überlappende Blöcke befinden, gibt eine Extraktionsanweisung 'block' alle möglichen Blöcke zurück. Verwenden Sie die Konsolidierung, um redundante Blöcke herauszufiltern.
  • Eine Anweisung extract mit der Extraktionsspezifikation 'block' ergibt Blöcke, die jeweils aus einer Aggregation von Werten eines bestimmten Felds aus mehreren Eingabetupeln bestehen. Daher kann die Auswahlliste nicht Felder aus der Eingabeansicht enthalten.

Beispiele

Beispiel 1: Blöcke von Wörtern in einem Zeichenbereich extrahieren

Im folgenden Code identifiziert die Ansicht TwoToThreeCapitalizedWords Blöcke von zwei bis drei großgeschriebenen Wörtern mit einem Abstand von bis zu 100 Zeichen.

create view CapitalizedWords as
  extract
    regex /[A-Z][a-z]*/
        with flags 'CANON_EQ'
        on 1 token in D.text
        as word
from Document D;

create view TwoToThreeCapitalizedWords as
  extract blocks
    with count between 2 and 3
    and separation between 0 and 100 characters
    on CW.word as capswords
from CapitalizedWords CW;

Beispiel 2: Blöcke von Wörtern in einem Tokenbereich extrahieren

Der folgende Code identifiziert Blöcke von genau zwei großgeschriebenen Wörtern mit einem Abstand von bis zu fünf Tokens.

create view TwoCapitalizedWords as
extract blocks
    with count 2
    and separation between 0 and 5 tokens
    on CW.word as capswords
from CapitalizedWords CW;

Wortart

Verwenden Sie die Extraktionsspezifikation 'part of speech', um verschiedene Wortarten im Eingabetext zu identifizieren.

Syntax

part_of_speech
 '<part of speech spec>'
 [and '<part of speech spec>']*
 [with language '<language code>']
 [and mapping from <mapping table name>]
 on <input column> as <output column\>
 from <input view>

Beschreibung

  • '<part of speech spec\>'

    Gibt die Wortarten an, die aus dem Eingabetext extrahiert werden sollen. '<part of speech spec\>' ist eine der folgenden Zeichenfolgen:

    • Eine Zeichenfolge, die eine Liste mit durch Kommas getrennten Wortarttags enthält, die vom Multilingual Tokenizer generiert werden
    • Eine Kombination aus einem internen Wortartnamen und Flags (durch eine Zuordnungstabelle definiert)
  • [and '<part of speech spec\>']*

    Gibt die zusätzlichen Tags für Wortarten für die Extraktion an.

  • [with language '<language code\>']

    Gibt die Sprache an, die in der Extraktion verwendet werden soll. <language code\> ist ein zweistelliger Sprachencode in Kleinbuchstaben, z. B. 'en' oder' ja '. Wenn dieses Argument ausgelassen wird, wird als Sprache für die Wortartextraktion Englisch angenommen.

  • [and mapping from <mapping table name\>]

    Gibt den Namen einer AQL-Tabelle an, die unaufbereitete Wortarttags - wie z. B. "NOUN" - Kombinationen von übergeordneten Wortarten und Flags zuordnet. Während die optionale Zuordnungstabelle Variablennamen haben kann, muss Zuordnungstabelle für Wortarten die folgenden Spaltennamen enthalten:

    • Tag

      Die Spalte, die einen Wortarttag für den Multilingual Tokenizer enthält.

    • basetag

      Die Spalte, die den entsprechenden internen Tag enthält.

    • flagstr

      Die Spalte, die Liste von durch Kommas getrennten Flags enthält, die der angegebenen Wortart zugeordnet sind.

    Die Zuordnungstabelle muss mit der Anweisung create table in demselben Modul wie die extract-Anweisung part_of_speech, die sie verwendet, definiert werden. Dabei kann es sich nicht um eine importierte Tabelle und auch nicht um eine externe Tabelle handeln.

    create table POSMapping_EN(tag Text, basetag Text, flagstr Text)
    as values
     ('CCONJ','CONJ','coordinating'),
     ('SCONJ','CONJ','subordinating');
    
  • <input column\>

    Gibt die Spalte der Eingabeansicht an, aus der die Wortartinformation extrahiert werden soll.

  • <output column\>

    Gibt den Namen der Spalte an, an die die Spans der Tokens mit den angegebenen Wortarten gesendet werden.

  • <input view\>

    Gibt die Eingabeansicht an, aus der die Wortartinformation extrahiert werden soll.

Hinweise zur Verwendung

  • Die Wortartextraktion funktioniert nur, wenn der Multilingual Tokenizer verwendet wird. Wenn das System den Standardtokenizer verwendet, generiert eine part_of_speech-Extraktion einen Fehler.

Wortarttags für Sprachen

Für alle unterstützten Sprachen verwendet der Multilingual Tokenizer die in der folgenden Tabelle aufgeführten Wortarttags.

Tag Beschreibungen
ADJ Adjektiv
ADP Adposition
ADV Adverb
AUX Hilfsverb
CCONJ Nebenordnende Konjunktion
DET Determinator
INTJ Interjektion
NOUN Nomen
NUM Numeral
PART Partikel
PRON Pronomen
PROPN Eigenname
PUNCT Interpunktion
SCONJ Unterordnende Konjunktion
SYM Symbol
VERB Verb
X andere

Beispiele

Beispiel 1: Verwendung eines Wortarttags direkt in einer Anweisung 'extract'

Die Ansicht EnglishNoun extrahiert englische Nomen (Singular oder Mehrzahl) oder Eigennamen (Singular).

create view EnglishNoun
as extract parts_of_speech 'NOUN' and 'PROPN'
with language 'en' on D.text
as noun from Document D;

Sequenzmuster

Verwenden Sie die Extraktionsspezifikation 'pattern', um einen Musterabgleich für ein Eingabedokument und andere Spans, die aus dem Eingabedokument extrahiert wurden, auszuführen.

Syntax

Die allgemeine Syntax eines Sequenzmusters besteht darin, zunächst das Muster anzugeben, für das eine Übereinstimmung im Text gesucht wird, und anschließend anzugeben, was vom Extraktor zurückgegeben werden soll. Der letzte Teil des Sequenzmusters gibt an, was die Eingabe für das Muster ist. Dabei kann es sich um eine Spalte aus einer zuvor definierten Ansicht handeln oder auch um den gesamten Dokumenttext.

pattern <pattern specification> [return clause] [with inline_match on <viewname.colname>]

Beschreibung

  • <pattern specification\>

    Ein <pattern specification\> besteht aus mehreren Atomen. Ein einzelnes Atom kann eine Spalte aus einer bereits definierten Ansicht, eine feste Zeichenfolge oder ein regulärer Ausdruck sein. Sie können angeben, dass die Atoms optional sein oder sich wiederholen sollen und Sie können Tokenabstände zwischen Atoms angeben.

    Die Musterspezifikation ist Teil einer größeren AQL-Anweisung, die eine Extraktionsklausel enthält.

    Hier ist ein einfaches Beispiel dafür, wie Sie eine Ansicht erstellen können, die drei benachbarte Übereinstimmungen aus zuvor definierten Ansichten enthält. In diesem Beispiel wird die gesamte Kombination zurückgegeben. Dabei bezieht sich group 0 auf:

    create view Money as
    extract pattern <C.match> <N.match> <Q.match>
    return group 0 as  match
    from Currency C, Number N, Quantifier Q;
    

    Wenn Ihre Atoms nicht direkt benachbart sein müssen, können Sie zwischen den Atoms Tokenabstände verwenden, um weitere Übereinstimmungen zu ermöglichen. In diesem Beispiel werden Erwähnungen von Personen gefunden, die sich in der Nähe von Telefonnummern mit einem Abstand von 0 bis 2 Tokens befinden. Beachten Sie das Konstrukt <Token>{0,2}, das angibt, dass eine Lücke von 0 bis 2 Tokens zwischen der Person und Telefonanmerkungen zulässig ist.

    create view Phone as
    extract regex /(\d{3})-(\d{3}-\d{4})/
      on between 4 and 5 tokens in D.text
      return
       group 1 as areaCode
       and group 2 as restOfNumber
       and group 0 as fullNumber
    from Document D;
    create view PersonPhone as
    extract
      pattern (<P.name>) <Token>{0,2} (<Ph.fullNumber>)
      return group 0 as match
       and group 1 as person
       and group 2 as phone
    from Person P, Phone Ph;
    

    Für Konstrukte für den Tokenabstand gibt es die Einschränkung, dass sie in Sequenzausdrücken auftreten müssen. Darüber hinaus muss jedem Tokenabstand in einer Sequenz ein Ausdruck ohne Tokenabstand vorausgehen und nachfolgen. Als Folge verursachen extract pattern-Anweisungen Ausnahmebedingungen:

    -> pattern consisting only of a token gap is an error
    extract pattern <Token> as match from ...
    -> pattern beginning with a token gap is an error
    extract pattern <Token> {0,2} <Ph.phone> as match from ...
    -> pattern ending with a token gap is an error
    extract pattern <P.name> <Token> ?  as match from ...
    -> group consisting only of a token gap is an error
    extract pattern <P.name> (<Token>)  <Ph.phone> as match from ...
    

    Verwenden Sie die Syntax (min,max), um anzugeben, wie häufig sich jedes Atom wiederholt. Sie haben außerdem die Möglichkeit, die Syntax ? zu verwenden, um anzugeben, dass ein Atom oder ein sich wiederholendes Atom optional ist. Atoms werden mit den Angaben für Wiederholung und Optionalität kombiniert, um Sequenzen zu erstellen.

    Es folgt ein komplexeres Beispiel, das zeigt, wie Elemente wiederholt werden. Suchen Sie nach möglichen Hotelnamen, indem Sie Vorkommen von einem bis drei großgeschriebenen Wörtern angeben, gefolgt von einem Token 'Hotel' oder 'hotel'.

    create view CapsWord as
    
    extract
        regex /[A-Z][a-z]*/
           on 1 token in D.text
           as word
    from Document D;
    
    create view HotelCandidate as
    extract
      pattern <CW.word>{1,3} /[Hh]otel/ as hotelname
    from CapsWord CW;
    

    Sie können auch den Operator | verwenden, um eine Auswahl zwischen Atomen anzugeben, wie in extract pattern <A.match>| <B.match> <C.match> as match from Apple A, Bacon B, Chocolate C;. Dieses Muster kann als 'Übereinstimmung entweder mit A.match ODER einer Sequenz B.match gefolgt von C.match erläutert' werden. Ein vollständiges Beispiel, das den Operator | verwendet, finden Sie in Beispiel 1.

    Nachdem Sie Ihr Muster erstellt haben, erstellt jede Übereinstimmung mit Ihrem <pattern specification> ein Ausgabeergebnis entsprechend der Rückgabeklausel der Musterspezifikation sowie der optionalen <select list> am Anfang der Anweisung extract. Die Ergebnisse werden gefiltert und konsolidiert entsprechend den Klauseln having, consolidate und limit der Anweisung extract. Wenn z. B. mehrere sich überlappende Übereinstimmungen für die Musterspezifikation vorhanden sind, werden alle möglichen Übereinstimmungen zurückgegeben und Sie können eine Klausel consolidation verwenden, um redundante Ausgaben herauszufiltern.

    Im folgenden Beispiel ist es nun das Ziel, Übereinstimmungen zu entfernen, die das Wort 'Sheraton' enthalten, und die daraus resultierenden Übereinstimmungen zu konsolidieren, indem die Elemente entfernt werden, die in einer größeren Übereinstimmung enthalten sind. Beispielsweise sollen “Best Garden Hotel” und auch “Garden Hotel” nicht in demselben Textspan gefunden werden.

    create view HotelCandidate as
    extract
      pattern <CW.word>{1,3} /[Hh]otel/ as hotelname
    from CapsWord CW
    having Not(ContainsRegex(/.*Sheraton.*/,hotelname))
    consolidate on hotelname using 'ContainedWithin';
    

Nachdem Sie nun mit der Syntax und einigen Beispielen vertraut sind, wird in diesem Diagramm die vollständige Syntax für die Musterspezifikation beschrieben. Sehen Sie sich diese vollständige Syntax an, wenn Sie mit dem Erstellen von Mustern beginnen, um zu erfahren, wie Sie das Muster strukturieren müssen, das Sie erstellen möchten.

Wenn Sie mit den zeichenbasierten regulären Ausdrücken von POSIX vertraut sind, werden Sie erkennen, dass die Syntax ähnlich ist. In diesem Fall lässt die Syntax Leerzeichen zwischen den Elementen zu. Außerdem ist definiert, als was ein Element fungieren kann, um die AQL-Zwecke zu erfüllen. Beachten Sie, dass der Begriff Alternation in diesem Fall die Bedeutung 'Auswahl' hat. Ein vertikaler Strich zwischen Elementen gibt an, dass es eine Auswahl gibt, die unter Verwendung von ( ) gruppiert werden kann.

Pattern   -> Alternation
Alternation  -> Sequence | Sequence | ... | Sequence
Sequence   -> Optional Optional ... Optional
Optional   -> Repeat | Repeat ? Repeat     -> Atom | Atom { min, max }
Atom     -> <view_name.column_name>
     'string'
   <'string' [match parameters]>
     /regex/
     <Token>
     Group
Group -> ( Pattern )

Ein Atom kann sechs Formate haben:

  • <view_name.column_name\>

    Gibt eine Spalte aus einer der Ansichten, Tabellen oder Tabellenfunktionsreferenzen an, die in der 'from'-Liste der Anweisung extract pattern aufgeführt sind.

  • 'Zeichenfolge'

    Gibt eine Übereinstimmung mit der angegebenen Zeichenfolge an. Dabei wird die Semantik für den AQL-Standardwörterverzeichnisabgleich verwendet.

  • <'string' [match parameters]\>

    Gibt eine Übereinstimmung mit der angegebenen Zeichenfolge an. Dabei wird die Semantik für den Wörterverzeichnisabgleich verwendet, die durch [match parameters] angegeben wird. Das Format von [match parameters] ist je nach Einstellung 'case (exact | insensitive)'. Dieses Format gibt den Typ der Umsetzung der Groß-/Kleinschreibung an, der beim Abgleich von Zeichenfolgen verwendet wird. Um eine Übereinstimmung anzugeben, die über exakt dieselbe Groß-/Kleinschreibung verfügt, wählen Sie 'exact' aus. Um eine Übereinstimmung anzugeben, bei der die Groß-/Kleinschreibung nicht berücksichtigt werden soll, wählen Sie 'insensitive' aus.

  • /regex/

    Gibt einen zeichenbasierten regulären Ausdruck an, bei dem der Abgleich auf ein einzelnes Token im Dokumenttext beschränkt wird. Darüber hinaus ermöglicht es die Syntax, ein spezielles Konstrukt für den Tokenabstand in einem Sequenzausdruck anzugeben, um eine Übereinstimmung zwischen einer Mindest- und Höchstzahl (min und max) von Tokens anzugeben.

  • <token\>

    Übereinstimmung mit einem beliebigen Token.

  • [return clause]

    Generiert extrahierte Werte für jede Übereinstimmung mit dem Musterausdruck entsprechend der Rückgabeklausel. Die Klausel return hat dieselbe Semantik wie die Klausel return in einer Anweisung extract regex.

  • [with inline_match on <viewname.colname\>]

    Für Atoms wie 'string' und 'regex' bestimmt die Klausel with inline_match, welches Textobjekt das System für die 'string'- oder 'regex'-Extraktion verwendet. Beispiel: Wenn die Klausel with inline_match on Email.subject lautet, werden alle Wörterverzeichnisse und regulären Ausdrücke, die in der Musterspezifikation inline definiert sind, auf das Subjektfeld der Ansicht Email angewendet. Wenn with inline_match nicht vorhanden ist, wird die Extraktion von Zeichenfolgen und regulären Ausdrücken standardmäßig für das gesamte Dokument (Document.text) ausgeführt. In diesem Fall muss der Anzeigename der Name einer Ansicht oder einer Tabelle sein, die im aktuellen Modul definiert ist, oder aus einem anderen Modul importiert wurde; Verweise auf Tabellenfunktionen sind in der Klausel 'with inline_match' nicht zulässig.

  • [with language as <language code(s)\>]

    Gibt eine Liste mit durch Kommas getrennten Sprachencodes mit zwei Buchstaben - z. B. en (Englisch) oder zh (Chinesisch) - für die Sprachen an, für die die Zeichenfolge ausgewertet werden soll. Es gibt keine Übereinstimmung für Dokumente, deren Sprachencode nicht in dieser Zeichenfolge enthalten ist. Wenn der Sprachparameter nicht angegeben wird, wird für die Auswertung standardmäßig eine der folgenden Sprachgruppen verwendet:

    • Die Sprachgruppen (falls deklariert), die durch die Anweisung 'set default language' im enthaltenden Modul angegeben sind.
    • Die Sprachgruppen, die Deutsch (de), Spanisch (es), Englisch (en), Französisch (fr), Italienisch (it) und die nicht angegebene Sprache (x_unspecified) enthalten.

Hinweise zur Verwendung

  • Die Semantik einer Anweisung extract pattern wird durch die Musterspezifikation gesteuert. Jede Übereinstimmung erstellt ein Ausgabeergebnis gemäß der Rückgabeklausel der Musterspezifikation sowie der Auswahlliste zu Beginn der Anweisung extract. Die Ergebnisse werden gefiltert und konsolidiert entsprechend den Klauseln having, consolidate und limit der Anweisung 'extract'. Wenn mehrere sich überlappende Übereinstimmungen für die Musterspezifikation vorhanden sind, gibt eine Musterspezifikation alle möglichen Übereinstimmungen aus. Verwenden Sie die Konsolidierung, um redundante Ausgaben zu filtern.

  • Die Semantik der Klausel from einer Anweisung extract pattern unterscheidet sich von anderen Formen von extract-Anweisungen, die nicht über eine Musterspezifikation verfügen. Die allgemeine Semantik einer Anweisung extract erfordert, dass die Extraktionsspezifikation für jede Kombination der in <from list\> definierten Sichten ausgewertet wird. Wenn mindestens eine der Ansichten in <from list\> keine Ergebnisse für ein bestimmtes Dokument enthält, ist die Ausgabe der Extraktionsanweisung leer, da die Gruppe aller Kombinationen von Ergebnissen in den Eingabeansichten leer ist. Im speziellen Fall von 'extract pattern'-Anweisungen ist die Klausel 'from' ein Platzhalter, der die Namen der Beziehungen deklariert, die an der Musterspezifikation beteiligt sind. Die Semantik der Anweisung wird nur durch die Musterspezifikation gesteuert. Insbesondere kann die Ausgabe der Anweisung dann 'nicht leer' sein, wenn manche der Eingabeansichten leer sind.

  • Eine Anweisung extract, die die Sequenzmusterextraktion verwendet, kann die Spalten jeder Ansicht in der Liste from übertragen, jedoch nur, wenn der Ansichtsname nicht in einem Wiederholungselement der Musterspezifikation erscheint. Beispielsweise führt die Anweisung CapsWordOneToThree zu einem Kompilierungsfehler. Der Fehler tritt auf, da die Weiterleitungsspalte CW.type am Anfang der Anweisung extract zum Ansichtsnamen CW gehört, der sich im Wiederholungselement <CW.word>{1,3} der Musterspezifikation befindet.

    create view CapsWord as
    extract 'UpperCase' as type,
        regex /[A-Z].*/ on 1 token in D.text as word
    from Document D;
    
    ---> This results in and error due to the repeating element CW.word
    create view CapsWordOneToThree as
    extract CW.type as type,
        pattern <CW.word>{1,3} as match
    from CapsWord CW;
    
    output view CapsWordOneToThree;
    

    Für Spalten, die von Ansichtsnamen übertragen werden, die in alternativen oder optionalen Elementen der Musterspezifikation enthalten sind, ist der Wert der Ausgabespalte null, wenn die entsprechende Alternative oder das optionale Element nicht im Text enthalten ist. Ein Beispiel, das diesen Punkt veranschaulicht, befindet sich in der Ansicht Person in Beispiel 1.

  • Gruppen, die unter einem Wiederholungselement auftreten, können nicht in der Klausel return der Anweisung ausgegeben werden. Zum Beispiel verursacht die folgende Anweisung eine Ausnahmebedingung:

    create view CapsWordOneToThree as
      extract
             pattern (<CW.word>){1,3}
            return group 0 as fullmatch
                   and group 1 as word   -- not allowed due to repeat
      from CapsWord CW;
    

Beispiele

Beispiel 1: Sequenzmuster mit Erfassungsgruppen

Das Ziel dieses Beispiels besteht darin, bestimmte Personennamen zu finden - und zwar durch Identifizieren von Vorkommen eines Vornamens, optional gefolgt von einer Mittelinitiale, gefolgt von einem Nachnamen und der gesamten Übereinstimmung, der optional eine gängige Anrede vorangestellt sein kann. Darüber hinaus gibt der Extraktor die gesamte Übereinstimmung als Referenz zurück - die erste Gruppe als Anrede und die zweite Gruppe als Name - und die Werte des Vornamens, der Mittelinitiale und des Nachnamens aus den jeweiligen Eingabeansichten übertragen.

create view MiddleInitial as
extract regex /\b([\p{Lu}\p{M}*]\.\s*){1,5}\b/
            on between 1 and 10 tokens in D.text as initial
from Document D;

create view Person as
extract F.first as first,
        M.initial as middle,
        L.last as last,
        pattern ('Mr.'|'Ms.'|'Miss')? (<F.first> <M.initial>? <L.last>)
return group 0 as reference
  and group 1 as salutation
  and group 2 as name
from FirstName F, MiddleInitial M, LastName L;

Da der untergeordnete Musterausdruck ('Mr.'|'Ms.'|'Miss')? optional ist, hat die Ausgabespalte für die Anrede den Wert null, wenn keine Anrede im Text enthalten ist. Da der Musterunterausdruck <M.initial>? optional ist, ist der Wert der Ausgabespaltenmitte null, wenn keine mittlere Initiale vorhanden ist.

Beispiel 2: Sequenzmuster mit Zeichenfolgeabgleich und Abgleichsparametern

Das Ziel dieses Beispiels ist es, Vorkommen von Besprechungsnotizen für bekannte Projekte zu finden, indem Sie die Titelanmerkungen des Dokuments untersuchen. Beachten Sie die Klausel with inline_match, in der angegeben wird, dass der Zeichenfolgeabgleich über das Abgleichsfeld der Ansicht Title und nicht über den gesamten Dokumenttext erfolgt.

create view Project as
extract
regex /[Pp]roject\s?\w*/ on D.text as name
from Document D;


create view Title as
extract regex /[A-z][a-z]+.*/
on between 1 and 20 tokens in D.text as match
from Document D;


create view MeetingNote as
extract
pattern <'Meeting Notes:'[with case exact]> (<P.name>)
return group 0 as match
  and group 1 as projectname
with inline_match on Title.match
from Project P;

Beispiel 3: Sequenzmuster, das nicht leere Ergebnisse auch dann liefert, wenn eine Eingabeansicht leer ist

Die folgende Anweisung generiert Ergebnisse, selbst wenn die Eingabeansicht 'LastName' leer ist. Der zweite Teil der Musterspezifikation, <L.name\>?, enthält ein optionales Element. Die Semantik der Musterspezifikation ist so konzipiert, dass alle Spans ausgegeben werden, die sich aus einem Span FirstName.name oder FirstName.name zusammensetzen, dem unmittelbar ein Span LastName.name folgt. Aus diesem Grund besteht das Ergebnis der Anweisung bei Dokumenten, für die die Ansicht 'LastName' leer ist, aus allen Spans, die einen einzelnen Span FirstName.name umfassen, der aus diesem Dokument identifiziert wird.

create dictionary FirstNamesDict as
(
  'Aaron', 'Matthew', 'Peter'
);
create dictionary LastNamesDict as
(
  'Anthony', 'Lehman', 'Radcliff'
);

create view LastName as
  extract dictionary 'LastNamesDict'
  on D.text as last
from Document D
having MatchesRegex(/((\p{L}\p{M}*)+\s+)?\p{Lu}\p{M}*.{1,20}/, last);

create view FirstName as
  extract dictionary 'FirstNamesDict'
  on D.text as first
from Document D
having MatchesRegex(/\p{Lu}\p{M}*.{1,20}/, first);

create view PersonName as
extract pattern <F.first> <L.last>? as fullName
from FirstName F, LastName L;

Anweisung select

Die Anweisung select in AQL stellt ein leistungsfähiges Verfahren für die Verwendung verschiedener Spezifikationen zum Erstellen und Kombinieren von Tupelmengen bereit.

Syntax

Die Struktur einer Anweisung select ähnelt der einer SQL-Anweisung SELECT:

select `<select list>`
  from `<from list>`
  [where `<where clause>`]
  [consolidate on `<column>`
     [using '`<policy>`' [with priority
         from `<column> ` [priority order]]]]
  [group by `<group by list>`]
  [order by `<order by list>`]
  [limit `<maximum number of output tuples for each document>`];

Beschreibung

  • <select list\>

    Ein durch Kommas begrenzte Liste mit Ausgabeausdrücken.

  • <from list\>

    Eine durch Kommas begrenzte Liste, die die Quelle der auszuwählenden Tupel ist.

  • [where <where clause\>]

    Definiert ein Vergleichselement, das für jedes Tupel angewendet werden soll, das aus dem kartesischen Produkt aller Tupel in den Beziehungen in der Klausel from generiert wird. Diese Klausel ist optional.

  • [consolidate on<column\>[using '<policy\>' [with priority from <column\> priority order]]]

    Definiert eine Konsolidierungsrichtlinie zum Verwalten überlappender Spans. Diese Klausel ist optional.

  • [group by<group by list\>]

    Gruppiert die Tupel, die aus demselben Dokument erzeugt werden, anhand gemeinsamer Werte eines angegebenen Felds. Diese Klausel ist optional.

  • [order by<order by list\>]

    Ordnet die Ausgabetupel, die durch die Anweisung select aus jedem Dokument erzeugt werden. Die Reihenfolge basiert auf den Werten der 'order by'-Liste, einer Liste von durch Kommas getrennten Ausdrücken. Diese Klausel ist optional.

  • [limit <maximum number of output tuples for each document\>]

    Begrenzt die Anzahl der Ausgabetupel für jedes Dokument auf den angegebenen Maximalwert. Diese Klausel ist optional.

Verwendung Anmerkungen

Die Semantik der Anweisung select lautet wie folgt:

  • Bestimmen Sie die Eingabedaten (in Tupeln), indem Sie das kartesische Produkt der Beziehungen in der 'from'-Liste bilden.
  • Filtern Sie jedes generierte Eingabetupel, indem Sie die Vergleichselemente in der (optionalen) Klausel where anwenden.
  • Wenn die optionale Klausel group by vorhanden ist, gruppieren Sie die Tupel, die aus demselben Dokument generiert wurden, nach den Werten, die in der 'group by'-Liste angegeben sind, und berechnen Sie das Ergebnis der aggregate-Funktionen in der Auswahlliste.
  • Konsolidieren Sie alle überlappenden Tupel gemäß der Richtlinie, die in der (optionalen) Klausel consolidation definiert sind. Wenn die optionale Klausel order by vorhanden ist, ordnen Sie diese Tupel nach den Werten der 'order by'-Liste.
  • Berechnen Sie alle Ausdrücke in der Liste select für jedes Tupel und benennen Sie die Spalten gemäß den Angaben in den Klauseln as um.
  • Wenn die optionale Klausel limit vorhanden ist, begrenzen Sie die Anzahl der Ausgabetupel auf die angegebene Anzahl von Tupeln für jedes Dokument.

Beispiele

Ein Beispiel für die Verwendung der Anweisung select ist das Extrahieren von Telefonnummern, die einem bestimmten Muster entsprechen. Gehen Sie von der Annahme aus, dass die Ansicht PhoneNumbers, die Telefonnummern des Musters XXX-XXX-XXXX für die Vereinigten Staaten extrahiert, bereits definiert ist. Diese Anweisung select wertet den regulären Ausdruck für das Muster 444-888-XXXX im Eingabetext aus. Die Ansicht enthält die Ausgabespalten documentText und phoneNumber. Darüber hinaus ist die Ausgabe auf das erste Vorkommen dieses Telefonnummernmusters begrenzt, das für jedes Dokument angegeben wird.

create view PhoneNumbersPattern1 as
select D.documentText, D.phoneNumber
from PhoneNumbers D
where MatchesRegex(/444-888-\d{4}/,D.phoneNumber)
limit 1;

Ein weiteres Beispiel dafür, wie Sie die Anweisung select verwenden können, ist die Suche nach ungefähren Zuordnungen von Personen und ihren entsprechenden Telefonnummern. Nehmen Sie an, dass die Ansicht Person bereits definiert ist und dass sie die Spalten person und die Ansicht PhoneNumbers enthält. Diese Anweisung select wertet die where-Klausel aus, um Textspans zu suchen, in denen eine Person erwähnt wird, gefolgt von einer Telefonnummer innerhalb von 1 bis 3 Wörtern oder Tokens. Die Eingabe für diese Anweisung wird durch eine Verknüpfung der Ansichten Person und PhoneNumbers in der 'from'-Liste dargestellt.

create view PersonPhone as
select P1.documentText, P1.person, P2.phoneNumber, CombineSpans(P1.person,P2.phoneNumber) as personPhoneSpan
from Person P1, PhoneNumbers P2
where FollowsTok(P1.person,P2.phoneNumber,1,3);

Die Spalte personPhoneSpan enthält dann die übereinstimmenden Spans, die die ungefähre Person-Telefon-Zuordnung angeben.

personPhoneSpan
John : 433-999-1000
Martha Mob 433-999-1001
  • 'select'-Liste Die 'select'-Liste in einer AQL-Anweisung select oder extract besteht aus einer durch Kommas begrenzten Liste von Ausgabeausdrücken.
  • 'from'-Liste Der zweite Teil einer Anweisung select oder einer Anweisung extract in AQL ist die 'from'-Liste. Die 'from'-Liste ist eine durch Kommas getrennte Liste. Sie ist die Quelle der Tupel, die ausgewählt oder extrahiert werden können.
  • Klausel 'where' Die optionale Klausel where definiert ein Vergleichselement, das für jedes Tupel angewendet werden soll, das aus dem kartesischen Produkt aller Tupel in den Beziehungen in der Klausel from generiert wird.
  • Klausel 'consolidate on' Die optionale Klausel consolidate on gibt an, wie überlappende Spans über Tupel aufgelöst werden, die von einer Anweisung select oder extract ausgegeben werden. Tupel mit nicht überlappenden Spans sind nicht betroffen, wenn diese Klausel verwendet wird.
  • Klausel 'group by' Die optionale Klausel group by einer Anweisung select weist die Laufzeitkomponente an, Tupel, die aus demselben Dokument erzeugt werden.
  • Klausel 'order by' Die optionale Klausel order by weist die Laufzeitkomponente an, die Ausgabetupel, die von der Anweisung 'select' aus jedem Dokument generiert werden, basierend auf den Werten der 'order by'-Liste zu ordnen, die eine Gruppe von durch Kommas getrennten Ausdrücken ist.
  • Klausel 'limit' Mit der optionalen Klausel limit wird ein Grenzwert für die Anzahl der Ausgabetupel angegeben, die durch die Anweisung 'select' für ein Dokument generiert werden.
  • Anweisung 'select... into' Die Anweisung select ... into ist nützlich, um mit einer einzelnen Anweisung eine Ansicht zu definieren und gleichzeitig anzugeben, dass es sich um eine Ausgabeansicht handelt.

Auswahlliste

Die select-Liste in einer AQL-Anweisung select oder extract besteht aus einer durch Kommas begrenzten Liste von Ausgabeausdrücken.

Syntax

Jeder select-Ausdruck muss eines der folgenden Formate aufweisen:

select
   <viewname>.<colname> as <alias> |
   <viewname>.* |
   <expr> as <alias> |
     case
     when <predfunction1()> then <expr1>
      when <predfunction2()> then <expr2>...
     when <predfunctionn()>
      then <exprn>
     [else <expr\_default>]
      as <name>

Beschreibung

  • <viewname\>.<colname\> as <alias\>

    • <viewname\>

      Gibt die Ansicht an, aus der Spalten ausgewählt werden sollen.

    • <colname\>

      Gibt die Spalte in dieser Ansicht an.

    • <alias\>

      Gibt den Namen an, unter dem das ausgewählte Feld bekannt ist. Dieses Feld ist optional. Es wird ausgewählt, um Teil der einzelnen Ausgabetupel zu werden. Wenn <alias\> nicht angegeben ist, ist der Name der Spalte standardmäßig <colname\>. Kann eine einfache Kennung oder eine Kennung mit doppelten Anführungszeichen sein.

  • <viewname\>.*

    Gibt den Namen der Ansicht an. Diese Syntax gibt an, dass alle Spalten der angegebenen Ansicht auf die einschließende Anweisung select oder extract übertragen werden müssen.

    Wie SQL ermöglicht auch AQL die Kurzform select * dieser Anweisung. Diese Anweisung bewirkt, dass alle Spalten aus allen Eingaben ausgewählt werden, die in der Klausel from der Anweisung select angegeben sind. Die Kurzform extract * für die extract-Anweisung wird jedoch nicht unterstützt.

  • <expr\> as <alias\>

    Stellt die Zuordnung eines Ausdrucks zu einem Attribut der enthaltenden Ansicht dar.

    • <expr\>

      Gibt einen Ausdruck an, der sich aus Skalarfunktionsaufrufen, Aggregatfunktionsaufrufen oder einer Konstanten zusammensetzt.

    • <name\>

      Steht für den Namen der Spalte, die das Ergebnis des Ausdrucks enthält, der von <expr\> als <alias\> angegeben wird Wenn <alias\> nicht angegeben ist, ist der Name der Spalte standardmäßig <name\>. Kann eine einfache Kennung oder eine Kennung mit doppelten Anführungszeichen sein.

  • when<function1()\> then <expr1\> when <function2()\> then <expr2\> ... when <functionN()\> then <exprn\> [else ] <expr_default\> as <name\>

    • <function1()\>, <function2()\>, <functionN()\>

      Skalarfunktionen angeben, die einen booleschen Typ zurückgeben.

    • <expr1\>, <expr2\>, <exprn\>, <expr_default\>

      Ausdrücke angeben, die aus Skalarfunktionsaufrufen zusammengesetzt sind und denselben Typ zurückgeben müssen.

    Wenn das Ergebnis von <function1()\> wahr ist, ist das Ergebnis des Ausdrucks case das Ergebnis von <expr1\> und keine der nachfolgenden Klauseln when werden ausgewertet. Andernfalls werden nachfolgende when-Klauseln (soweit vorhanden) auf dieselbe Art und Weise ausgewertet.

    Wenn keine der Bedingungen der when-Klauseln erfüllt wird, ist das Ergebnis dieses Fallausdrucks das Ergebnis des Standardausdrucks <expr\_default\>. Dieser Ausdruck wird in der optionalen Klausel else angegeben. Wenn die Klausel [else] fehlt, ist das Ergebnis dieses case-Ausdrucks null.

Hinweise zur Verwendung

  • Die folgende Anweisung wird nicht unterstützt:

    select * from Document;
    

    Der Inhalt der Ansicht Document ist möglicherweise im aktuellen Kontext oder Umfang der .aql-Datei nicht vollständig bekannt, in der diese Anweisung select ausgegeben wird. Der Mangel an Information zu den Inhalten liegt daran, dass mehrere Anweisungen require document with columns, die außerhalb der aktuellen .aql-Datei angegeben sind, möglicherweise die Schemadefinition dieser speziellen Ansicht Document ändern können, wenn sie auf der Ebene eines Moduls verwendet wird. Die Anweisungskurzform Document.* ist kein gültiges AQL-Konstrukt.

  • Sie können explizit Felder in der Ansicht Document auswählen. Das folgende Beispiel zeigt eine gültige explizite Auswahl von Feldern aus der Ansicht Document:

    select D.label as label,
      D.text as text
    from Document D;
    

Beispiele

Die folgenden Beispiele veranschaulichen verschiedene Formate der select-Liste.

Beispiel 1: Explizite Wertzuordnung unter Verwendung einer Konstanten

Dieses Beispiel zeigt die Zuordnung eines konstanten Werts zu einem Ansichtsattribut in der Liste 'select'. Das Feld 'polarity' gibt an, ob die Polarität von PS.match positiv oder negativ ist. (Beachten Sie die explizite Zuordnung eines konstanten Werts zu diesem Attribut.)

create view PositiveSentimentsWithPolarity as
select
  'positive' as polarity,
  PS.match as sentiment
from
  PositiveSentiments PS;
create view NegativeSentimentsWithPolarity as
select
  'negative' as polarity,
  NS.match as sentiment
from
  NegativeSentiments NS;

Beispiel 2: Explizite Wertzuordnung unter Verwendung eines Funktionsaufrufs

Das folgende Beispiel veranschaulicht, wie das Ergebnis eines Funktionsaufrufs explizit einem Ansichtsattribut in der Liste 'select' zugeordnet wird.

create view Citizenship as
select
  P.Name as name,
  MatchesDict('USCities.dict', P.birthPlace) as isUSCitizen
from
  Person P;

Beispiel 3: Auswahllistenausdruck aus einer Wörterverzeichnisextraktion

Das folgende Beispiel veranschaulicht, wie der Auswahllistenausdruck Werte des Typs 'Span' aus einem Ergebnis der Wörterverzeichnisextraktion entnehmen kann.

create view PersonNames as
select N.match as name
from
  (extract
  dictionary 'firstNames.dict'
  on D.text
  as match
  from Document D
)N;

Beispiel 4: Beispiele für case-Ausdrücke

In diesem ersten Beispiel wird gezeigt, wie die Behandlung von Nullwerten für bestimmte Felder angegeben werden kann:

create view School as
select
case
when Not(NotNull(P.education)) then 'Unknown'
else GetString(P.education)
as name
from Person P;

In diesem Beispiel wird erläutert, wie Daten klassifiziert werden:

create view Company as
select
PM.name as productname,
case
when ContainsRegex (/IBM/,PM.name) then 'IBM'
when ContainsDict ('OpenSourceDict',PM.name) then 'OSS'
else 'Unknown'
as name
from ProductMatches PM;

from-Liste

Der zweite Teil einer Anweisung select oder einer Anweisung extract in AQL ist die 'from'-Liste. Die 'from'-Liste ist eine durch Kommas getrennte Liste. Sie ist die Quelle der Tupel, die ausgewählt oder extrahiert werden können.

Syntax

from <from list item> <name>  [, <from list item> <name>]

Beschreibung

  • <from list item\>

    Eine Ansicht, eine Tabelle, eine Tabellenfunktionsreferenz oder eine verschachtelte AQL-Anweisung. Alle verschachtelten Anweisungen in AQL müssen in runde Klammern eingeschlossen sein.

  • <name\>

    Der lokale Name von <from list item\>, der in der Anweisung select oder in der Anweisung extract angegeben ist. Ein lokaler Name kann eine einfache Kennung oder eine Kennung mit doppelten Anführungszeichen sein. Lokale Namen, die Leerzeichen, Interpunktionszeichen oder AQL-Schlüsselwörter enthalten, müssen in doppelte Anführungszeichen gesetzt werden.

Beispiele

Beispiel 1: from-Liste mit einer Ansicht und einer verschachtelten Anweisung

In diesem Beispiel ist eine from-Liste dargestellt, die eine Ansicht und eine verschachtelte Anweisung extract referenziert. Das Beispiel ordnet das Ergebnis der Anweisung dem lokalen Namen FN zu. Das Beispiel ordnet außerdem die Ausgaben der Ansicht LastName dem lokalen Namen Last Name zu.

create dictionary LastNamesDict as
  (
    'Anthony', 'Lehman', 'Radcliff'
  );

create view LastName as
  extract dictionary 'LastNamesDict'
  on D.text as lastname
from Document D;

create view FromList as
  select *
    from
    (extract dictionary 'first.dict' on D.text
      as firstname from Document D) FN,
      LastName "Last Name"
    where Follows(FN.firstname,
      "Last Name".lastname, 0, 1);

Die folgenden Namen sind im externen Wörterverzeichnis 'first.dict' enthalten:

#Dictionary for given names
Aaron
Candra
Freeman
Mathew
Matthew
Zoraida

Klausel where

Die optionale Klausel where definiert ein Vergleichselement, das für jedes Tupel angewendet werden soll, das aus dem kartesischen Produkt aller Tupel in den Beziehungen in der Klausel from generiert wird.

Syntax

select <select list>
  from <from list>
[where <where clause>]

Beschreibung

  • <where clause\>

    Gibt ein oder mehrere Vergleichselemente an. Eine Verknüpfung erfolgt, wenn ein Vergleichselement in einer where-Klausel Felder aus mehr als einer Ansicht umfasst, die zur from-Liste gehören. Dieses Vergleichselement muss eine Verknüpfung einer Gruppe von integrierten Vergleichselementfunktionen oder anderen benutzerdefinierten Funktionen sein, die den Datentyp 'Boolean' zurückgeben:

    function1() and function2()
    and ... and functionn()
    

    Die Klausel where ist optional und kann in einer Anweisung select weggelassen werden, falls keine Vergleichselemente angewendet werden.

Beispiele

Beispiel 1: Herausfiltern von verknüpften Tupeln mithilfe eines Vergleichselements in der WHERE-Klausel

Dieses Beispiel zeigt eine Klausel where, die nur Wortfolgen findet, die aus gültigen Vornamen bestehen, auf die innerhalb von 0-1 Zeichen gültige Nachnamen folgen.

-- a view containing words that are valid given names
create view FirstName as
  extract dictionary 'first.dict'
  on D.text as firstname
from Document D;

-- a view containing words that are valid surnames
create view LastName as
  extract dictionary 'last.dict'
  on D.text as lastname
from Document D;

-- a view containing phrases consisting of valid given names
-- followed within 0-1 characters by valid surnames.
create view FullName as
  select *
  from
  FirstName FN,
  LastName LN
  where
  Follows (FN.firstname, LN.lastname, 0, 1);

Die folgenden Namen sind im externen Wörterverzeichnis 'first.dict' enthalten:

#Dictionary for given names
Aaron
Candra
Freeman
Mathew
Matthew
Zoraida

Die folgenden Namen sind im externen Wörterverzeichnis 'last.dict' enthalten:

#Dictionary for surnames
Anthony
Lehman
Radcliff

Klausel consolidate on

Die optionale Klausel consolidate on gibt an, wie überlappende Spans über Tupel aufgelöst werden, die von einer Anweisung select oder extract ausgegeben werden. Tupel mit nicht überlappenden Spans sind nicht betroffen, wenn diese Klausel verwendet wird.

Syntax

Der folgende Code ist ein Beispiel für die allgemeine Struktur dieser Klausel:

consolidate on <target>
  [using '<policy>'[ with priority from <priority_column>
    [ <priority_order> ]]]

Beschreibung

  • <target\>

    Gibt eine Spalte in einer Ansicht in der Klausel from oder einen Ausdruck an, der sich aus Skalarfunktionsaufrufen zusammensetzt, die Spalten von Ansichten enthalten, die in der Klausel from als Argumente angegeben sind.

  • '<policy\>'

    Gibt eine der folgenden Konsolidierungsrichtlinien an, die von Text Analytics unterstützt werden:

    • ContainedWithin

      Diese Richtlinie ist die Standardeinstellung. Wenn sich die Spans A und B überlappen und A vollständig B enthält, entfernt diese Richtlinie das Tupel, das Span B enthält, aus der Ausgabe. Wenn Span A und B gleich sind, wird einer von ihnen entfernt. Die Entscheidung, welches Tupel entfernt werden soll, ist beliebig.

    • NotContainedWithin

      Wenn sich die Spans A und B überlappen und A vollständig B enthält, entfernt diese Richtlinie Span A der Ausgabe. Wenn Span A und B gleich sind, wird einer von ihnen entfernt. Die Entscheidung, welches Tupel entfernt werden soll, ist beliebig.

    • ContainsButNotEqual

      Diese Richtlinie ist mit ContainedWithin identisch, außer dass die Spans, die exakt gleich sind, beibehalten werden.

    • ExactMatch

      Wenn verschiedene Spans dieselbe Textregion abdecken, gibt diese Richtlinie genau einen von ihnen zurück. Alle anderen Spans bleiben unberührt.

    • LeftToRight

      Diese Richtlinie verarbeitet die Spans in der Reihenfolge von links nach rechts. Wenn Überlappungen auftreten, wird der am weitesten links liegende, längste, nicht überlappende Span beibehalten. Diese Richtlinie emuliert die Richtlinie zur Behandlung von Überlappungen der meisten Engines für reguläre Ausdrücke.

  • <priority\_column\>

    Gibt eine Spalte des Typs 'Text', 'String', 'Integer' oder 'Float' an. Dies kann nur mit der Konsolidierungsrichtlinie LeftToRight angegeben werden.

  • <priority\_order\>

    Gibt entweder aufsteigende oder absteigende Reihenfolge an. Dies kann nur mit der Konsolidierungsrichtlinie LeftToRight angegeben werden. Die aufsteigende Reihenfolge stellt sicher, dass ein Tupel T1 eine höhere Priorität als Tupel T2 hat, wenn T1 die Priorität 1 hat und T2 die Priorität 2. Wenn die Prioritätsreihenfolge dagegen absteigend ist, hat T2 die höhere Priorität. Der Standardwert für die Prioritätsreihenfolge ist aufsteigend.

Hinweise zur Verwendung

  • Wenn die Prioritätsklausel vorhanden ist, folgt die Konsolidierungssemantik der folgenden Reihenfolge:
    • Spans werden von links nach rechts verarbeitet. Wenn sich Spans überlappen, werden die Spans ganz links beibehalten.
    • Wenn sich mehrere Spans überlappen, die mit demselben Offset beginnen, werden diejenigen mit der höchsten Priorität gemäß der Prioritätsreihenfolge beibehalten.
    • Die noch verbleibenden Bindungen werden aufgehoben, indem die längsten Spans mit derselben Priorität beibehalten werden.
  • Bei der Konsolidierung werden Nullwerte als identisch behandelt. Alle Eingaben mit einem Nullwert für <consolidate target\> führen zu einem einzelnen Ausgabetupel, das zufällig unter diesen Eingaben ausgewählt wird. Dieses Verhalten ähnelt dem, wie Tupel mit einem identischen Span in der Zielspalte konsolidiert werden. Ein Ausnahmefall, bei dem das Ergebnis nicht in einem einzelnen Ausgabetupel besteht, liegt dann vor, wenn die Richtlinie ContainsButNotEqual wirksam wird. In diesem Fall gibt der Nullwert <consolidate target\> alle Eingaben mit dem Nullkonsolidierungsziel aus.

Beispiele

Beispiel 1: Konsolidierung in einer einzelnen Spalte

In diesem Beispiel wird das System angewiesen, das Feld Person.name aller Ausgabetupel zu untersuchen und die Konsolidierungsrichtlinie ContainedWithin zu verwenden, um Überlappungen aufzulösen.

consolidate on Person.name
  using 'ContainedWithin'

Beispiel 2: Konsolidierung eines Ausdrucks mit mehreren Spalten

In diesem Beispiel wird das System angewiesen, das Ergebnis des Anwendens der Skalarfunktion CombineSpans auf die Felder Person.firstname und Person.lastname in jedem Ausgabetupel zu untersuchen. Überlappungen werden unter Verwendung der Konsolidierungsrichtlinie ContainedWithin aufgelöst.

consolidate on
  CombineSpans(Person.firstname, Person.lastname)
  using 'ContainedWithin'

Beispiel 3: Konsolidierung unter Verwendung der Richtlinie LeftToRight und der Prioritätsreihenfolge

Angenommen, die folgenden Begriffstupel werden aus dem Eingabetext John Doe extrahiert:

match: `John`,
priority: `1`

und

match: `John Doe`,
priority: `2`

Beide Spans haben denselben Anfangsoffset. Wenn Sie mit der Richtlinie LeftToRight für eine aufsteigende Prioritätsreihenfolge konsolidieren, wird das Tupel (match: John, priority: 1) beibehalten, da es die höhere Priorität hat. Wenn Sie mit der absteigenden Prioritätsreihenfolge konsolidieren, wird das Tupel (match: John Doe, priority: 2) beibehalten, wie im folgenden Beispiel dargestellt:

create view ConsolidatePeopleWithPrioritiesAscending as
  select P.match as match, P.weight as weight
  from People P
  consolidate on P.match
  using 'LeftToRight'
  with priority from P.weight
  ascending;

Klausel group by

Die optionale Klausel group by einer Anweisung select weist die Laufzeitkomponente an, Tupel, die aus demselben Dokument erzeugt werden, anhand gemeinsamer Werte eines angegebenen Felds zu gruppieren.

Syntax

select <select list>
from <from list>
[where <where clause>]
...
[group by <group by list>]

Beschreibung

  • <group by list\>

    Gibt eine Liste von durch Kommas getrennten Ausdrücken an, die Spalten der Ansichten in der from-Klausel und Skalarfunktionsaufrufe umfasst. Wenn Sie die Klausel group by anwenden, generiert jede Gruppe von Tupeln, die gemeinsame Werte für alle group by-Ausdrücke haben, ein einzelnes Ausgabetupel, das für die gesamte Gruppe repräsentativ ist.

    Ein Feld oder Ausdruck, das/der nicht in der Klausel group by erscheint, kann nicht in der Auswahlliste enthalten sein, es sei denn, es wird in einem Aggregatfunktionsaufruf verwendet. Die Reihenfolge der Ausdrücke in der Liste ist nicht von Bedeutung.

    Die Klausel group by behandelt alle Nullen als identisch. Group by für eine Spalte mit Nullwerten führt zu einer einzelnen Gruppe.

Beispiele

Beispiel 1: Aggregatwerte berechnen

Verwenden Sie die Klausel group by, um Aggregatwerte zu berechnen. In diesem Beispiel wird die Anzahl der Vorkommen jedes Vornamens in dem Dokument gezählt. In dem Beispiel ist Count eine Aggregatfunktion.

create view SampleView as
  select
    GetText(P.firstname) as name,
    Count(GetText(P.firstname)) as occurrences
  from
    (extract
    dictionary 'first.dict'
    on D.text as firstname
    from Document D
    ) P
  group by GetText(P.firstname);

In diesem Fall ist first.dict ein externes Wörterverzeichnis, das die folgenden Einträge enthält:

#Dictionary for given names
Aaron
Candra
Freeman
Matthew
Zoraida

In den folgenden Schritten wird die Semantik dieser Anweisung beschrieben:

  1. Gruppieren von Tupeln, die von der Unterabfrage in der Klausel from durch den Textinhalt ihres Felds firstname generiert werden.
  2. Zählen der Tupel mit einem firstname-Wert ungleich null für jede Gruppe. Dabei soll für jede solche Gruppe ein einzelnes Ausgabetupel mit zwei Werten erzeugt werden, dem Namen und der Anzahl der Tupel in dieser Gruppe.

Beispiel 2: Probleme mit der Gruppierung ungleicher Felder

Dieses Beispiel stellt eine ungültige Anweisung dar.

select GetText(P.firstname) as first,
  GetText(P.lastname) as last,
  Count(P.firstname) as occurrences
from Person P
group by GetText(P.firstname);

Die Aufnahme von GetText(P.lastname) in die Auswahlliste ist nicht zulässig, da Tupel mit denselben firstname-Werten unterschiedliche Werte für lastname aufweisen können, woraus sich eine Mehrdeutigkeit ergibt.

Klausel order by

Die optionale Klausel order by weist die Laufzeitkomponente an, die Ausgabetupel, die von der Anweisung 'select' aus jedem Dokument generiert werden, basierend auf den Werten der 'order by'-Liste zu ordnen, die eine Gruppe von durch Kommas getrennten Ausdrücken ist.

Syntax

select ...
  [order by <order by list>]

Beschreibung

  • <order by list\>

    Gibt eine durch Kommas begrenzte Liste mit Ausdrücken an.

    Die Reihenfolge basiert auf den Werten einer Liste von durch Kommas getrennten Ausdrücken. Die Klausel 'order by' unterstützt Ausdrücke, die numerische Datentypen (Integer oder Float) oder die Datentypen 'Text' oder 'Span' zurückgeben. Wenn ein Ausdruck in der Klausel order by einen Typ 'Span' zurückgibt, werden die Ergebnistupel verglichen, indem die relevanten 'Span'-Werte verglichen werden. Im folgenden Beispiel werden die 'Span'-Werte des Felds person verglichen.

    order by P.person
    
    

    Die Klausel order by behandelt Nullwerte als nicht geordnet (untereinander). Nullwerte werden unterhalb von anderen Objekten angeordnet.

Beispiele

Beispiel 1: Ordnen nach mehreren Ausdrücken

Angenommen, 'person' ist ein Feld des Typs 'Span'. Die folgende Klausel order by gibt an, dass die Anweisung Tupel in jedem Dokument zurückgibt. Sie werden lexikografisch nach dem Text des Felds 'person' und dann nach dem Anfang des Felds 'person' geordnet.

order by GetText(P.person), GetBegin(P.person)

Klausel limit

Mit der optionalen Klausel limit wird ein Grenzwert für die Anzahl der Ausgabetupel angegeben, die durch die select-Anweisung für ein Dokument generiert werden.

Syntax

select <select list>
  from <from list>
  ...
  [limit <maximum number of output tuples for each document>];

Beschreibung

  • <maximum number of output tuples for each document\>

    Gibt die maximale Anzahl der Ausgabetupel für jedes Dokument an. Wenn der Grenzwert größer-gleich der Gesamtzahl der Tupel ist, die zurückgegeben werden könnten, werden alle Tupel zurückgegeben.

Beispiele

Beispiel 1: Begrenzen der Anzahl der Rückgaben

In diesem Beispiel werden die ersten drei Personennamen in jedem Dokument zurückgegeben:

create view SampleView as
  select *
  from Person P
  order by GetBegin(P.name)
  limit 3;

Anweisung select... into

Die Anweisung select ... into ist nützlich, um mit einer einzelnen Anweisung eine Ansicht zu definieren und gleichzeitig anzugeben, dass es sich um eine Ausgabeansicht handelt.

Syntax

select <select list>
into <output view name>
from <from list>
[where <where clause>]
[consolidate on <column> [using '<policy>' [with priority from <column> [priority order]]]]
[group by <group by list>]
[order by <order by list>]
[limit <maximum number of output tuples for each document>];

Beschreibung

  • <output view name\>

    Gibt den Namen der Ausgabeansicht an, die durch die Anweisung definiert wird. Die Anweisung select ... into ist mit der Anweisung select identisch, mit Ausnahme der zusätzlichen Klausel into <output view name\>.

Beispiele

Beispiel 1: Ansicht definieren

In diesem Beispiel wird eine Ansicht mit der Bezeichnung PersonPhone definiert. Darüber hinaus wird diese Ansicht als Ausgabeansicht angegeben.

select P.name as name,
  Ph.number as phoneNumber
into PersonPhone
from Person P, Phone Ph;

Dieses Beispiel ist äquivalent zu den beiden folgenden Anweisungen:

create view PersonPhone as
  select P.name as name,
    Ph.number as phoneNumber
  from Person P, Phone Ph;

output view PersonPhone;

Anweisung detag

Die Anweisung detag in AQL bietet die Möglichkeit, die gesamte Markup aus HTML- oder XML-Dokumenten zu entfernen (detaggen), bevor Sie AQL-Extraktoren ausführen.

Die Anweisung detag kann auch die ursprünglichen Positionen der Tags und alle Werte beibehalten, die in diesen Tags gespeichert sind. Wenn eine Anweisung detag die Tags aus einem Dokument entfernt, behält die Laufzeitkomponente die Zuordnung zwischen den Offsets aus dem entnommenen Text und der ursprünglichen Markup-Quelle bei. Die Funktion Remap ist eine spezielle integrierte Funktion, die Spans von mit 'detag' bearbeitetem Text wieder den entsprechenden Spans der ursprünglichen Quelle zuordnet.

Syntax

detag <input view name>.<text column>
 as <output view name>
[detect content_type (always|never)]
[annotate
 element '<element name>' as <auxiliary view name>
 [with attribute '<attribute name>' as <column name>]
 [and attribute '<attribute name>' as <column name>]
 [, element ...]];

Beschreibung

  • <input view name\>.<text column\>

    • <input view name\>

      Gibt den Namen der Eingabeansicht an, für die der Detagprozess ausgeführt werden soll. Die <input view name\> kann eine einfache ID oder eine ID in doppelten Anführungszeichen sein.

    • <text column\>

      Gibt das Textfeld der Eingabeansicht an, für die der Detagprozess ausgeführt werden soll. Die <text column\> kann eine einfache ID oder eine ID in doppelten Anführungszeichen sein.

  • <output view name\>

    Gibt den Namen der Ausgabeansicht an, die den mit Detag bearbeiteten Text enthält. Die Ausgabeansicht enthält eine einzelne Spalte mit dem Namen text, in der der mit Detag bearbeitete Text enthalten ist. Die <output view name\> kann eine einfache ID oder eine ID in doppelten Anführungszeichen sein.

  • always|never

    Gibt an, ob vor der Verarbeitung der Anweisung detag überprüft werden soll, ob der Inhalt HTML oder XML ist. Wenn Sie Nicht-HTML-und Nicht-XML-Text über ein Detagger ausführen, können Probleme auftreten, wenn der Text XML-Sonderzeichen wie <, > oder & enthält. Wenn die Klausel detect content_type fehlt, wird immer der Standardwert angenommen und das System erkennt immer die Inhalte.

    • always

      Gibt an, dass die Verifizierung immer erfolgt, bevor versucht wird, die Operation durchzuführen, um Probleme beim Parsen von Dokumenten zu vermeiden, die keine HTML- oder XML-Dokumente sind. Wenn der Wert von <text column\> kein Markup enthält, überspringt das System das Abhängen für das aktuelle Dokument.

    • never

      Gibt an, dass die Verifizierung nie erfolgt, bevor versucht wird, die Detag-Operation durchzuführen. Das System versucht, den Zieltext zu detaggen, auch wenn der Text kein HTML oder XML enthält.

  • <element name\>

    Gibt den Namen des HTML- oder XML-Elements an, das annotiert werden soll. Die optionale Klausel annotate kann die Laufzeitkomponente anweisen, Informationen zu den entfernten Tags zu speichern, indem eine oder mehrere Ansichten erstellt werden.

  • <auxiliary view name\>

    Gibt den Namen der Ansicht an, die erstellt wird, um die ursprünglichen Tags und ihre Attribute zu speichern. Kann eine einfache Kennung oder eine Kennung mit doppelten Anführungszeichen sein.

  • <attribute name\>

    Name eines Attributs des HTML- oder XML-Elements.

  • <column name\>

    Der Name der Spalte in <auxiliary view name\>, in der die Werte von <attribute name\> gespeichert werden. Kann eine einfache Kennung oder eine Kennung mit doppelten Anführungszeichen sein.

Beispiele

Beispiel 1: Angabe der Detag-Ausgabeansicht und einer Hilfsansicht

In diesem Beispiel wird die Ansicht DetaggedDoc erstellt, in der die detaggte Version des ursprünglichen Texts im Attribut text der Ansicht Document gespeichert werden soll. Zusätzlich zum Erstellen einer Ansicht DetaggedDoc erstellt die Klausel 'annotate' eine Hilfsansicht mit dem Namen Anchor. Diese Hilfsansicht hat zwei Spalten. Eine Spalte mit dem Namen match enthält den Ankertext. Die andere Spalte mit dem Namen linkTarget enthält das eigentliche Ziel des Links als Text. Die Spans in der Spalte 'match' erstrecken sich über den Textwert der Ansicht DetaggedDoc.

detag Document.text as DetaggedDoc
annotate
  'a' as Anchor
  with attribute 'href' as linkTarget;

Beispiel 2: Funktion Remap verwenden

Im folgenden Beispiel wird veranschaulicht, wie die Funktion Remap für die Zuordnung von Spans aus dem detaggten Text zurück zu den Entsprechungen in der ursprünglichen Quelle erfolgt.

-- Strip out tags from each document, provided that the document
-- is in HTML or XML format.
-- Remember the locations and content of all <A> and <META> tags
-- in the original source document.
detag Document.text as DetaggedDoc
detect content_type always
annotate
  element 'a' as Anchor
    with attribute 'href' as target,
  element 'meta' as Meta
    with attribute 'name' as name
    and attribute 'content' as content;

output view DetaggedDoc;

-- Create a view containing all lists of keywords in the
-- document's META tags.
create view MetaKeywordsLists as
select M.content as list
from Meta M
where MatchesRegex(/keywords/, 'CASE_INSENSITIVE', M.name)
  and NotNull(M.content);

-- Create a dictionary of "interesting" web sites
create dictionary InterestingSitesDict as
(
  'ibm.com', 'slashdot.org'
);

-- Create a view containing all anchor tags whose targets contain
-- a match of the "interesting sites" dictionary.
create view InterestingLinks as
select A.match as anchortext, A.target as href
from Anchor A
where ContainsDict('InterestingSitesDict', A.target);

-- Find all capitalized words in the anchor text of links to
-- "interesting" web sites.
create view InterestingWords as
extract I.href as href,
  regex /[A-Z][a-z]+/ on 1 token in I.anchortext as word
from InterestingLinks I;

-- Map spans in the InterestingWords view back to the original
-- HTML or XML source of the document.
create view InterestingWordsHTML as
select I.href as href, Remap(I.word) as word
from InterestingWords I;

Anweisung detag mit AQL Doc dokumentieren

Der AQL Doc-Kommentar für eine Anweisung detag enthält die folgenden Informationen:

  • Allgemeine Beschreibung zur Funktion der Anweisung.
  • @field für jedes Textfeld der Eingabeansicht, wofür der Detagprozess ausgeführt werden soll.
  • @auxView gibt den Namen der Ansicht an.
  • @auxViewField gibt den vollständig qualifizierten Spaltennamen der Ansicht an.
/**
* Detags the input document
* @field text the detagged text of the document
* @auxView Anchor stores the anchor points from tagged doc
* @auxViewField Anchor.linkTarget stores the href attribute of anchor tag
*/

detag Document.text as DetaggedDoc
  annotate element 'a' as Anchor
  with attribute 'href' as linkTarget;

Anweisung create dictionary und Anweisung create external dictionary

Die Anweisungen create dictionary und create external dictionary werden verwendet, um Wörterverzeichnisse von Wörtern oder Wortfolgen zu definieren, um übereinstimmende Begriffe im Eingabetext mithilfe von 'extract'-Anweisungen oder Vergleichselementfunktionen zu ermitteln. Die Anweisung create dictionary ermöglicht die Spezifikation von Wörterverzeichnisinhalten in Spezifikation und der Wörterverzeichnisinhalt wird in der kompilierten Darstellung des Moduls (Datei mit der Erweiterung .tam) serialisiert. Mit der Anweisung create external dictionary können Sie den Wörterverzeichnisinhalt angeben, wenn der Extraktor instanziiert wird (anstatt im AQL-Quellcode), und Sie müssen das Modul nicht erneut kompilieren. Externe Wörterbücher sind daher leistungsfähige Konstrukte, die es dem AQL-Entwickler ermöglichen, Anpassungspunkte in einem kompilierten Modul zugänglich zu machen.

Wörterbücher können aus drei Quellen erstellt werden:

  • Wörterverzeichnisdateien
  • Inline-Wörterverzeichnisdeklarationen
  • Tabellen, die mit der Anweisung create table und der Anweisung create external table erstellt werden

Syntax

Die interne Anweisung 'create dictionary' verfügt über drei syntaktische Formen: from file, from table und ein Inline-Format.

  • Internes Wörterverzeichnis

    Aus Datei (from file):

    create dictionary <dictionary name>
    
     from file '<file name>'
     [with language as '<language code(s)>']
     [and case (exact | insensitive)]
     [and lemma_match];
    

    Aus Tabelle (from table):

    create dictionary <dictionary name>
    
      from table <table name>
      with entries from <column name>
      [and language as '<language code(s)>']
      [and case (exact | insensitive)]
      [and lemma_match];
    

    Inline-Format

    create dictionary <dictionary name>
    [with language as '<language code(s)>']
    [and case (exact | insensitive)]
    [and lemma_match]
     as
        (
        '<entry 1>', '<entry 2>', ... , '<entry n>'
        )
    ;
    
  • Externes Wörterverzeichnis

    create external dictionary <dictionary-name>
    required [true|false]
    [with language as '<language codes\>']
    [and case (exact | insensitive )]
    [and lemma_match];
    

Beschreibung

  • <dictionary name\>

    Gibt einen Namen für das neue interne oder externe Wörterverzeichnis an. Kann eine einfache Kennung oder eine Kennung mit doppelten Anführungszeichen sein.

  • '<file name\>'

    Gibt den Namen der Datei mit den Wörterverzeichniseinträgen an. Wörterverzeichnisdateien sind Textdateien mit Wagenrücklaufzeichen als Trennzeichen, die pro Zeile einen Wörterverzeichniseintrag enthalten. Einträge in einer Wörterverzeichnisdatei können aus mehreren Tokens bestehen.

  • <table name\>

    Gibt den Namen der Tabelle an, aus der Wörterverzeichniseinträge hinzugefügt werden sollen. Wörterverzeichnisse können nicht auf der Basis einer Tabelle erstellt werden, die aus einem anderen Modul importiert wird.

  • <column name\>

    Gibt den Namen der Spalte in der Tabelle an, aus der Wörterverzeichniseinträge hinzugefügt werden sollen.

  • required [true|false]

    Gibt an, ob externer Inhalt für das externe Wörterverzeichnis erforderlich ist, um das Modul auszuführen.

    • true

      Wenn die Klausel required true lautet, müssen Sie einen URI für die Position der Datei angeben, die den externen Inhalt enthält. Die angegebene Datei muss einen Inhalt haben. Wenn der URI nicht angegeben wird oder wenn die Datei keinen Inhalt hat, löst die Laufzeitkomponente eine Ausnahmebedingung aus.

    • false

      Wenn die Klausel required false lautet, kann das Modul erfolgreich ausgeführt werden, selbst wenn für dieses Wörterverzeichnis kein URI für den externen Inhalt nicht angegeben wird. Wenn kein URI angegeben wird, behandelt es die Laufzeitkomponente als leeres Wörterverzeichnis.

    Die Verwendung von create external dictionary <dictionary-name\> allow_empty ist veraltet und führt zu einer Compilerwarnung.

  • '<language code(s)\>'

    Gibt eine Liste mit durch Kommas getrennten Sprachencodes mit zwei Buchstaben - z. B. en (Englisch) oder zh (Chinesisch) - für die Sprachen (oder für die Dokumentsprachen für externe Wörterverzeichnisse) an, für die das Wörterverzeichnis ausgewertet werden soll. Das Wörterverzeichnis erzeugt keine Ergebnisse zu Dokumenten, deren Sprachencode nicht in dieser Zeichenfolge enthalten ist.

    Wenn der Sprachparameter nicht angegeben wird, wird für das Wörterverzeichnis standardmäßig eine der folgenden Sprachgruppen verwendet:

    • Die Sprachgruppen, die durch die Anweisung set default language (soweit deklariert) im enthaltenden Modul angegeben sind.
    • Die Sprachgruppen, die Deutsch (de), Spanisch (es), Englisch (en), Französisch (fr), Italienisch (it) und die nicht angegebene Sprache (x_unspecified) enthalten.
  • lemma_match

    Mithilfe der Reduktion auf die Grundform können Sie nach Übereinstimmungen mit ähnlichen Wörtern für einen Wörterverzeichnisbegriff in Ihren Dokumenten suchen.

    Die Reduktion auf Grundform (Lemmatisierung) ist der Prozess, mit dem für ein bestimmtes Wort das Lemma ermittelt wird. Bei einem Lemma handelt es sich um ein Wort, das als Übereinstimmung für einen einzelnen bestimmten Begriff verwendet werden kann. Der Begriff “go” kann beispielsweise mit den Begriffen “goes”, “going”, “gone” oder “went” abgeglichen werden. Dieser Prozess beinhaltet komplexe Tasks, wie zum Beispiel das Verstehen des Kontexts und das Bestimmen der Wortart eines Worts in einem Satz. Die Lemmatisierung ist für alle Sprachen verfügbar, für die der IBM Multilingual Tokenizer die Verarbeitung von Wortarten unterstützt.

    Ein Lemma-Abgleich wird nur für die Wörterverzeichnisse durchgeführt, die mit der Klausel lemma match deklariert wurden.

    Die Semantik für die Wörterverzeichnisextraktion mit der Klausel lemma_match lautet wie folgt:

    • Für jedes Token des Eingabedokuments wird die lemmatisierte (d. h. auf Grundform reduzierte) Form berechnet.
    • Das Wörterverzeichnis wird anhand des lemmatisierten Dokuments ausgewertet. Sie können die Option lemma_match nicht mit der Option case exact verwenden. Wenn beide verwendet werden, wird ein Compilerfehler zurückgegeben.
  • case (exact | insensitive)

    Gibt den Typ der Umsetzung der Groß-/Kleinschreibung an, die vom Wörterverzeichnis ausgeführt wird, wenn ermittelt wird, ob eine bestimmte Region des Dokuments übereinstimmt.

    • exact

      Gibt eine exakt übereinstimmende Groß-/Kleinschreibung an.

    • insensitive

      Gibt eine Entsprechung an, bei der die Groß-/Kleinschreibung nicht übereinstimmt. Diese Option ist die Standardeinstellung.

  • '<entry 1\>', '<entry 2\>', ... , '<entry n\>'

    Gibt die Zeichenfolgen an, die in das Inline-Wörterverzeichnis aufgenommen werden sollen. Die Einträge in einem Inline-Wörterverzeichnis können aus einem oder mehreren Tokens bestehen.

Hinweise zur Verwendung

  • Die Formate from file und from table werden empfohlen, insbesondere wenn Sie erwarten, dass sich Einträge ändern, oder wenn viele Einträge vorhanden sind. Wenn Sie diese Formate verwenden, können Sie den Inhalt des Wörterverzeichnisses ändern, ohne den Code zu ändern.

  • Wenn die Anweisung create dictionary vom modularen AQL-Compiler verarbeitet wird, müssen Verweise auf Positionen von Wörterverzeichnisdateien, die in der Syntax create dictionary ... from file angegeben sind, relativ zum Stammverzeichnis des Moduls sein, in dem diese Anweisung create dictionary ausgegeben wird.

  • Sie können Kommentare in einer Wörterverzeichnisdatei angeben, indem Sie dem Kommentar das Zeichen # voranstellen. Kommentare können an einer beliebigen Stelle in einer Zeile beginnen.

  • Wenn Sie Kommentare angeben möchten, die sich über mehrere Zeilen erstrecken, müssen Sie jeder Zeile das Kommentarzeichen voranstellen. Wenn das Kommentarzeichen in einem Wörterverzeichniseintrag enthalten ist, müssen Sie es mit dem Backslash-Zeichen (\) (wie in \#) als Escapezeichen versehen. Wenn das Backslash-Zeichen im Wörterverzeichniseintrag enthalten ist, muss es wie in \\ mit sich selbst als Escapezeichen versehen werden.

  • Bei externen Wörterverzeichnissen müssen Sie - wenn Module geladen werden - eine Liste von URIs zu externen Wörterverzeichnissen angeben, je nachdem, wie es für die Module, die geladen werden, erforderlich ist.

  • Lemmatisierung von Wörterverzeichnissen: Der primäre Unterschied zwischen der vorhandenen Semantik für den Wörterverzeichnisabgleich und der lemmatisierten Semantik besteht darin, dass der Abgleich mit der lemmatisierten Form des Dokuments anstelle der ursprünglichen Form des Dokuments erfolgt.

    Wörterverzeichniseinträge, die zu einem Wörterverzeichnis mit aktiviertem Lemma-Abgleich gehören, haben die folgenden Voraussetzungen:

    • Ein Wörterverzeichniseintrag kann ein oder mehrere Tokens enthalten, wobei jedes Eintragstoken ein Lemma ist. Um ein Wörterverzeichnis von Lemmata zu erstellen, können Sie die Skalarfunktion 'GetLemma' verwenden.
    • Die Tokens eines Wörterverzeichniseintrags müssen durch ein Leerzeichen getrennt werden. Wenn das Token aus Leerzeichen besteht, dann sollten die Leerzeichen mithilfe des Backslash-Zeichens (\) mit Escapezeichen versehen werden.
  • In der folgenden Tabelle sind die Unterschiede zwischen der Anweisung create external dictionary und der Anweisung create dictionary dargestellt:

create external dictionary create dictionary
  • Definiert einen Platzhalter für ein Wörterverzeichnis, dessen Inhalt bei der Initialisierung bereitgestellt wird.
  • Setzt voraus, dass der Inhalt des Wörterverzeichnisses bei der Kompilierung verfügbar ist.
  • Serialisiert in der kompilierten Darstellung (.tam) eines Moduls.

Beispiele

Beispiel 1: Externes Wörterverzeichnis erstellen

Das externe Wörterverzeichnis 'PersonPositiveClues' erwartet, dass es beim Laden mit Werten aus einer externen Datei gefüllt wird. Das Wörterverzeichnis geht außerdem davon aus, dass es entsprechend der Angabe durch seine Flags mit bestimmten westlichen Sprachen abgeglichen wird.

module PersonModuleEnglish;

create external dictionary PersonPositiveClues
  allow_empty false
  with case exact;

export dictionary PersonPositiveClues;

Beispiel 2: Lemmatisierung

Angenommen, für ein Wörterverzeichnis ist der Lemma-Abgleich aktiviert und es enthält zwei Einträge: 'go shop' und 'went shopping'. Das Dokument enthält den Text Anna went shopping. Die lemmatisierte Form des Eingabedokuments ist Anna go shop. Der Lemma-Abgleich gibt 'went shopping' als Übereinstimmung mit dem Eintrag 'go shop' zurück. Der Originaldokumenttext wird nicht mit den Wörterverzeichniseinträgen verglichen, sondern nur mit dem lemmatisierten Dokumenttext. Daher gibt es in dem Dokument keine Übereinstimmungen mit dem Eintrag went shopping.

Anweisungen create dictionary und create external dictionary mit AQL Doc dokumentieren

Der AQL Doc-Kommentar für eine Anweisung create dictionary enthält die folgenden Informationen:

Allgemeine Beschreibung des Wörterverzeichnisses.

/**
* A dictionary of terms used to greet people.
*
*/

create dictionary GreetingDict as
(
  'regards', 'regds', 'hello', 'hi', 'thanks', 'best', 'subj', 'to', 'from'
);

Der AQL Doc-Kommentar für eine Anweisung create external dictionary enthält die allgemeine Beschreibung des Wörterverzeichnisses, das erstellt wird. Die folgende Zeichenfolge veranschaulicht das Format:

/**
 * Customizable dictionary of given names.
 * Evaluated on English, French, Italian, German, Portuguese, Spanish text.
 */
create external dictionary CustomFirstNames_WesternEurope
  allow_empty true;

Anweisung create table

Mit der Anweisung create table wird eine AQL-Tabelle erstellt.

Die Anweisung create table in AQL wird verwendet, um statische Referenztabellen zu definieren, um Annotationen mit weiteren Informationen zu ergänzen.

Syntax

create table <table name> (
    <colname> <type> [,  <colname> <type>]* )
 as values
    ( <value> [, <value>]*),
    ...
    ( <value> [, <value>]*);

Beschreibung

  • <table name\>

    Gibt den Namen der Tabelle an, die erstellt werden soll. Die <table name\> kann eine einfache ID oder eine ID in doppelten Anführungszeichen sein.

  • <colname\>

    Gibt den Namen der Spalte an, die erstellt werden soll.

  • <type\>

    Gibt den AQL-Datentyp für die zugehörige Spalte an. Alle Spalten müssen den Datentyp Zeichenfolge (String), ganze Zahl (Integer), Gleitkommawert (Float) oder boolescher Wert (Boolean) aufweisen.

  • <value\>

    Gibt die Tupel an, die in der erstellten Tabelle gefüllt werden sollen.

Beispiele

Beispiel 1: Tabelle mit Firmennamen erstellen

In diesem Beispiel werden in der Anweisung create table ergänzende Ortsmetadaten zu den Annotationen für den Firmennamen hinzugefügt:

-- Create a dictionary of company names
create dictionary CompanyNames as
  ('IBM', 'BigCorp', 'Initech');

-- Find all matches of the company names dictionary.
create view Company as
  extract
    dictionary 'CompanyNames' on D.text as company
  from Document D;


-- Create a table that maps company names to locations of
-- corporate headquarters.
create table NameToLocation
  (name Text, location Text) as
  values
  ('IBM', 'USA'),
  ('BigCorp', 'Apex'),
  ('Initech', 'Dallas'),
  ('Acme Fake Company Names', 'Somewhere');

-- Use the table to augment the Company view with location
-- information.
create view CompanyLoc as
  select N2C.location as loc,
          C.company as company
  from Company C, NameToLocation N2C
  where Equals(GetText(C.company), GetText(N2C.name));

output view CompanyLoc;

Anweisung create table mit AQL Doc dokumentieren

Der AQL Doc-Kommentar für eine Anweisung create table enthält die folgenden Informationen:

  • Allgemeine Beschreibung der Tabelle.
  • @field für jeden Spaltennamen im Schema dieser Tabelle.
/** Create a table that maps company names to locations
/** of corporate headquarters.
* @field name name of the company
* @field location location of corporate headquarters
*/

create table NameToLocation
  (name Text, location Text) as
 values
  ('IBM', 'USA'),
  ('Enron', 'UK'),
  ('Initech', 'Dallas'),
  ('Acme Fake Company Names', 'Somewhere');

Anweisung create external table

Sie können die Anweisung create external table verwenden, um eine Tabelle mit bereits vorhandenem Inhalt anzugeben, wenn ein kompiliertes Modul für alle Eingabedokumente ausgeführt wird. Sie geben den Tabelleninhalt beim Laden und nicht im AQL-Quellencode an und Sie müssen das Modul nicht erneut kompilieren.

Externe Tabellen sind leistungsfähige Konstrukte, die es dem AQL-Entwickler ermöglichen, Anpassungspunkte in einem kompilierten Modul zugänglich zu machen.

Syntax

create external table <table-name\>
  (<colname\> <type\>
   [,  <colname\> <type\>]* )
   allow_empty <true|false>;

Beschreibung

  • <table-name\>

    Gibt den Namen der externen Tabelle an, die erstellt werden soll. Die <table-name\> kann eine einfache ID oder eine ID in doppelten Anführungszeichen sein.

  • <colname\>

    Gibt den Namen der Spalte an, die erstellt werden soll.

  • <type\>

    Gibt den AQL-Datentyp für die zugehörige Spalte an. Alle Spalten müssen den Datentyp Zeichenfolge (String), ganze Zahl (Integer), Gleitkommawert (Float) oder boolescher Wert (Boolean) aufweisen.

  • [, <colname\> <type\>]*

    Gibt zusätzliche Spalten und AQL-Objekte an, die in der externen Tabelle verwendet werden sollen.

  • allow_empty [true|false]

    Gibt den Wert für die Klausel allow_empty an.

    • true

      Wenn die Klausel allow_empty true lautet, kann das Modul erfolgreich ausgeführt werden, selbst wenn für diese Tabelle kein URI für den externen Inhalt nicht angegeben wird. Wenn kein URI angegeben wird, behandelt die Laufzeitkomponente die Tabelle als leer.

    • false

      Wenn die Klausel allow_empty false lautet, müssen Sie einen URI für die Position der Datei angeben, die den externen Inhalt enthält. Die angegebene Datei muss einen Inhalt haben. Wenn der URI nicht angegeben wird oder wenn die Datei keinen Inhalt hat, löst die Laufzeitkomponente eine Ausnahmebedingung aus.

Hinweise zur Verwendung

  • Die kompilierte Darstellung des Moduls enthält Metadaten zu den externen Objekten (Ansichten, Wörterverzeichnisse und Tabellen), die von dem Modul definiert werden.
  • Wenn Module geladen werden, müssen Sie eine Liste von URIs zu externen Tabellen angeben, je nachdem, wie es für die Module, die geladen werden, erforderlich ist.
  • Das unterstützte Format für den Inhalt einer externen Tabelle ist eine CSV-Datei (.csv) mit Header.

In der folgenden Tabelle sind die Unterschiede zwischen der Anweisung create external table und der Anweisung create table dargestellt:

create external table create table
  • Definiert einen Platzhalter für eine Tabelle, deren Inhalt bei der Initialisierung bereitgestellt wird.
  • Setzt voraus, dass der Inhalt der Tabelle bei der Kompilierung verfügbar ist.
  • Serialisiert in der kompilierten Darstellung (.tam) eines Moduls.

Beispiele

Beispiel 1: Externe Tabelle erstellen, die zum Zeitpunkt des Ladevorgangs gefüllt wird

Die externe Tabelle 'PersonNegativeClues' erwartet aufgrund des Flags allow_empty false, dass sie beim Laden gefüllt wird.

module PersonModuleFrench;

create external table PersonNegativeClues (name Text)
  allow_empty false;

export table PersonNegativeClues;

Beispiel 2: Wörterverzeichnis mit einer externen Tabelle erstellen

Wörterverzeichnisse können auch aus externen Tabellen erstellt werden, ähnlich wie aus Inline-Tabellen, die mit der Anweisung create table deklariert werden.

create external table Product (nickName Text, formalName Text)
allow_empty false;

/**
  * Dictionary of product nicknames, from the nickName field
  * of the customizable external table Product.
  */
create dictionary ProductDict
from table Product
with entries from nickName;

Anweisung create external table mit AQL Doc dokumentieren

Der AQL Doc-Kommentar für eine Anweisung create external table enthält die folgenden Informationen:

  • Allgemeine Beschreibung der Tabelle.
  • @field für jeden Spaltennamen im Schema dieser Tabelle.
/** Create a table that maps company names to locations of corporate headquarters.
* @field name name of the company
* @field location location of corporate headquarters
*/
create external table Company2Location
  (name Text, location Text)
   allow_empty false;

Anweisung create external view

Die Anweisung create external view in AQL ermöglicht die Spezifikation weiterer Metadaten zu einem Dokument als neue Ansicht zusätzlich zur vordefinierten Ansicht Document mit dem Text- und Beschriftungsinhalt.

Syntax

create external view <view_name> (
        <colname> <type> [, <colname> <type>]*
        )
external_name '<view_external_name>';

Beschreibung

  • <view_name\>

    Gibt den internen Namen der externen Ansicht an. Die externe Ansicht wird in den AQL-Regeln mit diesem Namen referenziert. Ein <view_name\> kann eine einfache ID oder eine ID in doppelten Anführungszeichen sein. Ein <view_name\> darf keinen Punkt enthalten.

  • <colname\>

    Gibt den Namen der Spalte an, die in der externen Ansicht definiert werden soll.

  • <type\>

    Gibt den Datentyp für die zugehörige Spalte an. Die Datentypen, die für externe Ansichtsspalten unterstützt werden, sind 'Text', 'Span', 'Integer' und 'Float'.

  • '<view_external_name\>'

    Gibt den externen Namen der externen Ansicht an. Externe Systeme, die Tupel in die externe Ansicht füllen, verweisen mittels des externen Namens auf die externe Ansicht. Die '<view_external_name\>' muss eine Zeichenfolgekonstante sein, die in einfache Anführungszeichen ('ExternalName') eingeschlossen ist.

Beispiele

Um externe Ansichten zu veranschaulichen, ziehen Sie eine Beispielanwendung in Betracht, die voraussetzt, dass Sie die Namen von Personen in E-Mail-Nachrichten angeben.

Beispiel 1: Namen von Personen in E-Mail-Nachrichten ermitteln

Angenommen, der Text einer E-Mail-Nachricht lautet "Ena, please send me the document ASAP". Während der Leser normalerweise aufgrund des E-Mail-Kontexts versteht, dass Ena der Name einer Person ist, sind die AQL-Regeln, die dazu dienen, Namen von Personen mit hoher Genauigkeit im allgemeinen Text zu identifizieren, möglicherweise zu konservativ und deshalb nicht in der Lage, anhand der Tatsache, dass Ena ein großgeschriebenes Wort ist, zuverlässig zu erkennen, dass es sich um eine Person handelt.

Um die Erkennung durch die Regeln zu verbessern, können zusätzlich Wörter aus den Feldern From, To und CC der E-Mail untersucht werden.

Wenn die E-Mail an "Ena Smith" adressiert ist und die Anwendung diese Informationen dem Extraktor zur Verfügung stellt, kann der Extraktorentwickler weitere AQL-Regeln schreiben, um die Abdeckung durch den Extraktor zu erhöhen, die auf dem Wissen basiert, dass E-Mails in der Regel an Personen adressiert werden.

Sie können zum Beispiel AQL-Regeln schreiben, um Personentokens aus den E-Mail-Metadatenfeldern zu ermitteln. Sie können diese Informationen dann als deutliche Anhaltspunkte verwenden, wenn Sie entscheiden, ob es sich bei einem aktivierten Token im E-Mail-Text um einen Personennamen handelt. Im Allgemeinen sind die E-Mail-Metadaten nicht Teil der tatsächlichen E-Mail-Nachricht, aber die Anwendung kann diese Metadaten über eine externe Ansicht für den Extraktor verfügbar machen.

Die Anwendung kann zur Laufzeit für jede E-Mail, die verarbeitet werden muss, den E-Mail-Text als Dokumenttext zur Verarbeitung übergeben (um die Ansicht Document zu füllen). Sie kann außerdem die zusätzlichen Metadaten unter Verwendung einer entsprechend definierten externen Ansicht zur Verarbeitung übergeben.

Die folgende Anweisung definiert eine externe Ansicht mit dem Namen EmailMetadata. Die externe Ansicht hat ein Schema, das drei Felder des Typs 'Text' enthält. Zur Laufzeit wird die Ansicht EmailMetadata automatisch von einem externen Typ mit dem Namen EmailMetadataSrc gefüllt. Anschließend können Sie auf die Ansicht EmailMetadata in Ihren AQL-Regeln verweisen - so, wie Sie auf eine andere Ansicht verweisen würden.

create external view EmailMetadata
  (fromAddress Text, toAddress Text, ccAddress Text)
external_name 'EmailMetadataSrc';

Anweisung create external view mit AQL Doc dokumentieren

Der AQL Doc-Kommentar für eine Anweisung create external view enthält die folgenden Informationen:

  • Allgemeine Beschreibung der Ansicht.
  • @field für jeden Spaltennamen in der Ansicht.
/**
* The external view named EmailMetadata, containing three fields
* of type Text. At run time, the view EmailMetadata is
* automatically populated from an external type named
* EmailMetadataSrc.
*
* @field from the fromAddress field of the email
* @field to the toAddress field of the email
* @field cc the ccAddress field of the email
*/

create external view EmailMetadata(fromAddress Text, toAddress Text, ccAddress Text)
external_name 'EmailMetadataSrc';

Dateiformate für externe Artefakte

Es werden drei Typen externer Artefakte unterstützt: externe Ansichten, externe Wörterverzeichnisse und externe Tabellen.

Externes Wörterverzeichnis

Das Format für die Datei, die Einträge für ein externes Wörterverzeichnis enthält, wird hier definiert:

  • Textdatei mit Wagenrücklaufzeichen als Trennzeichen.
  • Ein Wörterverzeichniseintrag pro Zeile.
  • Die empfohlene Dateierweiterung ist .dict, aber andere Dateierweiterungen können unterstützt werden.
  • Einträge im Wörterverzeichnis können aus mehreren Tokens bestehen.
  • Es können Kommentare angegeben werden - durch Voranstellen des Kommentarzeichens #.
  • Kommentare können an einer beliebigen Stelle in einer Zeile beginnen.
  • Bei mehrzeiligen Kommentaren beginnt jede Zeile mit dem Zeichen #.
  • Wörterbucheinträge können Kommentarzeichen enthalten, wenn jedes Kommentarzeichen mit einem Backslash-Zeichen als Escapezeichen versehen wird. Zum Beispiel \#.

Externe Tabelle

Das unterstützte Dateiformat für den Inhalt einer externen Tabelle ist eine CSV-Datei mit Header.

Das folgende Beispiel zeigt eine Anweisung create external table und die CSV-Datei, die den Inhalt dieser externen Tabelle angibt.

create external table Company2Location
  (name Text, location Text)
   allow_empty false;

Die erste Zeile der CSV-Datei enthält den Header. Die übrigen Zeilen enthalten die Daten.

name,location
IBM,USA
Infosys,India
LG,Korea
Vodafone,UK

Externe Ansicht

Der Inhalt externer Ansichten kann auf folgende Weise angegeben werden:

  • Wenn Sie einen Extraktor ausführen, können Sie nur dann den Inhalt externer Ansichten für eine Datensammlung angeben, wenn Sie das JSON-Eingabeformat verwenden.

Integrierte Funktionen

AQL verfügt über eine Reihe integrierter Funktionen zur Verwendung in Extraktionsregeln.

  • Aggregatfunktionen Aggregatfunktionen werden verwendet, um Operationen (wie z. B. Zählen, mathematische und andere Operationen) über eine Gruppe von Eingabewerten hinweg zu implementieren. Diese Funktionen geben nur ein einzelnes Ergebnis zurück.
  • Vergleichselementfunktionen Vergleichselementfunktionen testen ein bestimmtes Vergleichselement für die zugehörigen Eingabeargumente und geben einen entsprechenden booleschen Wert zurück.
  • Skalarfunktionen Skalarfunktionen führen eine Operation für die Werte eines Felds in einer Gruppe von Eingabetupeln aus und geben einen nicht booleschen Wert zurück, z. B. Span, Text oder Integer. Diese Funktionen können in der select-Liste einer Anweisung select oder einer Anweisung extract verwendet werden. Sie können auch als Eingabe für Vergleichselementfunktionen verwendet werden.

Aggregatfunktionen

Aggregatfunktionen werden verwendet, um Operationen (wie z. B. Zählen, mathematische und andere Operationen) über eine Gruppe von Eingabewerten hinweg zu implementieren. Diese Funktionen geben nur ein einzelnes Ergebnis zurück.

Diese Funktionen können in der select-Liste einer Anweisung select, aber keiner Anweisung extract verwendet werden.

Im Folgenden finden Sie das allgemeine Format eines Aggregatfunktionsaufrufs:

Aggregate_Function_Name(argument)

Dabei kann argument Folgendes sein:

  • Ein Ausdruck, der aus einer Spalte einer Ansicht in der Klausel from besteht, oder eine Kombination von Skalarfunktionen, die Spalten der Ansichten in der Klausel from umfassen.

    In den meisten Fällen (mit den aufgeführten Ausnahmen) werden die Nullwerte für das Argument ignoriert.

  • Das Zeichen * im speziellen Fall der Aggregatfunktion Count(*).

    In diesem Fall werden alle Zeilen der Ausgabe gezählt, einschließlich Nullwerte.

Aggregatfunktion Argumenttyp Rückgabetyp Rückgabewert
Avg(expression) Ganzzahl, Gleitkommazahl Gleitkommazahl Der Durchschnitt aller Eingabewerte oder null, wenn keine Zeilen ausgewählt sind.
Anzahl(*) Ganzzahl Die Anzahl aller Eingabezeilen.
Count(expression) Beliebig Ganzzahl Die Anzahl aller Eingabewerte, die nicht null sind.
List(expression) Integer, Float, Text, Span Eine Liste der Skalarwerte desselben Typs wie das Eingabeargument. Eine ungeordnete Liste von Eingabewerten, die nicht null sind: eine Multimenge (Bag), keine Menge (Set), könnte daher Duplikate enthalten. Eine leere Liste, wenn nur Nullwerte ausgewählt sind.
Max(expression) Integer, Float, Text, Span Entspricht dem Argumenttyp. Das maximale Element über alle Eingabewerte oder null, wenn keine Zeilen ausgewählt sind.
Min(expression) Integer, Float, Text, Span Entspricht dem Argumenttyp. Das minimale Element über alle Eingabewerte oder null, wenn keine Zeilen ausgewählt sind.
Sum(expression) Ganzzahl, Gleitkommazahl Entspricht dem Argumenttyp. Die Summe aller Eingabewerte oder null, wenn keine Zeilen ausgewählt sind.

Einschränkungen der aktuellen Version:

Die aktuelle Version von AQL unterstützt das Erstellen von Skalarwerten durch die aggregate-Funktionsliste.

Beispiele

Das folgende Beispiel veranschaulicht, wie Aggregatfunktionen die Anzahl der Personennamenannotationen zählen können oder wie sie Gruppen von Vornamen ermitteln können, die zu den einzelnen in einem Dokument gefundenen Nachnamen gehören:

-- identify occurrences of given names in the document
create view FirstName as
extract dictionary 'firstNames.dict' on D.text as name
from Document D;

-- identify occurrences of surnames in the document
create view LastName as
extract dictionary 'lastNames.dict' on D.text as name
from Document D;

-- identify complete person names in the document
create view Person as
select F.name as firstname, L.name as lastname
from FirstName F, LastName L
where FollowsTok(F.name, L.name, 0, 0);

-- count the number of person annotations in the document
create view CountPerson as
select Count(*)
from Person;

-- for each distinct surname, output a list of given names associated with it in the document
create view FamilyMembers as
select GetText(P.lastname) as lastname, List(GetText(P.firstname)) as firstnames
from Person P
group by GetText(P.lastname);

Das folgende Beispiel veranschaulicht die Verwendung der Funktionen Min und Max:

-- Extract stop words from input text
create view StopWords as
extract
regex /\s(the|in|a|an|as|to|from)\s/ on D.text as match
from Document D;


-- Count the number of times each stop word matched above, was used in the text
create view StopWordsCount as
select
GetText(S.match) as stopword,
Count(S.match) as stopwordcount
from StopWords S
group by GetText(S.match);

-- Retrieve the most used and least used stop word count
create view StopWordUsageCount as
        select Min(S.stopwordcount) as least, Max(S.stopwordcount) as most
from StopWordsCount S;

Vergleichselementfunktionen

Vergleichselementfunktionen testen ein bestimmtes Vergleichselement für die zugehörigen Eingabeargumente und geben einen entsprechenden booleschen Wert zurück.

Eingabeargumente zu Vergleichselementfunktionen umfassen Rückgabewerte anderer Skalarfunktionen oder Aggregatfunktionen sowie Wörterbücher, reguläre Ausdrücke und mehr. Diese Funktionen können innerhalb der Klausel where einer Anweisung select und der Klausel having einer Anweisung 'extract' verwendet werden.

und

Die Funktion And akzeptiert eine variable Anzahl von booleschen Argumenten und gibt die Ergebnisse einer logischen AND-Operation für alle Eingabeargumente zurück.

Das AQL-Optimierungsprogramm versucht nicht, die Reihenfolge der Auswertung der Argumente für diese Funktion als Teil der logischen Operation AND zu optimieren. Wenn eine Eingabe null ist, ist das Ergebnis null.

Sehen Sie sich das folgende Abfrageformat an:

select ...
from ...
where And(predicate1, predicate2);

Als Ergebnis wird ein Abfrageformat, das die Operation AND verwendet, häufig deutlich langsamer ausgeführt als dieselbe Abfrage in folgender Form:

select ...
from ...
where predicate1 and predicate2;

Wenn dies möglich ist, verwenden Sie anstelle dieser Funktion den SQL-Stil und das SQL-Schlüsselwort.

Enthält

Die Funktion Contains verwendet zwei Spans als Argumente:

Contains(<span1>, <span2>)

Diese Funktion gibt TRUE zurück, wenn span1 vollständig in span2 enthalten ist. Wenn span2 bei oder nach dem Anfang von span1 beginnt und an oder vor dem Ende von span1 endet, ist span2 vollständig enthalten. Wenn eines der Argumente null ist, gibt die Funktion null zurück.

ContainsDict

Die Funktion ContainsDict überprüft, ob der Text eines Span einen beliebigen Eintrag aus einem bestimmten Wörterverzeichnis enthält. Diese Funktion akzeptiert als Eingabeargumente ein Wörterverzeichnis, eine optionale Flagspezifikation und einen Span, der ausgewertet werden soll.

ContainsDict('<dictionary>', ['<flags>', ]<span>)

Die Funktion ContainsDict gibt TRUE zurück, wenn der Span ein oder mehrere Übereinstimmungen des Wörterverzeichnisses enthält. Die Flags können Exact oder IgnoreCase sein.

  • Bei Verwendung von Exact wird der Abgleich mit den Begriffen im Wörterverzeichnis unter Beachtung der Groß-/Kleinschreibung durchgeführt.
  • Bei Verwendung von IgnoreCase wird der Abgleich mit den Begriffen im Wörterverzeichnis ohne Berücksichtigung der Groß-/Kleinschreibung durchgeführt.
  • Wenn kein Flag angegeben wird, erfolgt der Abgleich auf der Basis der Flags, die bei der Erstellung des Wörterverzeichnisses angegeben wurden. Wurde bei der Erstellung kein Flag angegeben, wird für den Abgleich das Flag IgnoreCase verwendet.

Wenn der Span null ist, gibt die Funktion null zurück.

Das folgende Beispiel veranschaulicht die Verwendung der Funktion ContainsDict:

create dictionary EmployeePhoneDict as
(
 '121-222-2346', '121-234-1198', '121-235-8891'
);

create view PhoneNum as
extract regex /(\d{3})-(\d{3}-\d{4})/
    on between 4 and 5 tokens in D.text
    return
        group 1 as areaCode
        and group 2 as restOfNumber
        and group 0 as number
from Document D;

create view PhoneNumbers as
select P.number as number
from PhoneNum P
where ContainsDict('EmployeePhoneDict',P.number);

Wörterverzeichnisse werden stets an den Tokengrenzen ausgewertet. Wenn ein Wörterverzeichnis z. B. aus dem Begriff 'fish' besteht, gibt es im Text keine Übereinstimmung für 'Let's go fishing!'.

ContainsDicts

Die Funktion ContainsDicts überprüft, ob der Text eines Span einen beliebigen Eintrag aus bestimmten Wörterverzeichnissen enthält. Diese Funktion akzeptiert als Eingabeargumente zwei oder mehr Wörterverzeichnisse, eine optionale Flagspezifikation und einen Span, der ausgewertet werden soll.

ContainsDicts('<dictionary>','<dictionary>','<dictionary>', ['<flags>', ]<span>)

Die Funktion ContainsDicts gibt TRUE zurück, wenn der Span ein oder mehrere Übereinstimmungen aus mindestens einem der angegebenen Wörterverzeichnisse enthält. Die Flags können Exact oder IgnoreCase sein.

  • Bei Verwendung von Exact wird der Abgleich mit allen Begriffen in den Wörterverzeichnissen unter Beachtung der Groß-/Kleinschreibung durchgeführt.
  • Bei Verwendung von IgnoreCase wird der Abgleich mit allen Begriffen in den Wörterverzeichnissen ohne Berücksichtigung der Groß-/Kleinschreibung durchgeführt.
  • Wenn kein Flag angegeben wird, erfolgt der Abgleich auf der Basis der Flags, die bei der Erstellung des Wörterverzeichnisses angegeben wurden. Wurde bei der Erstellung kein Flag angegeben, wird für den Abgleich das Flag IgnoreCase verwendet.

Wenn eines oder beide Argumente null sind, gibt die Funktion null zurück.

Das folgende Beispiel veranschaulicht die Verwendung der Funktion ContainsDicts mit dem Flag Exact:

create view PersonWithFirstName as
select P.reference as reference
from Person P
where ContainsDicts(
'FirstNamesUsedGlobally',
'FirstNamesUsedInGermanyLong',
'NickNamesUsedGlobally',
'FirstNamesUsedInGermanyShort',
'FirstNamesUsedInItaly',
'FirstNamesUsedInFrance',
'Exact',
P.reference);

ContainsRegex

Die Funktion ContainsRegex überprüft, ob der Text eines Span mit einem bestimmten regulären Ausdruck übereinstimmt. Diese Funktion akzeptiert einen regulären Ausdruck, mit dem ein Abgleich erfolgen soll, eine optionale Flagspezifikation und den Eingabespan für den Abgleich.

ContainsRegex(/<regular expression>/, ['<flags>', ]<span>)

Die Funktion gibt TRUE zurück, wenn der Text des Span, der als separate Java™-Zeichenfolge behandelt wird, ein oder mehrere Übereinstimmungen mit dem regulären Ausdruck enthält. Die Funktion gibt null zurück, wenn der Span den Wert null hat. Die optionalen Flags wirken sich auf das Abgleichsverhalten aus, ähnlich wie bei Flags, die in regulären Java-Ausdrücken verwendet werden.

Die Flags-Zeichenfolge wird gebildet, indem eines oder mehrere der folgenden Flags unter Verwendung des Trennzeichens | kombiniert werden:

  • CANON_EQ
  • CASE_INSENSITIVE
  • DOTALL
  • LITERAL
  • MEHRZEILIG
  • UNICODE (bedeutungslos ohne CASE_INSENSITIVE)
  • UNIX_LINES

Beispiel für eine Flags-Zeichenfolge:

'UNICODE | CASE_INSENSITIVE'

Sehen Sie sich das folgende Beispiel an, in dem ContainsRegex Produktnamen zusammen mit ihrer Versionsnummer (auf beiden Seiten) identifiziert. Im Gegensatz zu dem Beispiel für MatchesRegex wird eine übereinstimmende Versionsnummer nicht durch Verwendung des regulären Ausdrucks (regex) identifiziert, sondern durch den Kontext um einen erwähnten Produktnamen, der ein Token enthält, das mit regex übereinstimmt.


-- dictionary of product names
create dictionary ProductNamesDict as
(
  'IBM WebSphere Application Server',
  'Microsoft Windows',
  'Apple Mac OS',
  'IBM Rational Application Developer',
  'Apache HTTP Server',
  'Eclipse',
  'Google Android'
);

-- extract product names from input text
create view ProductNames as
extract
  dictionary 'ProductNamesDict'
  on D.text as name
from Document D;

-- gather context around product name mention
create view ProductNamesWithContext as
select
  P.name as name,
  LeftContext(P.name, 5) as leftctxt,
  RightContext(P.name, 5) as rightctxt
from ProductNames P;

-- use a regex to identify products with version number mentions on either sides of the product mention
create view ProductsWithVersionNumbers as
(
  select
    P.name as productname,
    P.leftctxt as productversion
  from ProductNamesWithContext P
  where ContainsRegex (/v\d((\.\d)+)?/, P.leftctxt)
)
union all
(
  select
    P.name as productname,
    P.rightctxt as productversion
  from ProductNamesWithContext P
  where ContainsRegex (/v\d((\.\d)+)?/, P.rightctxt)
);

Ist gleich

Die Funktion Equals verarbeitet zwei Argumente eines beliebigen Typs:

Equals(<arg1>, <arg2>)

Zwei Spannweiten werden als identisch angesehen, wenn sie mit demselben Offset beginnen und enden und denselben Text enthalten. Wenn eines oder beide Argumente null sind, gibt die Funktion null zurück.

Das folgende Beispiel veranschaulicht die Verwendung der Funktion Equals.

-- Select phone number spans whose text is equal to 001-543-2217
create view PhoneNumber as
select P.number as number
from PhoneNum P
where Equals('001-543-2217',GetText(P.number));

Follows

Die Vergleichselementfunktion Follows verarbeitet zwei Span-Argumente und zwei Integer-Argumente.

Follows(<span1>, <span2>, <minchar>, <maxchar>)

Die Funktion gibt TRUE zurück, wenn die Anzahl der Zeichen zwischen dem Ende von span1 und dem Anfang von span2 zwischen minchar und maxchar (einschließlich) liegt. Wenn eines der Argumente null ist, gibt die Funktion null zurück.

FollowsTok

Die Vergleichselementfunktion FollowsTok ist eine Version von Follows. Die FollowsTok-Abstandsargumente sind jedoch nicht in Zeichen, sondern in Tokens angegeben:

FollowsTok(<span1>, <span2>, <mintok>, <maxtok>)

Die Funktion FollowsTok gibt TRUE zurück, wenn die Anzahl der Tokens zwischen dem Ende von span1 und dem Anfang von span2 zwischen mintok und maxtok (einschließlich) liegt. Wenn eines der Argumente null ist, gibt die Funktion null zurück.

GreaterThan

Die Vergleichselementfunktion GreaterThan verwendet zwei Argumente eines beliebigen Typs:

GreaterThan(<arg1>, <arg2>)

Die Funktion gibt TRUE zurück, wenn <arg1> größer als <arg2> ist. Die Funktion gibt FALSE zurück, wenn eines der beiden Argumente null ist.

Ist Null

Die Funktion IsNull prüft, ob Daten null sind oder nicht. Sie verwendet ein einzelnes Argument eines beliebigen Typs und gibt TRUE zurück, wenn das einzelne Argument null ist. Andernfalls wird FALSE zurückgegeben. Das Verhalten dieses Vergleichselements und des bereits definierten Vergleichselements NotNull unterscheidet sich von allen anderen Vergleichselementen, die bei Nulleingabe null zurückgeben.

MatchesDict

Die Funktion MatchesDict verwendet ein Wörterverzeichnis (wie in einer Wörterverzeichnisextraktion), eine optionale Flags-Spezifikation und einen Span als Argumente:

MatchesDict('<dictionary>', ['<flags>', ]<span>)

Die Funktion MatchesDict gibt TRUE zurück, wenn der Span genau mit einem oder mehreren Begriffen im Wörterverzeichnis übereinstimmt. Die Flags können Exact oder IgnoreCase sein.

  • Bei Verwendung von Exact wird der Abgleich mit den Begriffen im Wörterverzeichnis unter Beachtung der Groß-/Kleinschreibung durchgeführt.
  • Bei Verwendung von IgnoreCase wird der Abgleich mit den Begriffen im Wörterverzeichnis ohne Berücksichtigung der Groß-/Kleinschreibung durchgeführt.
  • Wenn kein Flag angegeben wird, erfolgt der Abgleich auf der Basis der Flags, die bei der Erstellung des Wörterverzeichnisses angegeben wurden. Wurde bei der Erstellung kein Flag angegeben, wird für den Abgleich das Flag IgnoreCase verwendet.

Wenn eines der Argumente null ist, gibt die Funktion null zurück.

Wörterverzeichnisse werden stets an den Tokengrenzen ausgewertet. Wenn ein Wörterverzeichnis z. B. aus dem Begriff 'fish' besteht, gibt es im Text keine Übereinstimmung für 'Let's go fishing!'.

MatchesRegex

Die Funktion MatchesRegex hat eine ähnliche Syntax wie ContainsRegex. Im Gegensatz zu der Funktion ContainsRegex gibt die Funktion MatchesRegex aber nur dann den Wert TRUE zurück, wenn der gesamte Text des Span - als separate Java-Zeichenfolge - dem regulären Ausdruck entspricht. Wenn eines der Argumente null ist, gibt die Funktion null zurück. Die optionalen Flags wirken sich auf das Abgleichsverhalten aus, ähnlich wie bei Flags, die in regulären Java-Ausdrücken verwendet werden.

MatchesRegex(/<regular expression>/, ['<flags>', ]<span>)

Die Flags-Zeichenfolge wird gebildet, indem eine Teilmenge dieser Flags unter Verwendung des Trennzeichens | kombiniert werden:

  • CANON_EQ
  • CASE_INSENSITIVE
  • DOTALL
  • LITERAL
  • MEHRZEILIG
  • UNICODE (bedeutungslos ohne CASE_INSENSITIVE)
  • UNIX_LINES

Beispiel für eine Flags-Zeichenfolge:

'UNICODE | CASE_INSENSITIVE'

Sehen Sie sich das folgende Beispiel an, in dem MatchesRegex verwendet wird, um Produktnamen zusammen mit ihrer Versionsnummer (auf der rechten Seite) zu identifizieren. Im Gegensatz zu dem Beispiel im Abschnitt ContainsRegex wird die genaue Versionsnummer als das Token angegeben, das unmittelbar nach der Erwähnung des Produktnamens angegeben ist.

-- gather right context around product name mention
create view ProductNamesWithContext as
select
  P.name as name,
  RightContext(P.name, 5) as rightctxt
from ProductNames P;

-- use a regex to identify products with version number mentions to the right
create view ProductsWithVersionNumbers as
select
  P.name as productname,
  P.rightctxt as productversion
from ProductNamesWithContext P
where MatchesRegex (/v\d((\.\d)+)?/, P.rightctxt);

NOT

Die Funktion Not verwendet ein einzelnes boolesches Argument und gibt das Komplement (Gegenstück) zurück. Wenn das Argument null ist, gibt die Funktion null zurück.

Nicht Null

Die Funktion NotNull verwendet ein einzelnes Argument eines beliebigen Typs.

Wie der Name vermuten lässt, gibt die Funktion NotNull den Wert TRUE zurück, wenn der Wert des Arguments nicht null ist, und FALSE, wenn das Argument null ist.

Oder

Die Funktion Or verwendet eine variable Anzahl von booleschen Argumenten, die nicht null sind. Wenn eines der Argumente null ist, gibt die Funktion null zurück.

Die Funktion Or gibt den Wert TRUE zurück, wenn eines der Argumente den Wert TRUE hat.

Überlappungen

Die Funktion Overlaps verwendet zwei Span-Argumente:

Overlaps(<span1>, <span2>)

Die Funktion gibt TRUE zurück, wenn sich die beiden Eingabespans im Dokumenttext überschneiden. Die Funktion gibt null zurück, wenn eines der Argumente null ist.

Skalarfunktionen

Skalarfunktionen führen eine Operation für die Werte eines Felds in einer Gruppe von Eingabetupeln aus und geben einen nicht booleschen Wert zurück, z. B. Span, Text oder Integer. Diese Funktionen können in der select-Liste einer Anweisung select oder einer Anweisung extract verwendet werden. Sie können auch als Eingabe für Vergleichselementfunktionen verwendet werden.

Wenn ein Objekt des Typs 'Text' angegeben wird, wo eigentlich ein Objekt des Typs 'Span' benötigt wird, wird automatisch ein konvertiertes Objekt des Typs 'Span' generiert, das auf diesem Objekt des Typs 'Text' basiert, wobei der Offset für den Anfang und das Ende der gesamten Länge des Objekts des Typs 'Text' angegeben wird.

Wenn ein Objekt des Typs 'Span' angegeben wird, wo eigentlich ein Objekt des Typs 'Text' benötigt wird, wird automatisch ein konvertiertes Objekt des Typs 'Text' aus dem Textwert des Objekts des Typs 'Span' generiert.

Chomp

Die Funktion Chomp funktioniert ähnlich wie der Operator Chomp in Perl, mit der Ausnahme, dass Chomp mit Spans anstelle von Zeichenfolgen arbeitet:

Chomp(<span1>)

Das folgende Beispiel veranschaulicht die Verwendung der Funktion Chomp.

detag Document.text as DetaggedDoc
annotate
element 'a' as Anchor
with attribute 'href' as linkTarget;

create view Links as
select Chomp(A.linkTarget) as link
from Anchor A;

Wenn der Eingabespan ein Leerzeichen am Anfang oder Ende enthält, verkleinert die Funktion Chomp den Span, damit das Leerzeichen entfernt werden kann. Die Funktion gibt dann einen neuen Span zurück, der kein führendes oder abschließendes Leerzeichen enthält. Wenn der Eingabespan kein führendes oder abschließendes Leerzeichen enthält, gibt die Funktion Chomp denselben Span zurück. Wenn der Eingabespan null ist, gibt 'Chomp' den Wert null zurück.

CombineSpans

Die Funktion CombineSpans verwendet zwei Spans als Eingabe und gibt den kürzesten Span zurück, der beide Eingabespans vollständig abdeckt, wenn die Spans auf demselben Textobjekt basieren.

CombineSpans(['IgnoreOrder',] <span1>, <span2>)

Bei der Funktion CombineSpans ist die Reihenfolge der Eingabespans nicht beliebig, es sei denn, Sie verwenden den Parameter 'IgnoreOrder'. Wenn der optionale Parameter 'IgnoreOrder' verwendet wird, wird die Reihenfolge der beiden Spans ignoriert.

Das folgende Beispiel veranschaulicht die Verwendung der Funktion CombineSpans.

create view FullName as
     select
             CombineSpans('IgnoreOrder',F.name, L.name) as fullName
     from
             FirstName F,
             LastName L
     where
             FollowsTok(F.name, L.name, 0,0);

Die Semantik der Funktion lautet wie folgt:

  • Wenn span1 oder span2 den Wert null hat oder die beiden Spans sich über verschiedene Objekte des Typs 'Text' erstrecken, gibt die Funktion null zurück.
  • Andernfalls, wenn span1 kleiner als span2 ist oder der Parameter IgnoreOrder verwendet wird, gibt die Funktion den kürzesten Span zurück, der sowohl span1 als auch span2 abdeckt.
  • Andernfalls - wenn span1 größer als span2 ist und IgnoreOrder nicht verwendet wird - gibt die Funktion einen Laufzeitfehler zurück.

Abhängig von der Definition von Span sind die verschiedenen Szenarios von Argumenten für die Funktion CombineSpans wie folgt:

  • Bereich 2 liegt immer hinter Bereich 1. Mit anderen Worten: Die Reihenfolge von links nach rechts wird beibehalten:

    CombineSpans([0,7], [3,7]) returns the span [0,7]
    CombineSpans([0,7], [8,10]) returns the span [0,10]
    CombineSpans([0,7], [3,6]) returns the span [0,7]
    CombineSpans([0,7], [0,7]) returns the span [0,7]
    
  • Bereich 2 liegt nicht hinter Bereich 1. Mit anderen Worten wird die Reihenfolge von links nach rechts Nicht beibehalten:

    CombineSpans(‘IgnoreOrder’, [0,10], [0,7]) returns the span [0,10]
    CombineSpans(‘IgnoreOrder’, [3,6], [0,7]) returns the span [0,7]
    CombineSpans(‘IgnoreOrder’, [3,7], [0,7]) returns the span [0,7]
    CombineSpans(‘IgnoreOrder’, [8,10], [0,7]) returns the span [0,10]
    CombineSpans([3,6], [0,7]) will result in Runtime error as the IgnoreOrder flag has not been specified.
    

GetBegin und GetEnd

Die Funktion GetBegin verwendet ein einzelnes Span-Argument und gibt den Anfangsoffset des Eingabespan zurück.

Beispiel:

GetBegin([5, 10])

Dies gibt den Wert 5 zurück.

Ebenso gibt die Funktion GetEnd den Endoffset des zugehörigen Eingabespan zurück.

Das folgende Beispiel veranschaulicht die Verwendung der Funktionen GetBegin und GetEnd.

create view PersonOffsets as
select GetBegin(P.name) as offsetBegin, GetEnd(P.name) as offsetEnd
from Person P;

Für beide dieser Funktionen gibt die Funktion null zurück, wenn das Argument null ist.

GetLanguage

Die Funktion GetLanguage verwendet ein einzelnes Span-Argument und gibt den aus zwei Buchstaben bestehenden Sprachencode des Quellentexts des Span zurück. Wenn das Argument null ist, gibt die Funktion null zurück.

Diese Anweisung erzeugt nur dann sinnvolle Ergebnisse, wenn die Datenquelle die Textfelder mit den richtigen Sprachen markiert.

GetLemma

Die Funktion GetLemma verwendet ein einzelnes Objekt des Typs 'Span' oder 'Text' als Argument und gibt eine Zeichenfolge zurück, die die lemmatisierte Form des Eingabespan enthält. Wenn das Argument null ist, gibt die Funktion null zurück. Bei Wörterverzeichniseinträgen für den Lemma-Abgleich kann diese Funktion die lemmatisierte Form der verschiedenen Tokens bestimmen, wie sie vom Tokenizer zurückgegeben werden. Beispiel: Für den Span went shopping gibt 'GetLemma' die Lemma-Zeichenfolge go shop zurück.

Die Ergebnisse dieser Funktion folgen den folgenden Regeln:

  • Wenn der Eingabebereich am Anfang eines Tokens beginnt und am Ende eines Tokens endet, enthält das Ergebnis die Folge von Lemmata, die mit dem Lemma des ersten Tokens beginnt, gefolgt von einem Leerzeichen, gefolgt vom Lemma des zweiten Tokens, gefolgt von einem Leerzeichen usw. (z. B. Hund Katze Fischvogel ...). Wenn das Lemma für ein Token aus Leerzeichen besteht, müssen Sie die Leerzeichen mit dem Backslash-Zeichen ( \ ) als Escapezeichen versehen.
  • Wenn der Eingabespan mit Leerzeichen beginnt oder endet (z. B. wenn er zwischen zwei Tokens beginnt oder zwischen zwei Tokens endet), ignoriert die Funktion das Leerzeichen am Anfang und am Ende.den abschließenden Leerzeichen.
  • Wenn der Eingabespan in der Mitte eines Tokens beginnt oder endet, besteht die Ausgabe aus dem folgenden Inhalt (in der angegebenen Reihenfolge und getrennt durch ein Leerzeichen):
    • Die Oberflächenform des ersten Teiltokens (falls vorhanden).
    • Die Sequenz der Lemmata, die dem ersten und letzten vollständigen Token entsprechen. Wenn das Lemma für ein beliebiges der vollständigen Tokens aus Leerzeichen besteht, müssen Sie die Leerzeichen mit dem Backslash-Zeichen ( \ ) als Escapezeichen versehen.
    • Die Oberflächenform des letzten Teiltokens (falls vorhanden).

Diese Funktion gibt einen Fehler zurück, wenn der verwendete Tokenizer nicht in der Lage ist, Lemmas zu erzeugen.

Mit der Funktion GetLemma() können Sie Wörterverzeichnisse mit lemmatisierten Formen erstellen. Rufen Sie GetLemma() bei einer Eingabe auf, die die Begriffe enthält, deren lemmatisierte Form Sie in das Wörterverzeichnis aufnehmen möchten.

GetLength

Die Funktion GetLength verwendet ein einzelnes Span-Argument und gibt die Länge des Eingabespan zurück. Wenn das Argument null ist, gibt die Funktion null zurück.

Beispiel:

GetLength([5, 12])

Dies gibt den Wert 7 zurück.

GetLengthTok

Die Funktion GetLengthTok verwendet ein einzelnes Span-Argument und gibt die Länge des Eingabespan in Tokens zurück. Wenn das Eingabeargument null ist, gibt die Funktion null zurück.

GetString

Die Funktion GetString verwendet ein einzelnes AQL-Objekt als Argument und gibt ein Objekt des Typs 'Text' zurück, das aus der Zeichenfolgedarstellung des Objekts gebildet wird.

Bei Argumenten des Typs 'Span' und 'Text' unterscheiden sich der zurückgegebenen Werte von den Werten, die von GetText() zurückgegeben werden. Bei Objekten des Typs 'Text' enthält der zurückgegebene Wert die einzelnen Anführungszeichen, die die Textzeichenfolge umgeben. Bei Objekten des Typs 'Span' enthält der zurückgegebene Wert außerdem Offsets in eckigen Klammern.

Bei Skalarlisten gibt diese Funktion die Werte für GetString() der Elemente der Liste zurück, die mit Semikolons verknüpft sind. Für Argument des Typs 'Integer', 'Float', 'Boolean' und 'String' gibt diese Funktion den Wert des Arguments als Zeichenfolge zurück. Für null-Argumente gibt diese Funktion den Wert null zurück.

GetText

Die Funktion GetText verwendet ein einzelnes Objekt des Typs 'Span' oder 'Text' als Argument. Für die Span-Eingabe gibt er das Textobjekt auf der Basis der tatsächlichen Textzeichenfolge zurück, die der Span markiert. Für die Texteingabe wird das Eingabetextobjekt zurückgegeben. Wenn die Eingabe null ist, gibt diese Funktion null zurück. Beispiel:

GetText([5, 12])

Der Span gibt die Unterzeichenfolge des Dokuments von der Zeichenposition 5 - 12 zurück.

Die Funktion GetText hat zwei primäre Verwendungen.

Testen der Zeichenfolgegleichheit zwischen dem Text, der von zwei Spans markiert wird

-- Create a dictionary of company names
create dictionary CompanyNames as
('IBM', 'BigCorp', 'Initech');

-- Find all matches of the company names dictionary.
create view Company as
extract
    dictionary 'CompanyNames' on D.text as company
from Document D;


-- Create a table that maps company names to locations of
-- corporate headquarters.
create table NameToLocation (name Text, location Text) as
values
    ('IBM', 'USA'),
    ('BigCorp', 'Apex'),
    ('Initech', 'Dallas'),
    ('Acme Fake Company Names', 'Somewhere');

-- Use the table to augment the Company view with location
-- information.
create view CompanyLoc as
select N2C.location as loc, C.company as company
from Company C, NameToLocation N2C
where Equals(GetText(C.company), GetText(N2C.name));

output view CompanyLoc;

Aufteilen eines Dokuments in kleinere Unterdokumente

Wenn das Hauptdokument zum Beispiel ein Blog ist, der aus mehreren Blogeinträgen besteht, können Sie GetText verwenden, um ein Unterdokument für jeden Blogeintrag zu erstellen.

detag Document.text as DetaggedBlog
annotate
    element 'blog' as Blog
    with attribute 'name' as title;


create view BlogEntry as
select B.match as entry, B.title as title
from Blog B;

-- Turn each tuple in the BlogEntry view into a sub-document
create view BlogEntryDoc as
select GetText(B.title) as title, GetText(B.entry) as body
from BlogEntry B;

output view BlogEntryDoc;

--Dictionary for Companies
create dictionary CompanyNameDict as
(
    'A Corporation', 'B Corporation'
);

-- Run an extraction over the sub-documents.
-- The spans that this "extract" statement creates will have
-- offsets relative to the blog entries themselves, as opposed
-- to the original multi-entry document.
create view CompanyName as
extract dictionary 'CompanyNameDict' on B.body as name
from BlogEntryDoc B;

output view CompanyName;

LeftContext und RightContext

Die Funktion LeftContext verwendet einen Span und eine ganze Zahl (Integer) als Eingabe:

LeftContext(<input span>, <nchars>)

Die Funktion LeftContext(<input span\>, <nchars\>) gibt einen neuen Bereich zurück, der die nchars-Zeichen des Dokuments direkt links von <input span\> enthält. Wenn der Eingabebereich weniger als <nchars\> Zeichen vom Anfang des Dokuments beginnt, gibt LeftContext() einen Bereich zurück, der am Anfang des Dokuments beginnt und bis zum Anfang des Eingabebereich fortgesetzt wird.

Zum Beispiel gibt LeftContext([20, 30], 10) den Span [10, 20] zurück. Der Span LeftContext([5, 10], 10) gibt [0, 5] zurück.

Wenn die Eingabe mit dem ersten Zeichen des Dokuments beginnt, gibt LeftContext() einen Span mit einer Länge von null zurück. Entsprechend gibt die Funktion RightContext den Text rechts von der Eingabespan zurück. Wenn eines der Argumente bei den beiden Funktionen null ist, gibt die Funktion null zurück.

LeftContextTok und RightContextTok

Die Funktionen LeftContextTok und RightContextTok sind Versionen von LeftContext und RightContext, die Abstände in Form von Tokens verwenden:

LeftContextTok(<input span>, <num tokens>)
RightContextTok(<input span>, <num tokens>)

Das folgende Beispiel veranschaulicht die Verwendung der Funktion RightContextTok.

create view Salutation as
extract
 regex /Mr\.|Ms\.|Miss/
  on D.text as salutation
  from Document D;

--Select the token immediately following a Salutation span
create view NameCandidate as
select RightContextTok(S.salutation, 1) as name
from Salutation S;

Wenn eines der Argumente bei den beiden Funktionen null ist, gibt die Funktion null zurück.

Remap

Die Funktion Remap verwendet ein einzelnes Span-Argument:

Remap(<span>)

Wenn sich der Eingabespan auf ein Textobjekt bezieht, das durch die Umwandlung eines anderen Textobjekts generiert wurde, konvertiert die Funktion Remap den Span in einen Span, der sich auf den ursprünglichen "Quellentext" bezieht.

Beispiel: Wenn sich der Wert für den Span N.name auf ein mit Detag bearbeitetes Dokument bezieht, das durch Ausführen von HTML über die AQL-Anweisung detag generiert wird, dann gibt

Remap(<N.name>)

einen äquivalenten Span über das ursprüngliche HTML zurück.

Wenn das Span-Argument erstellt wurde, indem die Anweisung detag für ein leeres Dokument ausgeführt wurde, ordnet die Funktion die Spans wieder dem Anfang des Dokuments (d. h. Document.text[0-0]) zu. Auch wenn die Anweisung detag eine leere Zeichenfolge generiert, ordnet die Funktion die Spans wieder dem Anfang des Dokuments zu. Die einzige Komponente von AQL, die ein solches abgeleitetes Textobjekt generiert, ist die Anweisung detag.

Das folgende Beispiel veranschaulicht die Verwendung der Funktion Remap:

-- Detag the HTML document and annotate the anchor tags
detag Document.text as DetagedDoc
    annotate
    element 'a' as Anchor;

-- Remap the Anchor Tags
create view AnchorTag as
select Remap(A.match) as anchor
from Anchor A;

Wenn das Argument für Remap kein abgeleitetes Textobjekt oder ein Span für ein abgeleitetes Textobjekt ist, generiert die Funktion einen Fehler. Wenn das Argument null ist, gibt die Funktion null zurück.

SpanBetween

Die Funktion SpanBetween verwendet zwei Spans als Eingabe und gibt den Span zurück, der den Text zwischen den beiden Bereichen exakt abdeckt, wenn die Spans auf demselben Textobjekt basieren, und sie gibt null zurück, wenn sie auf verschiedenen Textobjekten basieren:

SpanBetween(['IgnoreOrder',] <span1>, <span2>)

Wenn der optionale Parameter IgnoreOrder verwendet wird, wird die Reihenfolge der beiden Spans vom AQL-Compiler ignoriert.

Wenn zwischen den beiden Bereichen kein Text vorhanden ist, gibt SpanBetween einen leeren Bereich zurück, der am Ende von <span1> beginnt.

Wie CombineSpans berücksichtigt auch  SpanBetween die Reihenfolge der Eingaben, sofern Sie nicht den Parameter IgnoreOrder verwenden. Das heißt,

SpanBetween([5, 10], [50, 60])

gibt den Span [10, 50] zurück, während

SpanBetween([50, 60], [5, 10])

den Span [60, 60] zurückgibt.

Wenn das Argument für SpanBetween den Wert null hat, gibt die Funktion null zurück.

SpanIntersection

Die Funktion SpanIntersection verwendet zwei Spans als Eingabe und gibt einen Span zurück, der den Text abdeckt, den beide Eingaben abdecken, wenn die Spans auf demselben Textobjekt basieren, und gibt null zurück, wenn sie auf verschiedenen Textobjekten basieren:

SpanIntersection(<span1>, <span2>)

Beispiel:

SpanIntersection([5, 20], [10, 60])

gibt den Span [10, 20] zurück, während

SpanIntersection([5, 20], [7, 10])

den Span [7, 10] zurückgibt.

Wenn sich die beiden Spans nicht überlappen, gibt 'SpanIntersection' den Wert null zurück. Wenn einer der Spans null ist, gibt die Funktion null zurück.

SubSpanTok

Die Funktion SubSpanTok verwendet als Eingabe einen Span und ein Paar von Span-Offsets:

SubSpanTok(<span>, <first_tok>, <last_tok>)

Wie der Name der Funktion vermuten lässt, sind die Argumente <first_tok> und <last_tok> Distanzen in Tokens, je nachdem, für welchen Tokenizer das System konfiguriert ist.

Die Funktion SubSpanTok gibt einen neuen Span zurück, der den angegebenen Tokenbereich (inklusive) innerhalb des Eingabespan abdeckt. Wenn der angegebene Bereich innerhalb des Span beginnt und über das Ende des Span hinausgeht, wird der Teil des Bereichs zurückgegeben, der enthalten ist. Wenn <first_tok> einen Abstand über den Zielbereich hinaus darstellt, gibt SubSpanTok einen Bereich mit einer Länge von null zurück, der am Anfang des Eingabebereichs beginnt.

Wenn eine der Eingaben null ist, gibt die Funktion null zurück.

ToLowerCase

Die Funktion ToLowerCase verwendet ein einzelnes Objekt als Argument und gibt eine Zeichenfolgedarstellung des Objekts in Kleinschreibung zurück. Die Konvertierung in eine Zeichenfolge erfolgt genauso, wie die Funktion GetString() die Konvertierung vornimmt.

Die primäre Verwendung dieser Funktion besteht darin, Gleichheitsverknüpfungen durchzuführen, bei denen die Groß-/Kleinschreibung nicht beachtet werden muss:

where Equals(ToLowerCase(C.company), ToLowerCase(N2C.name))

Wenn das Eingabeobjekt null ist, gibt die Funktion null zurück.

Anweisung create function

Wenn Sie Operationen für extrahierte Werte ausführen möchten, die nicht durch AQL unterstützt werden, können Sie angepasste Funktionen definieren, die in Extraktionsregeln verwendet werden. Diese Funktionen werden als benutzerdefinierte Funktionen (User-defined Functions, UDF) bezeichnet.

AQL unterstützt benutzerdefinierte Skalarfunktionen und benutzerdefinierte Tabellenfunktionen. Java™ und PMML sind die einzigen unterstützten Implementierungssprachen für UDFs. Eine Skalarfunktion gibt einen einzelnen skalaren Wert zurück und eine Tabellenfunktion gibt ein oder mehrere Tupel (d. h. eine Tabelle) zurück.

Sie implementieren benutzerdefinierte Funktionen (UDFs), indem Sie vier Schritte ausführen:

  1. Implementieren der Funktion.

    AQL unterstützt benutzerdefinierte Funktionen (UDFs), die in Java oder PMML implementiert sind.

  2. Deklarieren der Funktion in AQL.

    Mithilfe der Anweisung create function können Sie die benutzerdefinierten Skalarfunktionen und die Machine Learning-Modelle aus den PMML-Dateien für AQL bereitstellen.

  3. Verwenden der Funktion in AQL.

    Benutzerdefinierte Funktionen arbeiten mit AQL-Anweisungen und -Klauseln.

  4. Debugging bei der UDF.

    Da Java-basierte, benutzerdefinierte Funktionen (UDFs) als öffentliche Methoden in Java-Klassen implementiert werden, debuggen Sie Ihre UDFs auf dieselbe Weise, wie Sie Ihre Java-Programme debuggen.

Benutzerdefinierte Funktionen implementieren

AQL unterstützt benutzerdefinierte Funktionen (UDFs), die in Java™ oder PMML implementiert sind.

Dieser Abschnitt befasst sich speziell auf UDFs, die in Java implementiert sind. Für UDFs, die in PMML implementiert sind, wird das Machine Learning-Modell in der PMML-XML-Datei gespeichert. Informationen zum Erstellen dieser Modelle finden Sie in der PMML-Dokumentation: [http://dmg.org/pmml/v4-1/GeneralStructure.html]

Sie können eine benutzerdefinierte Skalarfunktion als öffentliche Methode in einer Java-Klasse implementieren. Sie können eine benutzerdefinierte Tabellenfunktion als öffentliche Methode in einer Java-Klasse implementieren, die die API com.ibm.avatar.api.udf.TableUDFBase erweitert. Darüber hinaus kann eine eine benutzerdefinierte Tabellenfunktion optional die Methode initState() der Superklasse com.ibm.avatar.api.udf.TableUDFBase überschreiben.

Wenn die UDF eine Eingabeparameter des Typs 'Span', 'Text' oder 'ScalarList' hat oder wenn der Rückgabetyp der UDF 'Span', 'Text' oder 'ScalarList' ist, muss die Java-Klasse die Klassen com.ibm.avatar.algebra.datamodel.Span, com.ibm.avatar.algebra.datamodel.Text oder com.ibm.avatar.algebra.datamodel.ScalarList für die Kompilierung importieren.

Für Tabellenfunktionen sind zusätzliche APIs erforderlich, um Informationen zum Ausgabeschema bereitzustellen. Diese APIs gehören zu der Basisklasse com.ibm.systemt.api.udf.TableUDFbase. Wenn eine Unterklasse mehr als eine Tabellenfunktion enthält, wird für jede Instanz ein separates Java-Objekt erstellt.

Für den UDF-Code ist getResourceAsStream() die einzige unterstützte Methode zum Abrufen von Ressourcen, die keine Klassen sind, aus der zugehörigen JAR-Datei. Andere Methoden für den Zugriff auf Ressourcen (wie z. B. getResource(), getResources(), getSystemResource()) werden nicht unterstützt. Beispiel: Eine UDF-JAR-Datei, die die Eigenschaftendatei my.properties im Paket com.ibm.myproject.udfs enthält, kann darauf mit der folgenden Java-Anweisung zugreifen:

InputStream in = this.getClass().getClassLoader().
  getResourceAsStream(“com/ibm/myproject/udfs/my.properties”);

Lebenszyklus von benutzerdefinierten Funktionen, die in Java implementiert sind

Die folgenden Operationen werden ausgeführt, wenn der Extraktor für jede Anweisung 'create function' genau einmal in AQL kompiliert (API CompileAQL.compile()), instanziiert (API OperatorGraph.createOG()) und validiert (API OperatorGraph.validateOG()) wird:

  1. Laden Sie die Java-Klasse, die die UDF-Methode enthält, mit einem ganz neuen Klassenladeprogramm. Die Klasse wird innerhalb der UDF-JAR-Datei gesucht, die in der entsprechenden Anweisung 'create function' angegeben ist. Alle anderen Klassen, die beim Laden dieser Klasse erforderlich sind, werden ebenfalls in derselben UDF-JAR gesucht. Falls sie nicht gefunden wird, wird die Suche an den Klassenlader delegiert, der die Laufzeit instanziiert hat.
  2. Erstellen Sie eine Instanz dieser Klasse.
  3. Rufen Sie für benutzerdefinierte Tabellenfunktionen die Methode initState() auf.

Da diese Schritte für jede Anweisung 'create function' ausgeführt werden, wenn eine Java-Klasse mehrere UDF-Methoden enthält (und alle Methoden in AQL in verschiedenen Anweisung 'create function' verwendet werden), wird die Klasse mehrfach geladen, und zwar jedes Mal in einem separaten Klassenladeprogramm (Schritt 1). Darüber hinaus werden mehrere Instanzen der Klasse erstellt (Schritt 2) und die Methode initState() wird einmal für jede Instanz aufgerufen (Schritt 3). Dadurch, dass alle UDF-Ergebnisse zu einem separaten Klassenladeprogramm führen, soll ermöglicht werden, dass unterschiedliche UDFs verschiedene Versionen derselben Klasse (oder Bibliothek) verwenden können.

Während der Laufzeit (API OperatorGraph.execute()) wird die UDF-Klasse nicht erneut geladen, da die Klasse bereits während der Extraktorinstanziierung geladen wurde. Die Java-Methode, die die UDF implementiert, wird bei Bedarf aufgerufen, um Teil der Ausgabe zu berechnen. Wenn der Extraktor in einem einzelnen Thread verwendet wird, bedeutet dies, dass für jedes Eingabedokument null bis sehr viele Aufrufe für jedes Eingabedokument erfolgen (und höchstwahrscheinlich zahlreiche Aufrufe während der gesamten Lebensdauer des Operatordiagrammobjekts). Wenn der Extraktor über mehrere Threads gemeinsam genutzt wird, können verschiedene Threads ungefähr zur selben Zeit auf die Methode (mit verschiedenen Eingaben) treffen.

Wenn ein bestimmter Teil des UDF-Codes genau einmal ausgewertet werden muss, um beispielsweise Datenstrukturen zu initialisieren, die von der UDF-Methode für verschiedene Aufrufe benötigt werden, sollte dieser Code nicht in die UDF-Auswertungsmethode eingefügt werden, da diese Methode wahrscheinlich mehrmals während der Lebensdauer des Extraktors (wie das Operatordiagrammobjekt) ausgeführt wird und nahezu gleichzeitig erreicht werden kann, wenn der Extraktor von mehreren Threads gemeinsam genutzt wird. Gehen Sie stattdessen wie folgt vor:

  1. Folgen Sie bei benutzerdefinierten Skalarfunktionen den Standardverfahren für die Java-Programmierung. Platzieren Sie den Code beispielsweise in einem statischen Block.
  2. Bei benutzerdefinierten Tabellenfunktionen platzieren Sie den Code in der Methode initState() oder folgen Sie den Standardverfahren für die Java-Programmierung. Platzieren Sie den Code beispielsweise in einem statischen Block.

Dabei ist zu beachten, dass die Klasse während der Extraktorkompilierung, der Instanziierung und Validierung mehrfach geladen werden kann, wie in den oben beschriebenen Schritten 1 bis 3 erläutert wurde. Wenn der Code, der die UDF initialisiert, in einem statischen Block platziert wird, wird dieser Code jedes Mal ausgeführt, wenn die Klasse geladen wird (möglicherweise mehrmals), woraus sich ein zusätzlicher Systemaufwand bei der Kompilierung und Operatordiagramminstanziierung ergibt. Wenn der Systemaufwand groß ist, folgen Sie diesen Empfehlungen (Best Practices):

  • Um den Systemaufwand während der Kompilierung zu minimieren, empfiehlt es sich, Ressourcen, die viel Kompilierzeit in Anspruch nehmen ( wie z. B. umfangreiche Wörterverzeichnisse oder UDFs mit aufwendiger Initialisierung) in einem separaten AQL-Modul zu kompilieren und sie zu exportieren. Versuchen Sie, nur die AQL-Module zu kompilieren, die sich geändert haben, sowie die Module, die von ihnen abhängig sind.
  • Gehen Sie wie folgt vor, um den Systemaufwand bei der Instanziierung und Validierung des Operatordiagramms zu minimieren:
    1. Wenn der Initialisierungscode von einer einzelnen UDF-Methode benötigt wird, platzieren Sie diese UDF-Methode in einer separaten Java-Klasse (und platzieren Sie den instanziierungsintensiven Code in einem statischen Initialisierungsprogramm wie zuvor oder verwenden Sie einen anderen Mechanismus, der sicherstellt, dass der Code einmal ausgeführt wird).
    2. Wenn der Initialisierungscode von mehreren UDF-Methoden gemeinsam genutzt wird, stellen die Laufzeitumgebung und AQL keinen expliziten Mechanismus bereit, um sicherzustellen, dass der Initialisierungscode genau einmal ausgeführt wird. Wenn die Initialisierungszeit in einer solchen Situation nicht zumutbar ist, ist es die einzige Lösung, die gemeinsam genutzten Ressourcen und den Initialisierungscode in den Systemklassenpfad zu stellen. Das heißt, der Initialisierungscode wird in einer neuen Klasse MySeparateClass.java platziert und das Initialisierungsergebnis wird in einer statischen Variablen dieser Klasse gespeichert, wie z. B. MySeparateClass.myVar. Packen Sie MySeparateClass.java zusammen mit allen Ressourcen, die während der Initialisierung benötigt werden, in einer JAR-Datei und stellen Sie diese JAR-Datei in den Systemklassenpfad. Die UDF-Methoden können mit der statischen Variablen MySeparateClass.myVar auf das initialisierte Modell verweisen. Der Initialisierungscode wird jetzt genau einmal ausgeführt - nämlich dann, wenn die Klasse MySeparateClass.java vom Klassenladeprogramm des Systems geladen wird.

Tipp:

Die kompilierte Darstellung eines Moduls (die Datei .tam ) enthält den serialisierten Binärcode der UDF. Daher wird der UDF-Code in der kompilierten Darstellung der beiden Module serialisiert, wenn derselbe UDF-Code durch create function-Anweisungen in zwei verschiedenen Modulen referenziert wird. Mit anderen Worten: Der UDF-Code wird zweimal serialisiert. In solchen Fällen können Sie die Redundanz vermeiden, indem Sie ein separates Modul erstellen, das als eine Bibliothek von UDFs fungiert, und diese Bibliothek in anderen Modulen wiederverwenden. Führen Sie die folgenden Schritte aus, um eine Bibliothek von UDFs zu erstellen:

  1. Erstellen Sie ein Modul.
  2. Stellen Sie alle UDF-JAR-Dateien in dieses Modul.
  3. Definieren Sie alle erforderlichen Funktionen mit den create function-Anweisungen.
  4. Exportieren Sie sie alle mit export function-Anweisungen, damit sie in anderen Modulen importiert und verwendet werden können.

Beispiele

Beispiel 1: Benutzerdefinierte Skalarfunktion implementieren

Dieses Beispiel zeigt die Implementierung einer benutzerdefinierten Skalarfunktion mit dem Namen toUpperCase. Diese benutzerdefinierte Funktion (UDF) verwendet als Eingabe einen Wert des Typs 'Span' und gibt einen Zeichenfolgewert aus, der aus dem in Großschreibung konvertierten Textinhalt der Eingabespan besteht.

package com.ibm.biginsights.textanalytics.udf;
import com.ibm.avatar.algebra.datamodel.Span;

/**
  * @param s input Span
  * @return all upper-case version of the text of the input Span
  */
public String toUpperCase(Span s) {
  return s.getText().toUpperCase();
}

Beispiel 2: Benutzerdefinierte Skalarfunktion implementieren, die eine Tabelle als Eingabe verwendet

Dieses Beispiel zeigt die Implementierung einer benutzerdefinierten Skalarfunktion mit dem Namen TableConsumingScalarFunc. Diese benutzerdefinierte Funktion (UDF) verwendet als Eingabe zwei Listen von Tupeln und gibt einen Zeichenfolgewert aus, der den Inhalt der beiden eingegebenen Tupellisten verkettet.

import com.ibm.avatar.algebra.datamodel.TupleList;

/**
  * Example implementation of a user-defined scalar function using a table as input
*/
public class TableConsumingScalarFunc
{

  /**
    * Main entry point to the `scalar` function. This function takes two lists of tuples and concatenates them into a single string.
    *
    * @param arg1 first set of tuples to merge
    * @param arg2 second set of tuples to merge
    * @return the two sets of tuples, concatenated
    */
  public String eval (TupleList arg1, TupleList arg2)
  {
    StringBuilder sb = new StringBuilder ();

    sb.append("Input1: ");
    sb.append(arg1.toPrettyString ());
    sb.append("\nInput2: ");
    sb.append(arg2.toPrettyString ());

    return sb.toString ();
  }
}

Beispiel 3: Benutzerdefinierte Tabellenfunktion implementieren, die eine Tabelle als Eingabe verwendet

Dieses Beispiel zeigt die Implementierung einer benutzerdefinierten Tabellenfunktion mit dem Namen TableConsumingTableFunc. Diese benutzerdefinierte Funktion (UDF) verwendet als Eingabe zwei Listen von Tupeln und gibt eine einzelne Liste von Tupeln aus, die Tupel aus der ersten Eingabe versetzt mit Tupeln aus der zweiten Eingabe enthält. Beachten Sie, dass die Implementierung von der Basisklasse com.ibm.avatar.api.udf.TableUDFBase ausgeht, die APIs zur Verfügung stellt, um die Eingabe- und Ausgabeschemas abzurufen.

package com.ibm.test.udfs;

import java.lang.reflect.Method;

import com.ibm.avatar.algebra.datamodel.AbstractTupleSchema;
import com.ibm.avatar.algebra.datamodel.FieldCopier;
import com.ibm.avatar.algebra.datamodel.Tuple;
import com.ibm.avatar.algebra.datamodel.TupleList;
import com.ibm.avatar.algebra.datamodel.TupleSchema;
import com.ibm.avatar.api.exceptions.TableUDFException;
import com.ibm.avatar.api.udf.TableUDFBase;

/**
  * Example implementation of a user-defined table function
*/
public class TableConsumingTableFunc extends TableUDFBase
{

  /** Accessors for copying fields from input tuples to output tuples. */
  private FieldCopier arg1Copier, arg2Copier;

  /**
    * Main entry point to the `table` function. This function takes two lists of tuples and generates a new list of wide
    * tuples, where element i of the returned list is created by joining element i of the first input with element i of
    * the second input.
    *
    * @param arg1 first set of tuples to merge
    * @param arg2 second set of tuples to merge
    * @return the two sets of tuples, interleaved
    */
  public TupleList eval (TupleList arg1, TupleList arg2)
  {

    TupleSchema retSchema = getReturnTupleSchema ();
    TupleList ret = new TupleList (retSchema);

    // We skip any records that go off the end
    int numRecs = Math.min (arg1.size (), arg2.size ());

    for (int i = 0; i < numRecs; i++) {
      Tuple retTuple = retSchema.createTup ();

      Tuple inTup1 = arg1.getElemAtIndex (i);
      Tuple inTup2 = arg2.getElemAtIndex (i);

      arg1Copier.copyVals (inTup1, retTuple);
      arg2Copier.copyVals (inTup2, retTuple);

      // System.err.printf ("%s + %s = %s\n", inTup1, inTup2, retTuple);

      ret.add (retTuple);
    }

    return ret;
  }

  /**
    * Initialize the internal state of the `table` function. In this case, we create accessors to copy fields from input
    * tuples to output tuples.
    *
    * @see com.ibm.avatar.api.udf.TableUDFBase#initState() for detailed description
    */
  @Override
  public void initState () throws TableUDFException
  {
    // Create accessors to do the work of copying fields from input tuples to output tuples
    AbstractTupleSchema arg1Schema = getRuntimeArgSchema ().getFieldTypeByIx (0).getRecordSchema ();
    AbstractTupleSchema arg2Schema = getRuntimeArgSchema ().getFieldTypeByIx (1).getRecordSchema ();
    TupleSchema retSchema = getReturnTupleSchema ();

    // Create offsets tables for a straightforward copy.
    String[] srcs1 = new String[arg1Schema.size ()];
    String[] dests1 = new String[arg1Schema.size ()];
    String[] srcs2 = new String[arg2Schema.size ()];
    String[] dests2 = new String[arg2Schema.size ()];

    for (int i = 0; i < srcs1.length; i++) {
      srcs1[i] = arg1Schema.getFieldNameByIx (i);
      dests1[i] = retSchema.getFieldNameByIx (i);
    }
    for (int i = 0; i < srcs2.length; i++) {
      srcs2[i] = arg2Schema.getFieldNameByIx (i);
      dests2[i] = retSchema.getFieldNameByIx (i + srcs1.length);
    }

    arg1Copier = retSchema.fieldCopier (arg1Schema, srcs1, dests1);
    arg2Copier = retSchema.fieldCopier (arg2Schema, srcs2, dests2);
  }

  /**
    * Check the validity of tuple schemas given in the AQL “create function”.
    *
    * @see com.ibm.avatar.api.udf.TableUDFBase#validateSchema(TupleSchema, TupleSchema, TupleSchema, Method, Boolean) for
    *      description of arguments
    */
  @Override
  public void validateSchema (TupleSchema declaredInputSchema, TupleSchema runtimeInputSchema,
    TupleSchema returnSchema, Method methodInfo, boolean compileTime) throws TableUDFException
  {
    // The output schema should contain the columns of the two input schemas in order.
    AbstractTupleSchema arg1Schema = declaredInputSchema.getFieldTypeByIx (0).getRecordSchema ();
    AbstractTupleSchema arg2Schema = declaredInputSchema.getFieldTypeByIx (1).getRecordSchema ();

    System.err.printf ("TableConsumingTableFunc: Input schemas are %s and %s\n", arg1Schema, arg2Schema);

    // First check sizes
    if (returnSchema.size () != arg1Schema.size () + arg2Schema.size ()) { throw new TableUDFException (
      "Schema sizes don't match (%d + %d != %d)", arg1Schema.size (), arg2Schema.size (), returnSchema.size ()); }

    // Then check types
    for (int i = 0; i < arg1Schema.size (); i++) {
      if (false == (arg1Schema.getFieldTypeByIx (i).equals (returnSchema.getFieldTypeByIx (i)))) { throw new TableUDFException (
        "Field type %d of output doesn't match corresponding field of first input arg (%s != %s)", i,
        returnSchema.getFieldTypeByIx (i), arg1Schema.getFieldTypeByIx (i)); }
    }

    for (int i = 0; i < arg2Schema.size (); i++) {
      if (false == (arg2Schema.getFieldTypeByIx (i).equals (returnSchema.getFieldTypeByIx (i + arg1Schema.size ())))) { throw new TableUDFException (
        "Field type %d of output doesn't match corresponding field of first input arg (%s != %s)", i
          + arg1Schema.size (), returnSchema.getFieldTypeByIx (i + arg1Schema.size ()), arg2Schema.getFieldTypeByIx (i)); }
    }
  }

}

Benutzerdefinierte Funktionen deklarieren

Mithilfe der Anweisung create function können Sie die benutzerdefinierten Skalarfunktionen und die Machine Learning-Modelle aus den PMML-Dateien für AQL bereitstellen.

Syntax

Die allgemeine Syntax der Anweisung create function lautet wie folgt:

create function <function-name>(<input-schema-definition>)
return <return-type> [like <column-name>] | table ( <output-schema-definition)
external_name <ext-name>
language [java | pmml]
[deterministic | not deterministic]
[return null on null input | called on null input];
<input-schema-definition>
<column-name> <data-type> | table (<output-schema-definition>) as locator [,<column-name> <data-type> | table (<output-schema-definition>) as locator ]*
<output-schema-definition>
<column-name> <data-type> [,<column-name> <data-type>]*

Beschreibung

  • <function-name\>

    <function-name\> deklariert den AQL-Namen der UDF. Die UDF wird in dem AQL-Code mit diesem Namen bezeichnet.

  • <input-schema-definition\>

    Gibt die Eingabeparameter für die UDF an. Ein Eingabeparameter hat einen Namen, der als <column-name\> angegeben wird, und kann entweder ein Skalartyp oder ein Tabellenlocator sein. Wenn es sich bei der Sprache um PMML handelt, muss die Funktion eine einzelne Tabelle mit dem Namen params als Argument verwenden.

  • <column-name\>

    Gibt den Namen einer Spalte in der Eingabe oder Ausgabe der UDF an.

  • <data-type\>

    Der Typ eines Eingabeskalarparameters für die UDF, der Typ einer Spalte im Schema einer Eingabetabelle für die UDF oder im Schema der Ausgabetabelle der UDF. Mögliche Werte für <data-type\> sind Integer, Gleitkomma, String, Text, Bereich, Boolesch oder SkalarListe.

  • table (<output-schema-definition\>) as locator

    Dieser Eingabetyp ermöglicht es einer Funktion, den gesamten Inhalt einer bestimmten AQL-Ansicht entsprechend der Berechnung im aktuellen Dokument als Eingabe zu verwenden. Der Parameter 'locator' verweist auf Ansichten oder Tabellen als Argumente.

  • <return-type\>

    Bei skalaren UDFs gibt <return-type\> den Typ des skalaren Werts an, der von der UDF zurückgegeben wird. Mögliche Werte für den Rückgabetyp sind Integer, Float, String, Text, Span, Boolean oder ScalarList. Wenn der Rückgabetyp 'Integer' lautet, gibt die Java™-Funktion, die die benutzerdefinierte Funktion implementiert, Objekte des Typs 'Integer' zurück. Die UDF-Implementierung kann den primitiven Int-Typ nicht zurückgeben. Wenn der Rückgabetyp 'Text' oder 'Span' lautet, geben Sie den Eingabeparameter an, aus dem der Rückgabetyp abgeleitet wird. Sie können den Eingabeparameter mithilfe der optionalen Like-Spezifikation angeben, da die Spans immer von einer zugrunde liegenden Spalte ausgehen. Wenn der Rückgabetyp 'ScalarList' lautet, geben Sie den Eingabeparameter an, aus dem der Skalartyp in 'ScalarList' abgeleitet werden soll. Bei der Sprache PMML muss die Funktion eine Tabelle zurückgeben.

  • <output-schema-definition\>

    Bei Tabellen-UDFs gibt <output-schema-definition\> das Ausgabeschema der Tabelle an, die von der UDF zurückgegeben wird, einschließlich der Spaltennamen und ihrer Typen.

  • <ext-name\>

    external_name gibt an, wo sich die Implementierung der UDF befindet. Wenn es sich bei der Sprache um Java handelt, handelt es sich um eine Zeichenfolge im Format '<jar-file-name\>:<fully-qualified-class-name\>!<method-name\>', die aus drei Teilen besteht:

    • JAR-Dateiname: Wenn Sie modularen AQL-Code kompilieren, müssen die Positionsreferenzen von UDF-JAR-Dateien relativ zum Stammverzeichnis des Moduls sein, in dem die Referenz erfolgt.
    • Klassenname: Vollständig qualifizierter Klassenname, der die UDF-Implementierung enthält.
    • Methodenname: Die Methode muss eine öffentliche Methode der Klasse sein. Die Methodensignatur muss mit den Parametertypen übereinstimmen, die in der Anweisung create function angegeben sind. Eine automatische Typenkonvertierung wird von der Laufzeitkomponente nicht vorgenommen. Bei der Sprache PMML gibt die Klausel 'external_name' eine Zeichenfolge an, die die Position der PMML-Datei relativ zum Stammverzeichnis des Moduls darstellt. Die aktuelle Implementierung unterstützt Modelle, die mit PMML Version 4.1 (Standard) ausgedrückt werden, und wertet sie mit der Bibliothek org.jpmml (Version 1.0.22) aus.
  • language

    Die Sprachspezifikation verweist auf die Sprache der Implementierung der benutzerdefinierten Funktion (UDF). Die Laufzeitkomponente unterstützt nur UDFs, die in Java™ implementiert sind.

  • deterministic/not deterministic

    Der optionale Wert 'deterministic/not deterministic' gibt an, ob die Funktion statusunabhängig ist. Eine deterministische Funktion gibt immer denselben Wert für dieselbe Gruppe von Eingabewerten zurück.

  • return null on null input

    Der optionale Wert 'return null on null input' gibt das Funktionsverhalten an, wenn einer oder mehrere der Eingabewerte null sind. Bei Angabe von 'return null on null input' gibt das System den Wert null bei Nulleingabe zurück, ohne dass die UDF aufgerufen wird. Bei Angabe von 'called on null input' wird die UDF auch für Nulleingabewerte aufgerufen.

Hinweise zur Verwendung für UDFs, die in PMML implementiert sind

Funktionen, die aus den PMML-Dateien erstellt werden, verwenden eine einzelne Tabelle mit dem Namen params als Argument und geben eine Tabelle aus. Durch die Implementierung der Funktion werden Eingabefelder zwischen dem Eingabe- und Ausgabeschema, die in der Anweisung 'create function' deklariert sind, und dem Schema, das in der PMML-Datei angegeben ist, zugeordnet. Mit anderen Worten: Der Abschnitt DataDictionary, der die Namen und Typen von Feldern beschreibt, die in den Eingabe- und Ausgabedatensätzen enthalten sein können, die das Modell erstellt und verarbeitet, der Abschnitt MiningSchema, der angibt, welche im Abschnitt 'DataDictionary' definierten benannten Dateien in jedem Tupel enthalten sind, das einen Funktionsvektor darstellt, und der Abschnitt Output, der angibt, welche im Abschnitt DataDictionary definierten benannten Felder in jedem Tupel der externen Darstellung der Ausgabe des Modells enthalten sind. Diese Funktionen müssen Tabellenfunktionen sein. Jede Zeile in der Tabelle wird an das PMML-Modell übergeben und eine Ausgabezeile erstellt.

Diese Schemainformationen sind erforderlich, weil die PMML- und AQL-Systeme nicht vollkommen übereinstimmen. Beispiel: PMML verfügt über mehrere Typen, um Zeitmarken darzustellen, während es bei AQL derzeit erforderlich ist, dass die Benutzer die Zeitmarken als Zeichenfolgewerte codieren. Die Schemainformationen ermöglichen es Entwicklern, die mit AQL, aber nicht mit PMML vertraut sind, die Regelsätze beider Sprachen zu verstehen.

Der AQL-Compiler überprüft das Eingabeschema anhand des Eingabeschemas der PMML-Datei, um sicherzustellen, dass die beiden Schemas kompatibel sind. Wenn die beiden Schemas Felder mit demselben Namen, jedoch mit nicht kompatiblen Typen enthalten, schlägt die Kompilierung mit einer entsprechenden Fehlernachricht fehl. Wenn die Eingabe- oder Ausgabeschemas der Funktion zusätzliche Spalten enthalten oder wenn Spalten fehlen, ignoriert die Funktion resulting diese Spalten und generiert keinen Fehler. Die Reihenfolge der Spaltennamen kann bei der AQL-Definition und der PMML-Datei unterschiedlich sein. Wenn ein Spaltenname sowohl in Eingabe- als auch in Ausgabeschemas, jedoch nicht im PMML-Schema angezeigt wird, werden die Werte dieser Spalte an die Ausgabe der Funktion weitergegeben.

Beispiele

Beispiel 1: Benutzerdefinierte Skalarfunktionen mit skalaren Werten als Eingabe unter Verwendung von Java deklarieren

Das folgende Beispiel zeigt eine Anweisung create function, die eine Funktion mit dem Namen udfCombineSpans deklariert. Die benutzerdefinierte Funktion nimmt zwei Spans als Eingabe auf und gibt einen zusammengeführten Span zurück, der dem ersten Eingabespan ähnlich ist. Die benutzerdefinierte Java™-Funktion selbst ist in einer JAR-Datei mit dem Namen udfs.jar im Verzeichnis udfjars gepackt. Die Methode, die die Funktion implementiert, lautet combineSpans in der Klasse com.ibm.test.udfs.MiscScalarFunc. Die Methode deklariert auch eine Funktion udfSpanGreaterThan, die true zurückgibt, wenn der Span größer ist als die angegebene Größe.

/**
* A function to combine two spans and return the resultant span from beginOffset of first span, to endOffset of second span
* @param p1 first input span
* @param p2 second input span
* @return a span from beginOffset of p1 till endOffset of p2
*/

create function udfCombineSpans(p1 Span, p2 Span)
return Span like p1
external_name 'udfjars/udfs.jar:com.ibm.test.udfs.MiscScalarFunc!combineSpans'
language java
deterministic
return null on null input;

/**
* A function to compare an input Span's size against an input size
* @param span input span
* @param size input size to be compared against
* @return Boolean true if input span's size is greater than input argument size, else false
*/

create function udfSpanGreaterThan(span Span, size Integer)
return Boolean
external_name 'udfjars/udfs.jar:com.ibm.test.udfs.MiscScalarFunc!spanGreaterThan'
language java
deterministic;

Das nächste Beispiel zeigt, wie eine Funktion mit dem Namen "udfCompareNames" deklariert wird, der eine Namensliste "nameList" und ein einzelner Name "myName" zur Verfügung gestellt wird. Die Ausgabe ist eine Liste ähnlich der Eingabeliste, die nur die Einträge aus 'nameList' enthält, die 'myName' ähnlich sind.

/**
* A function to compare an input string against a list of names
* and returns a list of entries from nameList similar to myName.
* @param nameList a list of names
* @param myName a name to compare against the list
* @return a list of entries from nameList similar to myName
*/

create function udfCompareNames(nameList ScalarList, myName String)
return ScalarList like nameList
external_name 'udfjars/udfs.jar:com.ibm.test.udfs.MiscScalarFunc!compareNames'
language java
deterministic;

Beispiel 2: Benutzerdefinierte Skalarfunktionen mit Tabellen als Eingabe unter Verwendung von Java deklarieren

Das folgende Beispiel veranschaulicht die Verwendung des Eingabetyps table as locator. Es zeigt eine Anweisung create function, die eine Funktion mit dem Namen 'MyScalarFunc' deklariert. Die Java™-Implementierung der UDF ist in der Klasse com.ibm.test.udfs.TableConsumingScalarFunc gepackt.

Diese benutzerdefinierte Funktion (UDF) verwendet als Eingabe zwei Listen von Tupeln und gibt einen Zeichenfolgewert aus, der den Inhalt der beiden eingegebenen Tupellisten verkettet. Informationen zur Java™-Implementierung der UDF finden Sie unter Benutzerdefinierte Funktionen implementieren.

-- Declare a simple scalar function that turns two tables into a big string
create function MyScalarFunc(
    firstArg table( spanVal Span ) as locator,
    secondArg table( spanVal Span, strVal Text ) as locator
)
return String
external_name
  'udfjars/udfs.jar:com.ibm.test.udfs.TableConsumingScalarFunc!eval'
language java
deterministic
called on null input;

Beispiel 3: Benutzerdefinierte Tabellenfunktion unter Verwendung von Java deklarieren

Das folgende Beispiel veranschaulicht die Verwendung der Klausel return table. Das Beispiel zeigt eine Anweisung create function, die eine Tabellenfunktion mit dem Namen 'MyScalarFunc' deklariert. Die Java™-Implementierung der UDF ist in der Klasse com.ibm.test.udfs.TableConsumingTableFunc gepackt. Diese benutzerdefinierte Funktion (UDF) verwendet als Eingabe zwei Listen von Tupeln und gibt eine Liste von Tupeln aus, die die Eingabelisten zusammenführt. Informationen zur Java™-Implementierung der UDF finden Sie unter Benutzerdefinierte Funktionen implementieren.

-- Declare a simple table function that "zips together" two input tables
create function MyTableFunc(
    firstArg table( spanVal Span ) as locator,
    secondArg table( spanVal Span, strVal Text ) as locator
)
return table( outSpan1 Span, outSpan2 Span, outStr Text)
external_name
  'udfjars/udfs.jar:com.ibm.test.udfs.TableConsumingTableFunc!eval'
language java
deterministic
called on null input;

Beispiel 4: Benutzerdefinierte Tabellenfunktion deklarieren, die in PMML implementiert ist

Das folgende Beispiel zeigt eine Anweisung create function, die eine Tabellenfunktion mit dem Namen 'IrisDecisionTree' unter Verwendung der Sprache PMML deklariert. Die PMML-Implementierung der UDF wird in der Datei 'IrisTree.xml' angegeben, wie im folgenden Beispiel gezeigt wird. Das Modell, das in der Datei 'IrisTree.xml' gespeichert ist, ist ein Entscheidungsbaummodell.

-- Scoring function based on a decision tree model stored in IrisTree.xml
create function IrisDecisionTree(
    params table(
        sepal_length Float,
        sepal_width Float,
        petal_length Float,
        petal_width Float
    ) as locator
)
return table( class Text, actual_class Text,
    -- This PMML file also defines additional output fields
    "Probability_Iris-setosa" Float,
    "Probability_Iris-versicolor" Float,
    "Probability_Iris-virginica" Float)
external_name 'IrisTree.xml'
language pmml;

IrisTree.xml

<?xml version="1.0"?>
<PMML version="3.2" xmlns="http://www.dmg.org/PMML-3_2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.dmg.org/PMML-3_2 http://www.dmg.org/v3-2/pmml-3-2.xsd">
  <Header copyright="Copyright (c) 2012 DMG" description="RPart Decision Tree Model">
  <Extension name="user" value="DMG" extender="Rattle/PMML"/>
  <Application name="Rattle/PMML" version="1.2.29"/>
  <Timestamp>2012-09-27 12:46:08</Timestamp>
  </Header>
  <DataDictionary numberOfFields="5">
  <DataField name="class" optype="categorical" dataType="string">
    <Value value="Iris-setosa"/>
    <Value value="Iris-versicolor"/>
    <Value value="Iris-virginica"/>
  </DataField>
  <DataField name="sepal_length" optype="continuous" dataType="double">
    <Interval closure="closedClosed" leftMargin="4.3" rightMargin="7.9"/>
  </DataField>
  <DataField name="sepal_width" optype="continuous" dataType="double">
    <Interval closure="closedClosed" leftMargin="2" rightMargin="4.4"/>
  </DataField>
  <DataField name="petal_length" optype="continuous" dataType="double">
    <Interval closure="closedClosed" leftMargin="1" rightMargin="6.91"/>
  </DataField>
  <DataField name="petal_width" optype="continuous" dataType="double">
    <Interval closure="closedClosed" leftMargin="0.1" rightMargin="2.5"/>
  </DataField>
  </DataDictionary>
  <TreeModel modelName="RPart_Model" functionName="classification" algorithmName="rpart" splitCharacteristic="binarySplit" missingValueStrategy="defaultChild">
  <MiningSchema>
    <MiningField name="class" usageType="predicted"/>
    <MiningField name="sepal_length" usageType="supplementary"/>
    <MiningField name="sepal_width" usageType="supplementary"/>
    <MiningField name="petal_length" usageType="active"/>
    <MiningField name="petal_width" usageType="supplementary"/>
  </MiningSchema>
  <Output>
    <OutputField name="class" optype="categorical" dataType="string" feature="predictedValue"/>
    <OutputField name="Probability_Iris-setosa" optype="continuous" dataType="double" feature="probability" value="Iris-setosa"/>
    <OutputField name="Probability_Iris-versicolor" optype="continuous" dataType="double" feature="probability" value="Iris-versicolor"/>
    <OutputField name="Probability_Iris-virginica" optype="continuous" dataType="double" feature="probability" value="Iris-virginica"/>
  </Output>
  <Node id="1" score="Iris-virginica" recordCount="105" defaultChild="3">
    <True/>
    <ScoreDistribution value="Iris-setosa" recordCount="33" confidence="0.314285714285714"/>
    <ScoreDistribution value="Iris-versicolor" recordCount="35" confidence="0.333333333333333"/>
    <ScoreDistribution value="Iris-virginica" recordCount="37" confidence="0.352380952380952"/>
    <Node id="2" score="Iris-setosa" recordCount="33">
    <SimplePredicate field="petal_length" operator="lessThan" value="2.6"/>
    <ScoreDistribution value="Iris-setosa" recordCount="33" confidence="1"/>
    <ScoreDistribution value="Iris-versicolor" recordCount="0" confidence="0"/>
    <ScoreDistribution value="Iris-virginica" recordCount="0" confidence="0"/>
    </Node>
    <Node id="3" score="Iris-virginica" recordCount="72" defaultChild="7">
    <SimplePredicate field="petal_length" operator="greaterOrEqual" value="2.6"/>
    <ScoreDistribution value="Iris-setosa" recordCount="0" confidence="0"/>
    <ScoreDistribution value="Iris-versicolor" recordCount="35" confidence="0.486111111111111"/>
    <ScoreDistribution value="Iris-virginica" recordCount="37" confidence="0.513888888888889"/>
    <Node id="6" score="Iris-versicolor" recordCount="37">
      <SimplePredicate field="petal_length" operator="lessThan" value="4.85"/>
      <ScoreDistribution value="Iris-setosa" recordCount="0" confidence="0"/>
      <ScoreDistribution value="Iris-versicolor" recordCount="34" confidence="0.918918918918919"/>
      <ScoreDistribution value="Iris-virginica" recordCount="3" confidence="0.0810810810810811"/>
    </Node>
    <Node id="7" score="Iris-virginica" recordCount="35">
      <SimplePredicate field="petal_length" operator="greaterOrEqual" value="4.85"/>
      <ScoreDistribution value="Iris-setosa" recordCount="0" confidence="0"/>
      <ScoreDistribution value="Iris-versicolor" recordCount="1" confidence="0.0285714285714286"/>
      <ScoreDistribution value="Iris-virginica" recordCount="34" confidence="0.971428571428571"/>
    </Node>
    </Node>
  </Node>
  </TreeModel>
</PMML>

Anweisung create function mit Kommentaren dokumentieren

Der AQL Doc-Kommentar für eine Anweisung 'create function' enthält die folgenden Informationen:

  • Eine allgemeine Beschreibung der Funktion.
  • Die @param-Beschreibung, in der die einzelnen Parameternamen angegeben werden, die in der Funktion verwendet werden. Geben Sie den Typ des Parameters an, unabhängig davon, ob es sich um einen Skalartyp oder eine Tabelle handelt. Wenn der Parameter eine Tabelle ist, beschreiben Sie das Schema der Tabelle - einschließlich Spaltennamen und -typen in der Reihenfolge, in der sie im Schema der als Eingabe erwarteten Tabelle enthalten sind.
  • Die @return-Beschreibung, die die Informationen angibt, die von der Funktion zurückgegeben werden. Wenn die Funktion eine Tabelle zurückgibt, geben Sie das Ausgabeschema der Tabelle an - einschließlich Spaltennamen und -typen in der Reihenfolge, in der sie im Schema der Ausgabetabelle enthalten sind.
/**
* A function to compare an input string against a list of names
* and returns a list of entries from nameList similar to myName.
* @param nameList a list of names
* @param myName a name to compare against the list
* @return a list of entries from nameList similar to myName
*/

create function udfCompareNames(nameList ScalarList, myName String)
  return ScalarList like nameList
  external_name 'udfjars/udfs.jar:com.ibm.test.udfs.MiscScalarFunc!compareNames'
  language java
  deterministic;

Benutzerdefinierte Funktionen verwenden

Benutzerdefinierte Funktionen arbeiten mit AQL-Anweisungen und -Klauseln.

Benutzerdefinierte Skalarfunktionen arbeiten ähnlich wie integrierte Funktionen mit AQL-Anweisungen und -Klauseln. Insbesondere können benutzerdefinierte Skalarfunktionen in den Klauseln select, where, having, group by und order by in derselben Weise wie integrierte Skalarfunktionen wie GetBegin und LeftContext verwendet werden. Benutzerdefinierte Skalarfunktionen, die einen booleschen Typ zurückgeben, können als Vergleichselemente in where- und having-Klauseln verwendet werden.

Benutzerdefinierte Tabellenfunktionen können innerhalb der Klausel from einer Anweisung select oder einer Anweisung extract verwendet werden.

Beispiele

Beispiel 1: Benutzerdefinierte Skalarfunktionen, die in Java implementiert sind, mit skalaren Werten als Eingabe verwenden

Dieses Beispiel veranschaulicht, wie Sie die Funktionen udfCombineSpans und udfSpanGreaterThan verwenden, die unter Benutzerdefinierte Funktionen deklarieren deklariert werden.

create function udfCombineSpans(p1 Span, p2 Span)
return Span like p1
external_name 'udfjars/udfs.jar:com.ibm.test.udfs.MiscScalarFunc!combineSpans'
language java
deterministic
return null on null input;

create function udfSpanGreaterThan(span Span, size Integer)
return Boolean
external_name 'udfjars/udfs.jar:com.ibm.test.udfs.MiscScalarFunc!spanGreaterThan'
language java
deterministic;

-- identify occurrences of given names in the document
create dictionary FirstNamesDict from file 'firstNames.dict';

create view FirstName as
extract dictionary 'FirstNamesDict' on D.text as name
from Document D;

-- Use a UDF to merge the name that is longer than 7 characters with the text to its right in a
-- way that is appropriate to the application.
create view NameAndContext as
select udfCombineSpans(F.name, RightContext(F.name, 50)) as name
from FirstName F
where udfSpanGreaterThan(F.name, 7);

Beispiel 2: Benutzerdefinierte Skalarfunktionen, die in Java implementiert sind, mit Tabellen als Eingabe verwenden

Das folgende Beispiel zeigt, wie eine Skalarfunktion verwendet wird, die Tabellen als Eingabe verwendet. Dieses Beispiel veranschaulicht die Verwendung der benutzerdefinierte Tabellenfunktion 'MyScalarFunc', deren Java™-Implementierung unter Benutzerdefinierte Tabellenfunktionen implementieren beschrieben wird. Es handelt sich um die gleichen Spaltentypen, die jedoch unterschiedliche Spaltennamen aufweisen.

-- Declare a simple scalar function that turns two tables into a big string
create function MyScalarFunc(
    firstArg table( spanVal Span ) as locator,
    secondArg table( spanVal Span, strVal Text ) as locator
)
return String
external_name
  'udfjars/udfs.jar:com.ibm.test.udfs.TableConsumingScalarFunc!eval'
language java
deterministic
called on null input;

-- Create two views to serve as inputs to the `table` function.
-- Note that column names don't match, but types do.
create view FirstInputView as
extract regex /\d+/ on 1 token in D.text as match
from Document D;

create view SecondInputView as
select S.match as spanCol, 'Dummy string' as textCol
from
    (extract regex /[A-Z][a-z]+/ on 1 token in D.text as match
    from Document D) S;

-- Call the `scalar` function defined above from the select list.
create view ScalarFuncOutput as
select MyScalarFunc(FirstInputView, SecondInputView) as func
from Document D;

Beispiel 3: Benutzerdefinierte Tabellenfunktionen verwenden, die in Java implementiert sind

Dieses Beispiel veranschaulicht die Verwendung der benutzerdefinierte Tabellenfunktion 'MyTableFunc', deren Java™-Implementierung unter Benutzerdefinierte Tabellenfunktionen implementieren beschrieben wird.

-- Declare a simple table function that "zips together" two input tables
create function MyTableFunc(
    firstArg table( spanVal Span ) as locator,
    secondArg table( spanVal Span, strVal Text ) as locator
)
return table( outSpan1 Span, outSpan2 Span, outStr Text)
external_name
  'udfjars/udfs.jar:com.ibm.test.udfs.TableConsumingTableFunc!eval'
language java
deterministic
called on null input;

-- Create two views to serve as inputs to the `table` function.
-- Note that column names don't match, but types do.
create view FirstInputView as
extract regex /\d+/ on 1 token in D.text as match
from Document D;


create view SecondInputView as
select S.match as spanCol, 'Dummy string' as textCol
from
    (extract regex /[A-Z][a-z]+/ on 1 token in D.text as match
    from Document D) S;

-- Use the `table` function
create view TabFuncOutput as
select T.outSpan1 as span1, T.outSpan2 as span2
from MyTableFunc(FirstInputView, SecondInputView) T;

Wie in Beispiel 2 werden zwei Ansichten definiert: FirstInputView mit Schema (match Span) und SecondInputView mit dem Schema (spanCol Span, textCol Text). Die letzte Ansicht im Beispiel TabFuncOutput ruft die table-Funktion MyTableFunc in der Klausel from mit den beiden Eingabeansichten auf. Wie in Beispiel 2 erläutert, ist eine Ansicht mit einem Tabellenlokatorargument einer Funktion kompatibel, solange die Anzahl der Spalten und die Spaltentypen im Schema der Eingabeansicht und der Tabellenlokator übereinstimmen. Es ist aber nicht notwendig, dass die Spaltennamen übereinstimmen.

Schließlich löscht die Klausel select die Spalte outStr aus der Ausgabetabelle von MyTableFunc und behält nur die ersten beiden Spalten outSpan1 und outSpan2 bei.

Beispiel 4: Benutzerdefinierte Tabellenfunktion verwenden, die in PMML implementiert ist

Dieses Beispiel veranschaulicht die Verwendung der benutzerdefinierte Tabellenfunktion 'IrisDecisionTree', die in Beispiel 4 unter Benutzerdefinierte Funktionen deklarieren deklariert wird.

-- External view to hold the input records
create external view IrisData(
    sepal_length Float,
    sepal_width Float,
    petal_length Float,
    petal_width Float
)
external_name 'IrisData';
--Invoke the function on the input data records
create view IrisDecisionTreeOutput as
select * from IrisDecisionTree(IrisData);

output view IrisDecisionTreeOutput;