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 Zeichene
undl
.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
undoutput view
sind unvereinbar. Dies bedeutet, dass eine Ausgabeansicht nicht automatisch eine exportierte Ansicht ist, sondern explizit mit einer Anweisungexport
exportiert werden muss. Eine exportierte Ansicht ist nicht automatisch eine Ausgabeansicht, sondern muss mit der Anweisungoutput view
explizit als Ausgabeansicht definiert werden. In den Beispielen wird versucht, mit der Anweisungexport
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 Anweisungalias 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 Anweisungcreate view
oder mit anderen Importanweisungen in demselben Modul (nicht nur innerhalb der aktuellen Datei) verursacht. Diese Einschränkung gilt auch für denimport
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 Anweisungcreate view
oder mit anderen Importanweisungen in demselben Modul (nicht nur innerhalb der aktuellen Datei) verursacht. Diese Einschränkung gilt auch für denimport
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
undNotFirstName
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
odercreate external dictionary
deklariert sind, wenn diese Anweisung keine Klauselwith 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 explizitewith 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.
- Wörterverzeichnisse, die im aktuellen Modul explizit mit der Anweisung
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 einerequire document with columns
-Anweisung enthalten. Für alle AQL-Dateien innerhalb eines Moduls werden dierequire document with columns
-Anweisungen auf Gesamtmodulebene zusammengeführt und bilden so einerequire document with columns
-Anweisung für das gesamte Modul. Diese Anweisung definiert das Schema der AnsichtDocument
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 AnsichtDocument
. Dieses Schema besteht aus zwei Spalten: (text Text, label Text). Für die spezielle AnsichtDocument
werden keine Standardspalten festgelegt, wenn mindestens eine AQL-Datei im Modul eine Anweisungrequire 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 Anweisungenrequire 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 AnsichtDocument
, auf die verwiesen wird, in mindestens einer der Anweisungenrequire document with columns
deklariert sein. Die Anweisung kann in verschiedenen AQL-Dateien in demselben Modul enthalten sein. Alle diese Anweisungenrequire document with columns
würden jedoch auf der Ebene des Moduls zusammengeführt werden, um eine modulweite Anweisungrequire 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
oderextract
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
oderextract
der Formateunion all
undminus
müssen über ein kompatibles Ausgabeschema verfügen. Zwei Schemas gelten als kompatibel für eine Operationunion
oderminus
, 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
oderminus
kompatibel. - Die Datentypen 'Span' und 'Text' sind mit
union
oderminus
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 mitunion
oderminus
, unabhängig von dem zugrunde liegenden Skalartyp.
- Felder desselben Datentyps sind mit
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 AnsichtDocument
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 Anweisungoutput ... 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 Anweisungselect
oderexport
verwendet werden. Sie müssen<alias\>
in einfache Anführungszeichen einschließen und der<alias\>
-Name kann Punkte enthalten. - In modularer AQL wird die Ansicht unter dem Namen
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 Anweisungoutput view Person;
zur Ausgabe der AnsichtpersonModule.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\>
einerselect
-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 Anweisungextract
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 Anweisungselect
. Wenn die Anweisungextract
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 Anweisungextract
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 Anweisungextract
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. - Gruppe 0 ist die gesamte Übereinstimmung
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 Anweisungcreate 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ürLet's go fishing!
. Wenn das Wörterverzeichnis jedoch aus dem Eintraggo fishing
besteht (beachten Sie die zwei Leerzeichen zwischen 'go' und 'fishing'), gibt es eine Übereinstimmung im TextLet's go fishing!
. Das Leerzeichen gibt an, dassgo
undfishing
zwei unterschiedliche Tokens sind. Wenn ein oder mehr Leerzeichen zwischen den beiden Tokensgo
undfishing
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 Anweisungset 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 Anweisungcreate 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.
- Wenn
-
<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-Anweisungpart_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.
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 inextract pattern <A.match>| <B.match> <C.match> as match from Apple A, Bacon B, Chocolate C;
. Dieses Muster kann als 'Übereinstimmung entweder mitA.match
ODER einer SequenzB.match
gefolgt vonC.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 Anweisungextract
. Die Ergebnisse werden gefiltert und konsolidiert entsprechend den Klauselnhaving
,consolidate
undlimit
der Anweisungextract
. 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 Klauselconsolidation
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
undmax
) 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 Klauselreturn
in einer Anweisungextract 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 Klauselwith 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 AnsichtEmail
angewendet. Wennwith 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 Anweisungextract
. Die Ergebnisse werden gefiltert und konsolidiert entsprechend den Klauselnhaving
,consolidate
undlimit
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 Anweisungextract pattern
unterscheidet sich von anderen Formen vonextract
-Anweisungen, die nicht über eine Musterspezifikation verfügen. Die allgemeine Semantik einer Anweisungextract
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 Listefrom
übertragen, jedoch nur, wenn der Ansichtsname nicht in einem Wiederholungselement der Musterspezifikation erscheint. Beispielsweise führt die AnweisungCapsWordOneToThree
zu einem Kompilierungsfehler. Der Fehler tritt auf, da die WeiterleitungsspalteCW.type
am Anfang der Anweisungextract
zum AnsichtsnamenCW
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 AnsichtPerson
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 deraggregate
-Funktionen in der Auswahlliste. - Konsolidieren Sie alle überlappenden Tupel gemäß der Richtlinie, die in der (optionalen) Klausel
consolidation
definiert sind. Wenn die optionale Klauselorder 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 Klauselnas
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
oderextract
besteht aus einer durch Kommas begrenzten Liste von Ausgabeausdrücken. - 'from'-Liste Der zweite Teil einer Anweisung
select
oder einer Anweisungextract
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 Klauselfrom
generiert wird. - Klausel 'consolidate on' Die optionale Klausel
consolidate on
gibt an, wie überlappende Spans über Tupel aufgelöst werden, die von einer Anweisungselect
oderextract
ausgegeben werden. Tupel mit nicht überlappenden Spans sind nicht betroffen, wenn diese Klausel verwendet wird. - Klausel 'group by' Die optionale Klausel
group by
einer Anweisungselect
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
oderextract
ü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 Klauselfrom
der Anweisungselect
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 Ausdruckscase
das Ergebnis von<expr1\>
und keine der nachfolgenden Klauselnwhen
werden ausgewertet. Andernfalls werden nachfolgendewhen
-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 Klauselelse
angegeben. Wenn die Klausel[else]
fehlt, ist das Ergebnis diesescase
-Ausdrucksnull
. -
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 Anweisungselect
ausgegeben wird. Der Mangel an Information zu den Inhalten liegt daran, dass mehrere Anweisungenrequire document with columns
, die außerhalb der aktuellen .aql-Datei angegeben sind, möglicherweise die Schemadefinition dieser speziellen AnsichtDocument
ä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 AnsichtDocument
: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 Anweisungselect
oder in der Anweisungextract
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 zurfrom
-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 Anweisungselect
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 Klauselfrom
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 Klauselgroup by
anwenden, generiert jede Gruppe von Tupeln, die gemeinsame Werte für allegroup 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:
- Gruppieren von Tupeln, die von der Unterabfrage in der Klausel
from
durch den Textinhalt ihres Feldsfirstname
generiert werden. - 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 Feldsperson
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 Anweisungselect
identisch, mit Ausnahme der zusätzlichen Klauselinto <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 Klauseldetect 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 Anweisungcreate 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.
- Die Sprachgruppen, die durch die Anweisung
-
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 Optioncase 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
undfrom 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 Syntaxcreate dictionary ... from file
angegeben sind, relativ zum Stammverzeichnis des Moduls sein, in dem diese Anweisungcreate 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 Anweisungcreate dictionary
dargestellt:
create external dictionary |
create dictionary |
---|---|
|
|
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 |
---|---|
|
|
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 Anweisungselect
oder einer Anweisungextract
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 Klauselfrom
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 AggregatfunktionCount(*)
.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
oderspan2
den Wertnull
hat oder die beiden Spans sich über verschiedene Objekte des Typs 'Text' erstrecken, gibt die Funktionnull
zurück. - Andernfalls, wenn
span1
kleiner alsspan2
ist oder der ParameterIgnoreOrder
verwendet wird, gibt die Funktion den kürzesten Span zurück, der sowohlspan1
als auchspan2
abdeckt. - Andernfalls - wenn
span1
größer alsspan2
ist undIgnoreOrder
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:
-
Implementieren der Funktion.
AQL unterstützt benutzerdefinierte Funktionen (UDFs), die in Java oder PMML implementiert sind.
-
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. -
Verwenden der Funktion in AQL.
Benutzerdefinierte Funktionen arbeiten mit AQL-Anweisungen und -Klauseln.
-
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:
- 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.
- Erstellen Sie eine Instanz dieser Klasse.
- 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:
- Folgen Sie bei benutzerdefinierten Skalarfunktionen den Standardverfahren für die Java-Programmierung. Platzieren Sie den Code beispielsweise in einem statischen Block.
- 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:
- 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).
- 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:
- Erstellen Sie ein Modul.
- Stellen Sie alle UDF-JAR-Dateien in dieses Modul.
- Definieren Sie alle erforderlichen Funktionen mit den
create function
-Anweisungen. - 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 Namenparams
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;