Ich teile aus persönlicher Erfahrung mit, was wo und wann nützlich war. Überblicksartig und punktuell, damit klar ist, was und wo man weiterforschen kann – aber hier basiert es ausschließlich auf meiner subjektiven persönlichen Erfahrung, bei Ihnen könnte alles ganz anders sein.
Warum ist es wichtig, sich mit Abfragesprachen auszukennen? Im Grunde genommen gibt es im Data Science mehrere wesentliche Arbeitsphasen, und die erste und wichtigste (ohne die wird definitiv nichts funktionieren!) ist das Sammeln oder Extrahieren von Daten. Daten sitzen häufig irgendwo in irgendeiner Form und müssen dort herausgeholt werden.
Abfragesprachen ermöglichen genau das! Heute werde ich über die Abfragesprachen sprechen, die mir nützlich waren, und ich werde zeigen, wo und wie genau – warum es notwendig ist, sie zu lernen.
In diesem Artikel behandeln wir insgesamt drei Hauptblöcke von Datentypanfragen:
- «Standard» Abfragesprachen – das, was man normalerweise versteht, wenn man von einer Abfragesprache spricht, wie zum Beispiel relationale Algebra oder SQL.
- Scriptsprachen für Anfragen: zum Beispiel die Python-Tools wie pandas, numpy oder Shell-Scripting.
- Sprachen für Anfragen an Wissensgraphen und graphenbasierte Datenbanken.
Alles, was hier geschrieben ist, stammt aus persönlichen Erfahrungen, die nützlich waren, mit einer Beschreibung von Situationen und «warum es nötig war» – jeder kann prüfen, inwieweit solche Situationen Ihnen begegnen können und versuchen, sich im Voraus darauf vorzubereiten, indem er sich mit diesen Sprachen auseinandersetzt, bevor man sie (in dringender Reihenfolge) im Projekt anwenden muss oder auf ein Projekt stößt, in dem sie benötigt werden.
«Standard» Abfragesprachen
Standardabfragesprachen im Sinne dessen, dass wir normalerweise genau an sie denken, wenn wir über Anfragen sprechen.
Relationale Algebra
Warum ist relationale Algebra heute notwendig? Um ein gutes Verständnis dafür zu haben, warum Abfragesprachen auf bestimmte Weise strukturiert sind und um sie bewusst zu nutzen, muss man sich mit dem Kern auseinandersetzen, der ihr zugrunde liegt.
Was ist relationale Algebra?
Die formale Definition lautet: relationale Algebra ist ein abgeschlossenes System von Operationen über Relationen im relationalen Datenmodell. Menschlicher ausgedrückt ist es ein System von Operationen über Tabellen, so dass das Ergebnis ebenfalls immer eine Tabelle ist.
Siehe alle relationalen Operationen in Artikel von Habr – hier erklären wir, warum es wichtig ist, Wissen zu haben und wo es gebraucht wird.
Warum?
Du beginnst zu verstehen, aus welchen Komponenten Abfragesprachen bestehen und welche Operationen hinter den spezifischen Abfragesprachen stehen – oft gibt es ein tieferes Verständnis dafür, was und wie in Abfragesprachen funktioniert.

Entnommen aus einem Artikel. Beispiel für eine Operation: join, welches Tabellen verbindet.
Materialien zum Lernen:
. Überhaupt gibt es zahlreiche Materialien zur relationalen Algebra und Theorie – Coursera, Udacity. Es gibt auch eine riesige Menge an Online-Materialien, darunter auch gute . Mein persönlicher Rat: Man sollte die relationale Algebra sehr gut verstehen – das ist die Basis aller Grundlagen.
SQL

Entnommen aus Artikel.
SQL ist im Grunde eine Implementierung der relationalen Algebra – mit einem wichtigen Vorbehalt, SQL ist deklarativ! Das bedeutet, wenn du eine Abfrage in der Sprache der relationalen Algebra formulierst, sagst du im Grunde, wie berechnet werden soll – mit SQL gibst du an, was du extrahieren möchtest, und danach generiert das DBMS bereits (effektive) Ausdrücke in der Sprache der relationalen Algebra (die Äquivalenz ist uns bekannt durch ).

