Zur Anmeldung als Teilnehmer bitte E-Mail mit Nennung des gewünschten Benutzernamens an: pfenz@mail.de
Hilfe:Semantische Inline-Abfrage
Von Stadtwiki
Semantic MediaWiki enthält eine einfach zu verwende Anfrage Sprache, die es ermöglicht, auf das Wissen des Wikis zuzugreifen. Die Syntax dieser Sprache ist sehr ähnlich zu jener, der Annotationen, so dass viele Editoren des Semantic MediaWiki bereits mit ihr vertraut sein werden. Leser, die sich nicht in die Syntax einarbeiten wollen, können trotzdem von diesem Feature profitieren: Inline queries lieferen dynamisch aktualisierte Resultate auf der sie einschließenden Seite. Auf diese Weise können wenige Editoren viele Leser mit aktuellen Informationen versorgen.
Offensichtlich benötigt die Beantwortung von Anfragen zusätzliche Ressourcen. Daher kann die Benutzung verschiedener Features durch die Administratoren der Seite eingeschränkt oder abgeschaltet werden, um zu verhindern, dass Seiten mit hohen Zugriffszahlen die zusätzliche Last nicht bewältigen können. Da Inline queries jedoch auch von den Caching Mechanismen von MediaWiki profitieren, können die meisten Anfragen ohne negativen Einfluss auf die Leistung des Systems beantwortet werden.
Die untenstehende Dokumentation gilt für Semantic MediaWiki Installation ab Version 0.4.3
Inhaltsverzeichnis |
Einführung
Inline queries können in Wiki-Text einer beliebigen Seite eingefügt in der Form
<ask ...>...</ask>
eingefügt werden, wobei … die Anfrage beschreibt. Der Teil zwischen den beiden ask-Tags enthält (unter anderem) Bedingungen, die beschreiben, nach was gesucht werden soll. Beispielsweise stellt
<ask>[[Category:Actor]]</ask>
die Anfrage nach allen Atrikeln, die in der Kategorie "Actor" liegen dar (also die Frage nach allen Schauspielern). An der Stelle des Dokuments, wo die Anfrage im Wiki-Text eingefügt wird, erscheint als Resultat eine einfache Liste in der gerenderten Seite. Ansonsten wird alles zwischen <ask> und </ask> ignoriert, so dass die Seite nicht der Kategorie "Actor" hinzugefügt wird. Komplexere Anfragen sind möglich, doch an dieser Stelle sollen zunächst einige wichtige Dinge über Inline queries festgehalten werden:
Allgemein gesprochen is eine Inline query eine Anfrage um eine Menge von Artikeln zu finden, die bestimmte Anforderungen erfüllen. Die Anfrage muss folgende drei Fragen beantworten:
- Welche Artikel werden gesucht?
- Welche Informationen über diese Artikel sollen angezeigt werden?
- Wie sollen die Resultate formatiert werden?
Der erste Punkt ist offensichtlich, der zweite vor allem für den Gewinn weiterer Informationen nötig. Im obigen Beispiel könnten etwa alle Schauspieler und ihr Geburtstagdatum von Interesse sein. Das erfordert zwei Schritte: Zuerst müssen alle Schauspieler gefunden werden, dann ihre Namen und Geburtsdaten ausgegeben werden. Der dritte Punkt ist wichtig, um problemlos Resultate in einer Vielzahl von Artikeln einbinden zu können. Er ist jedoch größtenteils unabhängig von den ersten beiden Schritten. Nachfolgend wird jeder der drei Punkte erklärt.
Nach welchen Artikeln wird gesucht?
Im obigen Beispiel, gaben wir die einzige Bedingung [[Category:Actor]] an, um zu beschreiben, welche Artikel uns interessieren. Die Bedingung entspricht hier genau dem, was man sonst schreiben würden, um zuzusichern, dass der Artikel in die Kategorie "Actor" gehört. Die umschließend ask-Tags inventieren faktisch die Bedeutung der im Innern aufgeschriebenen Zusicherungen dergestalt, dass alle entsprechenden Artikel zurückgeliefert werden (tatsächlich noch etwas mehr; siehe unten). Generell folgt die gesamte Syntax dem einfachen Schema: Die Syntax, um nach Artikeln zu fragen, die eine Bedingung erfüllen ist genau dieselbe, die verwendet wird, um explizit zuzusichern, dass diese Bedingung gilt.
Für die folgenden Anfragen bedeutet das:
- <ask>[[Category:Actor]]</ask> fragt nach jedem (oder allem), das als Schauspieler annotiert ist.
- <ask>[[born in::Boston]]</ask> fragt nach jedem (oder allem), das als geboren in Boston annotiert ist.
- <ask>[[height:=180cm]]</ask> fragt nach jedem (oder allem), das als 180cm hoch annotiert ist.
Indem andere Kategorien, Relationen oder Attribute als oben verwendet werden, kann bereits nach weiteren Artikeln gefragt werden, die bestimmte Annotationen haben. Als nächstes sollen die Bedingungen in der Suche kombiniert werden:
<ask>[[Category:Actor]] [[born in::Boston]] [[height:=180cm]]</ask>
Diese Anfrage sucht nach jedem, der ein Schauspieler ist und in Boston geboren wurde und 180cm groß ist. Mit anderen Worten: Wenn mehrere Bedingungen in einer Anfrage hintereinander aufgeschrieben werden, dann wird das Resultat auf all jene eingeschränkt, die alle Bedingungen erfüllen. Es ist übrigens auch möglich, Zeilenumbrüche in Anfragen zu haben, um die Lesbarkeit für Editoren zu erhöhen. Man könnte also auch
<ask> [[Category:Actor]] [[born in::Boston]] [[height:=180cm]] </ask>
schreiben, um dieselben Resultate wie oben zu erhalten. Mit diesem Wissen können nun mächtigere Suchmöglichkeiten betrachtet werden.
Wildcards und disjunkte Verknüpfungen
In den obenstehenden Beispielen haben wir konkrete Bedingungen angegeben, wobei "Actor", "Boston" und "180cm" die Ausprägungen dieser Bedingung waren. Es ist nun möglich, diese Bedingungen in mehrerer Hinsicht abzuschwächen.
Wildcards werden als "+" geschrieben und erlauben jeden Wert für eine gegebene Bedingung. Zum Beispiel liefert <ask>[[born in::+]]</ask> alle Artikel, die eine Annotation "born in" haben und <ask>[[height:=+]]</ask> wirkt analog für "height". Für Kategorien macht dieses Feature allerdings wenig Sinn: <ask>[[Category:+]]</ask> liefert einfach jeden Artikel, der in eine Kategorie eingeordnet ist.
Disjunktionen werden mittels "||" formuliert und erlauben Anfragen, die (mindestens) eine von mehreren möglichen Wertbedingungen erfüllen. Zum Beispiel liefert <ask>[[Category:Musical actor||Theatre actor]]</ask> jeden, der entweder Schauspieler in einem Musical oder in einer Theateraufführung ist. Dies funktioniert auch für Relationen wie <ask>[[born in::Boston||New York]]</ask>. Für Attribute werden Disjunktionen derzeit nicht unterstützt (weitere Hinweise für hilfreiche Mittel zur Abschwächung von Attributbedingungen finden sich jedoch nachfolgend).
Fragen nach Kategorien
Bedingungen, die Kategorien verwenden, sind üblicherweise eher einfach strukturiert; jedoch sind sie mächtiger als es zunächst den Anschein hat:
Wenn nach allen Artikeln in einer Kategorie gesucht wird, enthält das Resultat auch alle Artikel, die in Unterkategorien dieser Kategorie liegen.
Nimmt man beispielsweise an, es gäbe eine Kateogire "Theatre actor", die Unterkategorie von "Actor" ist, dann resultiert die Anfrage <ask>[[Category:Actor]]</ask> auch die "speziellen" Schauspieler aus der Kategorie "Theatre actor" und nicht nur jene aus der Kategorie "Actor". Dies ist in vielen Sitatuionen sinnvoll, kann jedoch im Einzelfall auch auf genau die angegebene Kategorie eingeschränkt werden (indem [[:Category:Actor]] verwendet wird).
Bedingungen mit Attributen
Im Falle von Attributwerten sucht man in der Regel nicht nach exakten Resultaten, sondern eher nach solchen, in innerhalb eines gewissen Bereiches liegen. So liefert
<ask>[[Category:Actor]] [[height:=>6 ft]] [[height:=<7 ft]]</ask>
alle Schauspieler, die wenigstens 6 Fuß, aber nicht mehr als 7 Fuß messen. An dieser Stelle ist die automatische Einheiten Konvertierung nützlich: Selbst wenn die Größe des Schauspierls durch [[height:=195cm]] definiert wurde, würde dieser Eintrag als korrekte Antwort gewertet werden.
Solche Bereichs-Bedingungen bei Attributen sind vor allem dort wichtig, bei denen die Werte in natürliche Weise geordnet werden können. Zum Beispiel macht es Sinn, eine Anfrage wie <ask>[[start date:=>May 6 2006]]</ask> zu stellen, jedoch eher wenig nach <ask>[[homepage URL:=>http://www.somewhere.org]]</ask> zu fragen.
Falls ein Datentyp keine natürliche lineare Ordnung hat, wendet Semantic MediaWiki einfach eine alphabetische Sortierung auf die normalisierten Datentypen an wie sie auch beim RDF export verwendet werden.
Direkte Bedingungen für Artikel
Bisher hingen alle Bedingungen von diversen Annotationen innerhalb der betroffenen Artikel ab. Allerdings gibt es auch Bedingungen, die direkt auf Artikel angewendet werden, um einige von ihnen zu selektieren respektive Artikel aus einem spezifizierten Namespace.
Indem ein direkter Verweis auf einen Artikel angegeben wird, ist es möglich, genau diesen für die Antwort auf eine Anfrage "vorzuselektieren". Zum Beispiel erhält man durch <ask>[[Bill Murray]]</ask> genau den einen Artikel über Bill Murray. Während dies auf den ersten Blick nicht übermäßig sinnvoll erscheint, so erhöht sich die Nützlichkeit doch, wenn man dies mit den im nächsten Abschnitt beschriebenen Möglichkeiten kombiniert. Bereits mit den jetztigen Möglichkeiten ist es beispielsweise möglich, die Vorselektion mittels Disjunktion mit Anfragen aus den weiter oben angegebenen Beispielen zu kombinieren. Man könnte also fragen: "Welcher der Vier, Bill Murray, Dan Aykroyd, Harold Ramis und Ernie Hudson, ist größer als 7 Fuß?".
Im Falle von Kategorien is es notwendig (wie schon von gewöhnlichen Artikeln bekannt), einen ":" vor den Artikelnamen zu setzen, um die Verwechslung von [[Category:Actor]] (liefert alle Schauspieler) und [[:Category:Actor]] (liefert die Kategorie "Actor") zu vermeiden.
Eine etwas weniger restriktive Möglichkeit, Artikel zu selektieren, bieten Namespaces. Dies wird über Wildcards in der Auswahl der Artikel ermöglicht, z.B. indem man
<ask>[[Help:+]]</ask>
schreibt, um alle Artikel aus dem namespace "Help" zu erhalten. Da der Standard-Namespace normalerweise kein Präfix hat, muss in diesem Fall <ask>[[:+]]</ask> verwendet werden. Im Falle von Kategorien ist ein zusätzlicher ":" nötig, um die Doppeldeutigkeiten zu vermeiden.
Was soll angezeigt werden?
Einfach Anfragen, die Bedingungen wie oben benutzen, liefern eine simple Liste der entsprechenden Artikel zurück. Um weitere Eigenschaften dieser Artikel anzuzeigen müssen weitere Befehle, wie etwa [[height:=*]] um die Größe (falls vorhanden) anzuzeigen, hinzugefügt werden. Die Verwendung von "*" bedeutet dabei, dass die "Bedingung" lediglich die Ausgabe betrifft. Es ist also genauso möglich zu schreiben:
- [[born in::*]] um "born in" Relationen von Artikel des Resultats anzuzeigen
- [[Category:*]] um alle Kategorien anzuzeigen, in denen sich der/die Artikel des Resultats direkt befinden.
Diese Ausgabe-Befehle haben keinen Einfluss auf die Menge der ausgewählten Artikel. Es ist also unerheblich, ob der Artikel keine, eine oder viele "born in" Relationen hat – - all dies wird für alle erhaltenen Artikel ausgegeben.
Wie sollen die Resultate angezeigt werden?
Standardmäßig ist ein Resultat eine durch Kommata getrennte Liste. Das Trennzeichen kann explizit durch das "sep"-Attribut im öffnenden Tag der Anfrage gesetzt werden (eine Liste aller Attribute findet sich weiter unten). Dadurch kann die Ausgabe den eigenen Bedürfnissen angepasst werden. Um zwei der häufigsten Ausgabe-Stile zu verwenden, kann der Benutzer auch das format-Attribut verwenden. Die folgende Anfrage liefert alles, was sich in Boston befindet als Liste mit Gliederungspunkten:
<ask format="ul">[[located in::Boston]]</ask>
Statt "ul" (benannt nach dem HTML-Tag ul) kann auch eine geordnete und nummerierte Liste durch Verwendung von "ol" angefordert werden oder eine echte Tabelle mittels "table". Tabellen, die von Semantic Mediawiki erzeugt werden, sind per Stylesheet mit einem Javascript Programm verbunden, das dem Benutzer erlaubt, die dargestellte Tabelle nach Spalten zu sortieren. Tabellen sind auch die einzige Möglichkeit, die Resultate komplexerer Anfragen darzustellen, die mehr als eine Spalte benötigen. Die folgende Anfrage liefert beispielsweise alle Schauspieler, zusammen mit ihren Geburtsorten und ihrer Größe:
<ask>[[Category:Actor]] [[born in::*]] [[height:=*]]</ask>}
Dabei wird der Name einer Relation oder eines Attributes als Spaltentitel verwendet. Falls ein alternativer Titel verwendet werden soll, kann die übliche Wikipedia-Syntax für Alternativen verwendet werden:
<ask>[[Category:Actor]] [[born in::*|Place of birth]]</ask>
Dabei ist zu beachten, dass keiner der Bausteine der Anfrage optional ist. Wenn also die Wissensbasis keine Information darüber enthält, wann ein Schauspieler geboren wurde, dann wird dieser im Resultat nicht aufgezählt (es gibt also keinen "unbekannt" Fülltext). Auf diese Weise kann man sehr einfach nach allen fragen, die einmal Hamlet gespielt haben, ohne angeben zu müssen, dass sie Schauspieler sind:
<ask>[[played::Hamlet]]</ask>
Sortierung und Verweise
Anfragen müssen nicht zwingend in einer Zeile formuliert werden, sondern können zur Verbesserung der Lesbarkeit und einfacheren Wartbarkeit auf mehrere Zeilen verteilt werden. Die Reihenfolge der Anfrage-Blöcke kann dabei frei gewählt werden (die resultierende Tabelle hat stets dieselbe Reihenfolge für alle angefragten Eigenschaften). Neben dem "sep" und dem "format" Attribute, gibt es noch drei weitere:
- "limit", das die Anzahl der Resultate begrenzt,
- "sort", das die Spalte definiert, nach der sortiert werden soll (Standard ist die erste Zeile) und
- "link", das definiert, für welche der gefundenen Resultate Verweise erzeugt werden sollen (standardmäßig geschieht dies nur für die erste Zeile). Mittels "none" werden keine Verweise erzeugt, mittels "all" werden alle Resultate mit Verweisen ausgestattet.
Das folgende Beispiel zeigt nun die zehn ältesten US-Städte mit einer Bevölkerung von mehr als drei Millionen Einwohnern zusammen mit ihrem Bürgermeister:
<ask sort="founded in" limit="10" link="all"> [[Population:=*]] [[Population:=>3000000]] [[Category:City]] [[founded in::*|founded]] [[Mayor::*]] [[located in::United States]] </ask>
OR (Disjunktive Verknüpfung)
Was wäre nun, wenn man auch kanadische Städte einbeziehen wollte? Man erweitert einfach den letzten Anfrage-Baustein zu[[located in::United States||Canada]]. Dabei ist "||" dem üblichen Symbol für "oder" (bzw. engl. "or") aus gängigen Programmierungsprachen entlehnt und kann hier so gelesen werden, dass die Stadt entweder in den USA oder in Kanada liegt.
Unter-Anfragen
Letztlich könnte man dieselbe Frage auch für Städte in der Europäischen Union stellen. Dazu kann man entweder die Länder der EU per Hand aufzählen oder, was gerade im Falle von Änderungen nützlicher ist, verschachtelte Anfragen einsetzen und vermeiden, das die Anfrage bei Aufnahme weiterer Mitglieder in die EU zu ändern ist. Man schreibt also:
<ask sort="founded in" limit="10" link="all"> [[Population:=*]] [[Population:=>3000000]] [[Category:City]] [[founded in::*|founded]] [[Mayor::*]] [[located in::<q>[[Category:Country]] [[part of::EU]]</q>]] </ask>
Die die Parser-Erweiterung von Mediawiki nicht mit verschachtelten Tags umgehen kann, muss man sich hier mit einem weiteren Tag behelfen. Dazu wurde hier <q> wie query gewählt.
Nachdem nun gezeigt wurde, wie komplex Anfragen werden können, sei aber darauf hingewiesen, dass die meisten Anfragen eher einfacher Natur und daher unkompliziert aufzuschreiben sind. Die Syntax wurde bewusst einfach gehalten, so dass ein Nutzer, der mit der Syntax von Semantic MediaWiki vertraut ist, in den meisten Fällen in der Lage sein wird, eine Anfrage auf Anhieb zu verstehen und auch eigene Anfragen zu formulieren.
Eine weitere Möglichkeit, Redundanz zu vermeiten und damit die Wartbarkeit und Qualität eines Wikis zu erhöhen, ist es, <ask>-Anfragen nicht nur für Listen, sondern auch im Artikel-Text zu verwenden. Nimmt man, zum Beispiel die Kommandohierarchie der Streitkräfte der Vereinigten Staaten, dann ist deren oberster Befehlshaber der Präsident. Der Artikel könnte jedoch, anstatt nur die abstrakte Information zu liefern, wer welche Position in der Hierarchie einnimmt, auch die tatsächliche Person enthalten, die dieses Amt einnimmt. Statt dies explizit niederzuschreiben und zu riskieren, dass die Information mit der nächsten Wahl veraltet ist, kann hier beispielsweise geschrieben werden:
Der oberste Befehlshaber ist der [[Präsident der Vereinigten Staaten]]. Dies ist derzeit <ask>[[Vereinigte Staaten]] [[Präsident::*]]</ask>.
Dies kann auch für Attribute verwendet werden, wie etwa für die Bevölkerung einer Stadt oder eines Landes, die auf diese Weise zentral auf der zugehörigen Seite verändert werden kann, jedoch überall im Wiki wiederverwendet und stets aktuell eingesetzt werden kann.
Parameter
Diese Parameter können im öffnenden <ask>-Tag angegeben werden.
- limit -- die maximale Anzahl der Antworten (standardmäßig 500)
- sort -- nach welcher Spalte soll sortiert werden
- order -- "ascending" (aufsteigende Sortierung) (gleichbedeutend mit "asc" (Standard)) oder "descending" (absteigende Ordnung) (gleichbedeutend mit "desc" oder "reverse")
- sep -- das Trennzeichen in einer Liste
- format -- entweder "list" (Liste) (Einträge werden getrennt durch "sep"), "ul" (für eine ungeordnete Liste von Aufzählungspunkten), "ol" (eine geordnete und nummerierte Liste) oder "table" (Tabelle)
- link -- entweder "none" (keine Einträge mit Verweisen ausstatten), "head" (Kopfzeile mit Verweisen ausstatten) oder "all" (Verweise für jedes Element)
- default -- falls aus irgendeinem Grund kein Resultat gefunden wird, dies zurückliefern
Examples
- <ask format="ul">[[Category:Paper]] [[accepted by::SemWiki2006]]</ask>
- <ask link="all">[[Category:Paper]] [[accepted by::SemWiki2006]] [[author::*]]</ask>
Tricks
Man kann sich in einem Template auf den aktuellen Seitennamen beziehen. Damit werden zwei Möglichkeiten eröffnet:
- Die Frage nach jedem, der die Instanz kennt, die von dieser Seite repräsentiert wird:
<ask>[[knows::{{PAGENAME}}]]</ask>
- nach allen Verwendungen einer Relation fragen
Wenn man das Template "ask" durch <ask>[[{{PAGENAME}}::+]]</ask> beschreibt, erhält man alle Verwendungen der Relation dadurch, dass man {{ask}} in der Wiki-Seite der Relation schreibt.
Dieser Artikel basiert auf dem Artikel Hilfe:Semantische Inline-Abfrage vom 10.07.2007 aus der Stadtwiki-Allmende. Die Liste der bisherigen Autoren befindet sich in der Versionsliste. Wie hier stehen alle Texte der Allmende unter der CC-Lizenz by-nc-sa.
Der Artikel wird auf Allmende gepflegt und ist daher hier gesperrt, es gibt aber eine lokale Diskussionsseite für Fragen.