Wikipedia:Technik/Cloud/quarry
[1] ist eine seit 2014 verfügbare Schnittstelle, mit der alle angemeldeten WMF-Benutzer via SQL Datenbankabfragen zu den Wikis ausführen können.
Die Bot-Betreiber haben gute Kenntnisse in SQL und können ggf. unter Bots/Anfragen konkrete Abfragen erstellen.
Erreichbare Informationen
[Quelltext bearbeiten]Die Anfrage geht nicht an die produktiven Wiki-Versionen, sondern an Replikate, die mit leichter Verzögerung oder auch mal größerer Verspätung aktualisiert werden.
Nicht verfügbar sind die eigentlichen textlichen Inhalte der Seiten; hingegen alle Meta-Informationen über das Projekt und die enthaltenen Seiten, namentlich:
- Seiteninformationen
- Versionsgeschichte nebst Bearbeitungskommentaren
- Außenwirkung einer Seite, wie:
- eingebundene Vorlagen und Module
- eingebundene Medien (Bilder)
- externe Links („Weblinks“): Verlinkung per URL
- Kategorisierung
- Internationalisierung
- Links auf diese Seite
- Logbuch-Informationen
- Benutzerinfos
- Allgemeine Projektkonfiguration und Statistik
Nicht enthalten sind bewusst für die Öffentlichkeit gesperrte Informationen, wie Versionslöschungen usw.
Benutzeranmeldung
[Quelltext bearbeiten]Der Zugang erfolgt über OAuth, wodurch der Quarry-Zugriff mit dem Wikipedia-Benutzerkonto verbunden wird.
Registrierung als normaler Wiki-Benutzer:
- Zunächst bei meta: (meta.wikimedia.org) anmelden.
- quarry.wmflabs.org besuchen.
- Login with Wikimedia anklicken.
- Es erscheint eine OAuth-Rückfrage für SQL Quarry.
- Dieser wäre dann wohl zuzustimmen.
- Der Zugriff kann wieder entzogen werden über einen Link in der Spezialseite meta:Special:OAuthManageMyGrants (oder der entsprechenden Seite in einem anderen, mit diesem zusammengeführten Wiki – z. B. ggf. Spezial:Meine_Berechtigungen_verwalten), die verlinkt ist in der Spezialseite meta:Special:Preferences (Einstellungen im Wikimedia Meta-Wiki, ist auch in der entsprechenden Seite jedes anderen, mit diesem zusammengeführten Wikis – z. B. ggf. Spezial:Einstellungen – verlinkt) im Tab Benutzerdaten, Abschnitt Basisinformationen hinter Verbundene Anwendungen (Connected apps).
Benutzerprofil
[Quelltext bearbeiten]Jeder Benutzer kann die persönlichen Abfragen, Entwürfe dazu sowie publizierte Abfragen individuell verwalten.
Abfragen
[Quelltext bearbeiten]Über New Query gelangt man in den Eingabemodus. Unten auf schwarzem Hintergrund befindet sich die interaktive Konsole.
Konsole
[Quelltext bearbeiten]Die deutschsprachige Wikipedia[2] muss zunächst ausgewählt werden mittels:
USE dewiki_p;
Die Abfrage kann dann mittels Submit Query gestartet werden.
Im weiteren Verlauf erhält man Statusmeldungen über den Bearbeitungsstand; schließlich hoffentlich auch das Ergebnis.
Speichern
[Quelltext bearbeiten]Eine Abfrage kann zur Wiederverwendung abgespeichert werden.
- Dazu sollte sie mit einem aussagekräftigen Titel und auch mit einer Kurzbeschreibung des Zwecks in menschlicher Sprache ausgestattet werden.
- Jede Abfrage erhält eine laufende Nummer, unter der sie erneut ausgeführt und modifiziert werden kann.
- Die Abfragen können öffentlich gemacht werden.
- Quarry:query/runs/all – kürzliche Abfragen.
- Eine Verlinkung ist mit
[[Quarry:]]
möglich; auf einzelne Abfragen oder mit Quarry: auf das ganze Projekt.
Ergebnisse herunterladen
[Quelltext bearbeiten]Zur Weiterverarbeitung können die Ergebnisse in den Formaten CSV, TSV (Tabulator-Separated Values) oder JSON aktualisiert und lokal gespeichert werden.
URL:
http://quarry.wmflabs.org/run/
Abfragenummer/output/
Lauf-Nummer/
Formatierung
mit
- Formatierung – eine von
csv tsv json
Ergebnisse verlinken
[Quelltext bearbeiten]Die Verlinkung von gespeicherten Abfragen ist über [[quarry:]]
möglich, wobei als „Seitenname“ die Abfragenummer anzugeben ist.
Datenstrukturen
[Quelltext bearbeiten]- Datenbank/Struktur – deutschsprachige Übersicht der Datenbanktabellen
- mw:Manual (englisch)
- mw:Manual:Database layout – Struktur der Wiki-Datenbank
- mw:Manual:Page table – Herzstück: Seiteninfo
- mw:Manual:Database layout – Struktur der Wiki-Datenbank
- MediaWiki/Datenformate – Schlüsselwörter und Codes (deutsch)
Beispielabfragen
[Quelltext bearbeiten]Wer waren die ersten 100 Benutzer der deutschsprachigen Wikipedia?
[Quelltext bearbeiten]USE dewiki_p;
SELECT user_id, user_name, user_editcount
FROM user
LIMIT 100;
- Die erste Zeile wählt die deutschsprachige Wikipedia als Grundlage aus.
SELECT
nennt drei Felder, die aufgelistet werden sollen.FROM
gibt eine Tabelle an, der die Felder entnommen werden sollen.- Groß- und Kleinschreibung des Tabellennamens
user
ist hier ohne Bedeutung und erfolgt in der vorstehenden Darstellung automatisch.
- Groß- und Kleinschreibung des Tabellennamens
LIMIT
beschränkt die Abfrage auf die ersten 100 Treffer.- Die Abfrage enthält die folgende Grammatik: SELECT … FROM … LIMIT …;
- Der SQL-Code enthält zwei Statements, deren jedes traditionell mit einem Semikolon
;
abgeschlossen ist; funktionieren würde es auch ohne.
Das Ergebnis ist als Quarry:query/1470 unter Nummer 1470 gespeichert.
Verknüpfte Tabellen
[Quelltext bearbeiten]Die nachstehende Abfrage verknüpft die beiden Tabellen page
und redirect
über die in beiden vorhandene Seitenkennnummer miteinander.
- Ziel ist es, alle enzyklopädischen Artikel aufzulisten, die eine Weiterleitung in einen anderen Namensraum darstellen.
Dazu wird wie folgt vorgegangen:
- In SELECT werden drei Datenfelder aufgelistet, die die drei angezeigten Spalten ergeben werden.
- FROM gibt die beiden zu nutzenden Tabellen an. Jetzt ist es erforderlich, die exakte Notation der Tabellenbezeichener – also die Kleinschreibung – zu verwenden.
- Auf WHERE folgen vier mittels AND verknüpfte Bedingungen, die die Reultate immer weiter eingrenzen:
page_is_redirect = 1
die Seite ist eine Weiterleitung.page_namespace = 0
die Seite ist ein enzyklopädischer Artikel;0
ist die Nummer des ANR.rd_from = page_id
der Eintrag in der Tabelle aller Weiterleitungen soll die gleiche Seitenkennnummer haben wie die festgestellte Artikel-Weiterleitung.rd_namespace <> 0
das Ziel der Weiterleitung liegt nicht im ANR, weil die Nummer des Namensraums ungleich0
ist.
USE dewiki_p;
SELECT page_title, rd_namespace, rd_title
FROM page, redirect
WHERE page_is_redirect = 1
AND page_namespace = 0
AND rd_from = page_id
AND rd_namespace <> 0;
Es dürfen nur drei Weiterleitungen auf 4:Hauptseite resultieren.
In MediaWiki wurden die Bezeichner der Felder so gewählt, dass sie innerhalb der gesamten Datenbank nur einmal vorkommen. Das ist nicht zwingend notwendig; klassisch würde man in jeder Tabelle das Feld mit der Seitenkennnummer nur pageid
nennen und das für die Nummer des Namensraums überall ns
. Dann müste zur Unterscheidung immer der Name der Tabelle vorangestellt werden; also page.pageid
und page.ns
gegen redirect.pageid
und redirect.ns
. Das funktioniert hier auch und würde wie folgt aussehen:
USE dewiki_p;
SELECT page.page_title, redirect.rd_namespace, redirect.rd_title
FROM page, redirect
WHERE page.page_is_redirect = 1
AND page.page_namespace = 0
AND redirect.rd_from = page.page_id
AND redirect.rd_namespace <> 0;
Verknüpfte Tabellen mit JOIN
[Quelltext bearbeiten]Die nachstehende Abfrage verknüpft die beiden Tabellen page
und pagelinks
miteinander.
- Ziel ist es, alle Kategoriebeschreibungsseiten aufzulisten, die ein redlink enthalten.
Ein Lösungsansatz ist der folgende:
- Es wird eine Pseudo-Tabelle
pjoin
gebildet mit der Forderung LEFT JOIN. Es handelt sich um eine Form des sogenannten outer join. - Diese Pseudo-Tabelle enthält alle Datensätze, bei denen die Paarung namespace/title von
page
undpagelinks
übereinstimmt, und bildet wie im vorigen Beispiel eine Art kombinierten Datensatz daraus. - Mit dieser Pseudo-Tabelle wird eine weitere namens
pg
gebildet.- Sie enthält die Kategorieseiten über die Nummer
14
des Namensraums. - Sie ist über die Bedingung eingeschränkt, dass eine verlinkte Zielseite nicht existiert, was über
pjoin.page_namespace IS NULL
realisiert wurde; bei einer existierenden Zielseite (und Fundstelle inpjoin
) wäre das eine Zahl.
- Sie enthält die Kategorieseiten über die Nummer
- Schließlich werden (nicht unbedingt sortiert) aufgelistet: Der Titel der Kategorie, die Namensraum-Nummer und der Titel des Wikilinks.
USE dewiki_p;
SELECT pg.page_title, pl_namespace, pl_title
FROM ( pagelinks LEFT JOIN page pjoin
ON pl_namespace = pjoin.page_namespace
AND pl_title = pjoin.page_title
) LEFT JOIN page pg
ON pl_from = pg.page_id
WHERE pl_from_namespace = 14
AND pjoin.page_namespace IS NULL;
Funktionsaufruf und sub-SELECT
[Quelltext bearbeiten]Die gleiche Aufgabenstellung wie im vorherigen Beispiel kann auch noch auf einem anderen Weg gelöst werden (aber vermutlich weniger effizient):
- Ein sub-SELECT zählt mittels der Funktion COUNT() alle Datensätze in
page
, die eine vonpagelinks
vorgegebene Bedingung zu namespace/title erfüllen.- Weil es nur einen einzigen Treffer geben kann, wird der Zählvorgang nach der ersten Fundstelle mittels
LIMIT 1
abgebrochen. - Das in Klammern gesetzte Ergebnis ist der Funktionswert von COUNT() und kann einen der Werte
1
oder0
annehmen.
- Weil es nur einen einzigen Treffer geben kann, wird der Zählvorgang nach der ersten Fundstelle mittels
- Ansonsten wird im ersten SELECT wieder die gleiche Bedingung formuliert:
- Kategorieseite.
- Verknüpfung der beiden Tabellen über die Seitenkennnummer.
- „Redlink“ über sub-SELECT.
USE dewiki_p;
SELECT page_title, pl_namespace, pl_title
FROM page, pagelinks
WHERE pl_from_namespace = 14
AND page_id = pl_from
AND ( SELECT COUNT(*)
FROM page
WHERE page_title = pl_title
AND page_namespace = pl_namespace
LIMIT 1 ) = 0;
Weitere Informationen
[Quelltext bearbeiten]- Datenschutzrichtlinie der WMF
- Datenstrukturen – siehe oben
Alternative Methoden
- API – andere Abfragetechnik, direkt online; gleiche Daten und zusätzlich alle Textinhalte, aber weniger Möglichkeiten zur Auswertung in der Abfrage selbst
- Cirrus – fortgeschrittene Möglichkeiten zur Suche in den aktuellen Textinhalten
Anmerkungen
[Quelltext bearbeiten]- ↑ englisch für ‚Fundgrube‘, auch ‚Steinbruch‘; Wortspiel mit query – dem Kernstück aller Datenbankabfragen
- ↑ Zu weiteren Wikis siehe „Datenbankname“