Entnommen aus Artikel.
Warum?
Relationale DBMS: Oracle, Postgres, SQL Server usw. – sind nach wie vor nahezu überall und es ist äußerst wahrscheinlich, dass du mit ihnen interagieren musst, was bedeutet, dass du entweder SQL lesen (was sehr wahrscheinlich ist) oder damit schreiben musst (auch nicht unwahrscheinlich).
Was man lesen und lernen sollte
Unter den oben genannten Links (zur relationalen Algebra) gibt es eine unglaubliche Menge an Materialien, zum Beispiel .
Übrigens, was ist NoSQL?
Es sollte noch einmal betont werden, dass der Begriff "NoSQL" einen absolut spontanen Ursprung hat und kein allgemein anerkanntes Definition oder wissenschaftliche Institution dahintersteckt. Entsprechend auf Habré.
Im Grunde haben die Leute erkannt, dass das vollständige relationale Modell nicht für die Lösung vieler Aufgaben notwendig ist, insbesondere für solche, bei denen, beispielsweise, die Leistung entscheidend ist und bestimmte einfache Abfragen mit Aggregation dominieren – es ist wichtig, Metriken schnell zu berechnen und in die Datenbank zu schreiben, während die meisten Funktionen der relationalen Datenbank nicht nur unnötig, sondern sogar schädlich sind – warum etwas normalisieren, wenn es das Wichtigste für uns (für eine bestimmte Aufgabe) – die Leistung – beeinträchtigen würde?
Auch häufig benötigte flexible Modelle anstelle von festen mathematischen Schemen des klassischen relationalen Modells erleichtern die Anwendungsentwicklung enorm, insbesondere wenn es entscheidend ist, das System schnell bereitzustellen und mit der Verarbeitung der Ergebnisse zu beginnen — oder das Schema und die Arten der gespeicherten Daten nicht so wichtig sind.
Zum Beispiel erstellen wir ein Expertensystem und möchten Informationen zu einem bestimmten Bereich zusammen mit einigen Metainformationen speichern — wir müssen vielleicht nicht alle Felder kennen und können einfach JSON für jeden Datensatz speichern — das gibt uns eine sehr flexible Umgebung zur Erweiterung unseres Datenmodells und für schnelles Iterieren — deshalb wäre in diesem Fall NoSQL sogar vorzuziehen und lesbarer. Ein Beispiel für einen Datensatz (aus einem meiner Projekte, wo NoSQL genau dort gebraucht wurde).
{"en_wikipedia_url":"https://en.wikipedia.org/wiki/Johnny_Cash",
"ru_wikipedia_url":"https://ru.wikipedia.org/wiki/?curid=301643",
"ru_wiki_pagecount":149616,
"entity":[42775,"Джонни Кэш","ru"],
"en_wiki_pagecount":2338861}
Weitere Informationen können hier gelesen werden über NoSQL.
Was zu lernen?
Hier ist es eher notwendig, die Aufgabe gut zu analysieren, welche Eigenschaften sie hat und welche NoSQL-Systeme zu dieser Beschreibung passen — und sich dann mit diesem System zu beschäftigen.
Skriptsprache für Abfragen
Zunächst erscheint es, als ob Python hier überhaupt keinen Bezug hat – das ist eine Programmiersprache und hat nichts mit Abfragen zu tun.

