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.
SELECTnennt drei Felder, die aufgelistet werden sollen.FROMgibt eine Tabelle an, der die Felder entnommen werden sollen.- Groß- und Kleinschreibung des Tabellennamens
userist hier ohne Bedeutung und erfolgt in der vorstehenden Darstellung automatisch.
- Groß- und Kleinschreibung des Tabellennamens
LIMITbeschrä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 = 1die Seite ist eine Weiterleitung.page_namespace = 0die Seite ist ein enzyklopädischer Artikel;0ist die Nummer des ANR.rd_from = page_idder Eintrag in der Tabelle aller Weiterleitungen soll die gleiche Seitenkennnummer haben wie die festgestellte Artikel-Weiterleitung.rd_namespace <> 0das Ziel der Weiterleitung liegt nicht im ANR, weil die Nummer des Namensraums ungleich0ist.
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
pjoingebildet 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
pageundpagelinksübereinstimmt, und bildet wie im vorigen Beispiel eine Art kombinierten Datensatz daraus. - Mit dieser Pseudo-Tabelle wird eine weitere namens
pggebildet.- Sie enthält die Kategorieseiten über die Nummer
14des Namensraums. - Sie ist über die Bedingung eingeschränkt, dass eine verlinkte Zielseite nicht existiert, was über
pjoin.page_namespace IS NULLrealisiert 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 vonpagelinksvorgegebene Bedingung zu namespace/title erfüllen.- Weil es nur einen einzigen Treffer geben kann, wird der Zählvorgang nach der ersten Fundstelle mittels
LIMIT 1abgebrochen. - Das in Klammern gesetzte Ergebnis ist der Funktionswert von COUNT() und kann einen der Werte
1oder0annehmen.
- 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“