- Pandas ist das Schweizer Taschenmesser der Data Science, eine enorme Menge an Datenveränderungen, Aggregationen usw. findet darin statt.
- Numpy — Vektorberechnungen, Matrizen und lineare Algebra sind dort enthalten.
- Scipy — viele mathematische Funktionen sind in diesem Paket, besonders Statistiken.
- Jupyter Lab — viel explorative Datenanalyse passt gut in Notebooks — es ist nützlich, das zu beherrschen.
- Requests — Arbeiten mit Netzwerken.
- Pyspark — sehr beliebt unter Dateningenieuren, wahrscheinlich müssen Sie mit diesem oder Spark interagieren, einfach wegen ihrer Beliebtheit.
- *Selenium — sehr nützlich für das Sammeln von Daten von Websites und Ressourcen, manchmal ist es einfach anders nicht möglich, an die Daten zu gelangen.
Mein Haupttipp: Lernen Sie Python!
Pandas
Nehmen wir als Beispiel den folgenden Code:
import pandas as pd
df = pd.read_csv("data/dataset.csv")
# Berechnen und umbenennen von Aggregationen
all_together = (df[df['trip_type'] == "return"]
.groupby(['start_station_name','end_station_name'])
.agg({'trip_duration_seconds': [np.size, np.mean, np.min, np.max]})
.rename(columns={'size': 'num_trips',
'mean': 'avg_duration_seconds',
'amin': 'min_duration_seconds',
'amax': 'max_duration_seconds'}))Im Grunde sehen wir, dass der Code in das klassische SQL-Muster passt.
SELECT start_station_name, end_station_name, count(trip_duration_seconds) as size, …..
FROM dataset
WHERE trip_type = 'return'
GROUP BY start_station_name, end_station_nameEin wichtiger Punkt ist, dass dieser Code Teil eines Skripts und eines Pipelines ist; tatsächlich integrieren wir Abfragen in die Python-Pipeline. In diesem Fall kommen die Abfragesprachen aus Bibliotheken wie Pandas oder pySpark.
Insgesamt sehen wir in pySpark eine ähnliche Art der Datenumwandlung über die Abfragesprache mit folgendem Ansatz:
df.filter(df.trip_type = "return")
.groupby("day")
.agg({duration: 'mean'})
.sort()Wo und was zu lesen ist
Gehört zu Python überhaupt Materialien zum Lernen zu finden. Es gibt online eine große Anzahl an Tutorials zu , und Kursen über (sowie über das Programmieren mit ). Im Allgemeinen lassen sich die Materialien hervorragend googlen, und wenn ich einen einzigen Paket auswählen müsste, auf das man sich konzentrieren sollte, wäre es sicherlich pandas. Auch zu der Kombination DS+Python gibt es viele .
Shell als Abfragesprache
Es gibt nicht wenige Projekte zur Verarbeitung und Analyse von Daten, mit denen ich gearbeitet habe – das sind im Grunde Shell-Skripte, die Code in Python, Java aufrufen und tatsächlich die Shell-Befehle selbst. Daher kann man Pipelines in Bash/Zsh/etc. im Allgemeinen als eine Art hochrangige Anfrage betrachten (man kann dort natürlich auch Schleifen einfügen, aber das ist untypisch für DS-Code in Shell-Sprachen). Lassen Sie uns ein einfaches Beispiel anführen – ich musste ein Mapping von QID von Wikidata und den vollständigen Links zur russischen und englischen Wikipedia erstellen, dazu schrieb ich eine einfache Abfrage aus Bash-Befehlen und zur Ausgabe ein einfaches Skript in Python, das ich so zusammenstellte:
pv "data/latest-all.json.gz" |
unpigz -c |
jq --stream $JQ_QUERY |
python3 scripts/post_process.py "output.csv"
wo
JQ_QUERY = 'select((.[0][1] == "sitelinks" and (.[0][2] == "enwiki" or .[0][2] == "ruwiki") and .[0][3] == "title") or .[0][1] == "id")' Das war im Wesentlichen die gesamte Pipeline, die das erforderliche Mapping erzeugte, wie wir sehen, alles lief im Streaming-Modus:
- pv filepath – zeigt eine Fortschrittsanzeige basierend auf der Dateigröße und leitet deren Inhalt weiter
- unpigz -c las die Dateiarchivteile und gab sie an jq weiter
- jq mit dem Schlüssel – stream lieferte sofort das Ergebnis und übergab es dem Postprozessor (genauso wie im ersten Beispiel) in Python
- Innerhalb des Postprozessors – das ist eine einfache Zustandsmaschine, die die Ausgabe formatiert.
Insgesamt ist dies eine komplexe Pipeline, die im Streaming-Modus mit großen Daten (0,5 TB) läuft, ohne wesentliche Ressourcen und besteht aus einer einfachen Pipeline und ein paar Tools.
Ein weiterer wichtiger Rat: Seien Sie im Umgang mit dem Terminal und im Schreiben in bash/zsh/etc. gut und effektiv.
Wo ist das nützlich? Eigentlich überall – es gibt WIRKLICH viele Materialien zum Lernen im Internet. Besonders habe ich hier meinen vorherigen Artikel.
R-Skripting
Wieder könnte der Leser ausrufen – aber das ist doch eine komplette Programmiersprache! Und damit hätte er recht. Allerdings habe ich normalerweise R immer in einem Kontext erlebt, wo es im Grunde genommen sehr wie eine Abfragesprache war.
R ist eine Umgebung für statistische Berechnungen und eine Sprache für statistische Berechnungen und Visualisierungen (laut ).

Entnommen . Übrigens, ich empfehle es, es ist ein gutes Material.
Warum sollte ein Data Scientist R kennen? Zumal es einen großen Block von Personen außerhalb der IT gibt, die Datenanalysen mit R durchführen. Ich habe es in folgenden Bereichen gesehen:
- Pharmazeutischer Sektor.
- Biologen.
- Finanzsektor.
- Menschen mit rein mathematisischer Ausbildung, die sich mit Statistiken beschäftigen.
- Spezialisierte statistische Modelle und Modelle des maschinellen Lernens (die oft nur in der autorisierten Version als R-Paket zu finden sind).
Warum ist es faktisch eine Abfragesprache? In der Form, in der es häufig vorkommt – es ist tatsächlich eine Anfrage zur Erstellung eines Modells, einschließlich des Lesens von Daten und der Festlegung der Parameter der Anfrage (Modelle), sowie der Visualisierung von Daten in Paketen wie ggplot2 – das ist auch eine Form des Schreibens von Anfragen.
Beispielanfragen zur Visualisierung
ggplot(data = beav,
aes(x = id, y = temp,
group = activ, color = activ)) +
geom_line() +
geom_point() +
scale_color_manual(values = c("red", "blue"))Im Allgemeinen sind viele Ideen aus R in Python-Pakete wie pandas, numpy oder scipy übergegangen, wie DataFrames und Datenvektorisierung – deshalb werden viele Dinge in R Ihnen bekannt und hilfreich erscheinen.
Es gibt viele Quellen zum Lernen, zum Beispiel .
Wissensgraph (Knowledge Graph)
Hier habe ich etwas ungewöhnliche Erfahrungen, weil ich tatsächlich ziemlich oft mit Wissensgraphen und Abfragesprachen für Graphen arbeite. Deshalb werden wir nur kurz die Grundlagen durchgehen, da dieser Teil etwas exotischer ist.
In klassischen relationalen Datenbanken haben wir ein fixes Schema – hier hingegen ist das Schema flexibel, jeder Prädikat ist faktisch eine "Spalte" und noch viel mehr.
Stellen Sie sich vor, Sie würden einen Menschen modellieren und wollten die wesentlichen Dinge beschreiben. Nehmen wir als Beispiel die konkrete Person Douglas Adams und verwenden wir diese Beschreibung.

Wenn wir eine relationale Datenbank verwenden würden, müssten wir eine riesige Tabelle oder Tabellen mit einer großen Anzahl von Spalten erstellen, von denen die meisten NULL oder mit einem Standardwert wie 'False' gefüllt wären; es ist wohl kaum so, dass viele von uns einen Eintrag in der nationalen koreanischen Bibliothek haben – natürlich könnten wir sie in separate Tabellen auslagern, aber letztendlich wäre das ein Versuch, ein flexibles logisches Schema mit Prädikaten zu modellieren, unter Verwendung einer festen relationalen Struktur.

Stellen Sie sich daher vor, dass alle Daten als Graph oder in Form von binären und unären logischen Ausdrücken gespeichert werden.
Wo können Sie damit überhaupt konfrontiert werden? Zunächst einmal beim Arbeiten mit , und auch mit allen Graphdatenbanken oder verknüpften Daten.
Hier folgen die Hauptabfragesprachen, die ich anwenden musste und mit denen ich gearbeitet habe.
SPARQL
Wiki:
SPARQL ( ab SPARQL Protocol and RDF Query Language) — , die nach dem Modell , sowie zur Übertragung dieser Abfragen und der Antworten darauf. SPARQL ist eine Empfehlung des und eine der Technologien .
Im Grunde genommen ist es eine Abfragesprache für logische unäre und binäre Prädikate. Es wird einfach angenommen, was im logischen Ausdruck festgelegt ist und was nicht (sehr vereinfacht).
Die RDF-Datenbank (Resource Description Framework), auf der SPARQL-Abfragen ausgeführt werden – das sind Tripel Subjekt, Prädikat, Objekt – und die Abfrage wählt die gewünschten Tripel basierend auf den angegebenen Einschränkungen in der Art: finde ein solches X, dass p_55(X, q_33) wahr ist – wo p_55 natürlich eine Beziehung mit der ID 55 ist und q_33 das Objekt mit der ID 33 (und das ist die ganze Geschichte, wobei wir wiederum zahlreiche Details auslassen).
Beispiel für die Datenpräsentation:

Bilder und Beispiel mit Ländern sind hier .
Beispiel für eine grundlegende Abfrage:

Tatsächlich wollen wir den Wert der Variablen ?country finden, so dass es für das Prädikat
member_of wahr ist, dass member_of(?country,q458) zutrifft, wobei q458 die ID der Europäischen Union ist.
Beispiel einer realen SPARQL-Abfrage innerhalb der Python-Engine:

In der Regel musste ich SPARQL lesen und nicht schreiben — in einer solchen Situation ist es wahrscheinlich nützlich, die Sprache mindestens auf einem grundlegenden Niveau zu verstehen, um zu begreifen, wie genau die Daten abgerufen werden.
Es gibt viele Online-Materialien zum Lernen: zum Beispiel hier und . Ich suche normalerweise spezifische Konstruktionen und Beispiele und das reicht bisher aus.
Logische Abfragesprachen
Mehr zum Thema kann in meinem Artikel gelesen werden . Hier werden wir jedoch nur kurz erläutern, warum logische Sprachen gut geeignet sind, um Abfragen zu schreiben. Im Grunde genommen ist RDF einfach eine Sammlung von logischen Aussagen wie p(X) und h(X,Y), und eine logische Abfrage hat folgendes Format:
output(X) :- country(X), member_of(X,"EU").
Hier sprechen wir über die Erstellung eines neuen Prädikats output/1 ( /1 — das bedeutet unär), unter der Voraussetzung, dass für X gilt, dass country(X) — d.h. X ist ein Land und auch member_of(X,"EU").
Das bedeutet, dass sowohl die Daten als auch die Regeln in diesem Fall vollkommen gleich dargestellt werden, was es ermöglicht, Aufgaben sehr einfach und gut zu modellieren.
Wo es in der Industrie aufgetreten ist: ein ganz großes Projekt mit einem Unternehmen, das in dieser Sprache Abfragen schreibt, und auch im aktuellen Projekt im Kernsystem — scheinbar eine ziemlich exotische Sache, kommt jedoch manchmal vor.
Ein Beispiel für einen Codeausschnitt in einer logischen Sprache, die wikidata verarbeitet:

Materialien: Ich werde hier einige Links zur modernen logischen Programmiersprache Answer Set Programming anführen — ich empfehle, genau diese zu studieren:
Quelle: habr.com
