Mit Messungen arbeiten
In diesem Dokument wird beschrieben, wie Sie Messwerte in Ihren Diagrammen definieren und abfragen. Mit Messwerten können Sie dafür sorgen, dass Aggregationen bei Joins korrekt ausgeführt werden.
Übersicht
Eine Messung ist eine aggregierte Eigenschaft, die in der PROPERTIES-Klausel einer Knoten- oder Kantentabelle definiert ist. Messwerte werden mit dem Schlüsselwort MEASURE und einer der folgenden unterstützten Aggregatfunktionen definiert:
SUMAVGCOUNTCOUNT(DISTINCT)MINMAX
Messwerte definieren ihre Aggregation in Bezug auf das KEY der Knoten- oder Edge-Tabelle, in der sie definiert sind. Wenn Sie eine Messung abfragen, wird die Aggregation also auch dann korrekt ausgeführt, wenn die zugrunde liegende Tabelle so verknüpft ist, dass Zeilen dupliziert werden.
Sie können in einer GQL-Abfrage nicht auf eine Property verweisen, die durch eine Messung definiert wird. Stattdessen greifen Sie auf Messwerte zu, indem Sie die GRAPH_EXPAND-TVF aufrufen, um eine vereinfachte Tabellendarstellung Ihres Diagramms zu erstellen. Diese Funktion akzeptiert nicht alle Arten von Diagrammen. Weitere Informationen dazu, welche Grafiken eine gültige Eingabe darstellen, finden Sie unter Eingabebeschränkungen.
Zum Ausführen von GQL-Abfragen benötigen Sie eine Reservierung mit dem Enterprise oder Enterprise Plus.
Wenn Sie On-Demand-Preise verwenden, können Sie die Funktion GRAPH_EXPAND aufrufen, um SQL-Abfragen für Ihren Graphen auszuführen.
Sie können die Funktion AGG für die Ausgabe der TVF GRAPH_EXPAND aufrufen, um die Properties gemäß der Aggregationsfunktion zu aggregieren, die Sie im Messwert definiert haben.
Messwerte definieren
Sie definieren Messwerte in der PROPERTIES-Klausel einer Knoten- oder Kantentabellendefinition, indem Sie das MEASURE()-Schlüsselwort um eine unterstützte Aggregatfunktion verwenden.
Im folgenden Beispiel wird ein Dataset mit dem Namen university und Tabellen für Hochschulen, Fachbereiche und Kurse erstellt:
CREATE SCHEMA IF NOT EXISTS university;
CREATE OR REPLACE TABLE university.College (
college_id INT64 PRIMARY KEY NOT ENFORCED,
college_name STRING
);
CREATE OR REPLACE TABLE university.Department (
dept_id INT64 PRIMARY KEY NOT ENFORCED,
dept_name STRING,
college_id INT64,
budget FLOAT64,
FOREIGN KEY (college_id) REFERENCES university.College(college_id) NOT ENFORCED
);
CREATE OR REPLACE TABLE university.Course (
course_id INT64 PRIMARY KEY NOT ENFORCED,
course_name STRING,
dept_id INT64,
credits INT64,
FOREIGN KEY (dept_id) REFERENCES university.Department(dept_id) NOT ENFORCED
);
INSERT INTO university.College (college_id, college_name)
VALUES (101, 'College of Engineering'),
(102, 'College of Arts');
INSERT INTO university.Department (dept_id, dept_name, college_id, budget)
VALUES (1001, 'Computer Science', 101, 500000),
(1002, 'Mechanical Engineering', 101, 400000),
(1003, 'Fine Arts', 102, 200000),
(1004, 'Research', 101, 50000);
INSERT INTO university.Course (course_id, course_name, dept_id, credits)
VALUES (1, 'Intro to CS', 1001, 3),
(2, 'Data Structures', 1001, 4),
(3, 'Thermodynamics', 1002, 3),
(4, 'Oil Painting', 1003, 2);
Mit der folgenden Anweisung wird ein Diagramm mit dem Namen SchoolGraph erstellt, in dem Messwerte für einige der Eigenschaften in den Knoten Department und Course definiert werden.
Sie müssen einen Alias für Properties angeben, die durch eine Messung definiert werden.
CREATE OR REPLACE PROPERTY GRAPH university.SchoolGraph
NODE TABLES (
university.College
KEY(college_id)
PROPERTIES(college_id, college_name),
university.Department
KEY(dept_id)
PROPERTIES(dept_id, dept_name, college_id,
budget OPTIONS(description="Department budget in USD"),
MEASURE(SUM(budget)) AS total_budget),
university.Course
KEY(course_id)
PROPERTIES(
course_id,
course_name,
credits,
dept_id,
MEASURE(AVG(credits)) AS avg_credits,
MEASURE(SUM(credits)) AS total_credits,
MEASURE(COUNT(course_id)) AS course_count)
)
EDGE TABLES (
university.Department AS CollegeDept
SOURCE KEY (college_id) REFERENCES College (college_id)
DESTINATION KEY (dept_id) REFERENCES Department (dept_id),
university.Course AS DeptCourse
SOURCE KEY (dept_id) REFERENCES Department (dept_id)
DESTINATION KEY (course_id) REFERENCES Course (course_id)
);

Der Messwert total_budget ist als MEASURE(SUM(budget)) definiert. Mit der Maßnahme wird die Aggregation auf KEY festgelegt, also dept_id.
Doppelte Zählungen
Wenn Sie Tabellen verknüpfen, werden Daten jedes Mal wiederholt, wenn in Ihren Daten eine 1:n-Beziehung besteht. Wenn Sie beispielsweise die Tabellen Course, Department und College zusammenführen, wird eine Abteilung mit mehreren Kursen in mehreren Zeilen in der Ausgabe angezeigt:
SELECT
college_name,
dept_name,
course_name,
budget
FROM university.Course
LEFT JOIN university.Department
ON Course.dept_id = Department.dept_id
LEFT JOIN university.College
ON Department.college_id = College.college_id;
/*------------------------+------------------------+-----------------+----------+
| college_name | dept_name | course_name | budget |
+------------------------+------------------------+-----------------+----------+
| College of Engineering | Computer Science | Intro to CS | 500000.0 |
| College of Engineering | Computer Science | Data Structures | 500000.0 |
| College of Engineering | Mechanical Engineering | Thermodynamics | 400000.0 |
| College of Arts | Fine Arts | Oil Painting | 200000.0 |
+------------------------+------------------------+-----------------+----------*/
Wenn Sie versuchen, das Gesamtbudget pro Hochschule mit SUM(budget) zu berechnen, wird das Budget der Informatikabteilung zweimal gezählt. Sie können dieses Problem umgehen, indem Sie die Tabelle Department direkt abfragen. Dieser Ansatz funktioniert jedoch nicht, wenn Sie mehrere Aggregationen aus verschiedenen Tabellen berechnen möchten, die zu Ihren zusammengeführten Daten beitragen. Im nächsten Abschnitt wird beschrieben, wie Maßnahmen dieses Problem lösen.
Graph mit Messungen abfragen
Sie können eine Grafik mit Messwerten mit GQL abfragen, aber in Ihrer Abfrage darf nicht direkt auf ein Attribut verwiesen werden, das durch einen Messwert definiert wird. In der folgenden Abfrage wird beispielsweise auf Knoten verwiesen, für die Messwert-Properties definiert sind, aber es werden keine Messwertfelder verwendet oder zurückgegeben:
GRAPH university.SchoolGraph
MATCH (c:College)-[]-(d:Department)-[]->(course:Course)
RETURN c.college_name, d.dept_name, course.course_name;
/*------------------------+------------------------+-----------------+
| college_name | dept_name | course_name |
+------------------------+------------------------+-----------------+
| College of Engineering | Computer Science | Intro to CS |
| College of Engineering | Computer Science | Data Structures |
| College of Engineering | Mechanical Engineering | Thermodynamics |
| College of Arts | Fine Arts | Oil Painting |
+------------------------+------------------------+-----------------*/
Mit Messungen arbeiten
Wenn Sie mit Messwerten arbeiten möchten, verwenden Sie die Tabellenwertfunktion GRAPH_EXPAND (Table-valued function, TVF), um Ihren Graphen als einzelne vereinfachte Tabelle abzufragen.
Die Spalten in der Ausgabetabelle werden aus den Attributen abgeleitet, die im Diagramm für jede Knoten- und Kantentabelle definiert sind. Um Namenskonflikte zu vermeiden, werden Spalten benannt, indem das Knoten- oder Tabellenlabel und der Attributname verkettet werden, z. B. Course_course_name oder Department_total_budget. Die folgende Abfrage zeigt einige Beispielausgaben der GRAPH_EXPAND-TVF:
SELECT
College_college_name,
Department_dept_name,
Department_budget,
Course_course_name
FROM
GRAPH_EXPAND("university.SchoolGraph");
/*------------------------+------------------------+-------------------+--------------------+
| College_college_name | Department_dept_name | Department_budget | Course_course_name |
+------------------------+------------------------+-------------------+--------------------+
| College of Engineering | Computer Science | 500000.0 | Intro to CS |
| College of Engineering | Computer Science | 500000.0 | Data Structures |
| College of Engineering | Mechanical Engineering | 400000.0 | Thermodynamics |
| College of Arts | Fine Arts | 200000.0 | Oil Painting |
+------------------------+------------------------+-------------------+--------------------+
Die Funktion GRAPH_EXPAND erstellt die zusammengeführte Tabelle, indem sie eine Reihe von LEFT JOIN-Vorgängen auf Knoten- und Kantentabellen anwendet. Ein gültiges Eingabediagramm muss genau eine Stammknotentabelle haben. Das ist eine Tabelle, deren KEY-Wert in keiner anderen Tabelle vorkommt. Daten, die nicht über eine Reihe von Joins von der Tabelle des Stammknotens aus erreichbar sind, werden nicht in der Ausgabe angezeigt. Im vorherigen Beispiel ist die Tabelle Course der Stammknoten. Die Abteilung Research wird in der Ausgabe nicht berücksichtigt, da sie keine Kurse hat.
Sie können nicht direkt eine Spalte für eine Property auswählen, die durch einen Messwert definiert wird.
Stattdessen müssen Sie sie in die AGG()-Funktion einfügen.
Diese Funktion sorgt dafür, dass die für die Messwerte definierte Aggregation genau einmal pro Schlüssel ausgeführt wird.
Mit der folgenden Abfrage werden gleichzeitig das Gesamtbudget und die Gesamtzahl der Kurse für jedes College berechnet:
SELECT
College_college_name,
AGG(Department_total_budget) AS college_budget,
AGG(Course_course_count) AS total_courses
FROM
GRAPH_EXPAND("university.SchoolGraph")
GROUP BY
College_college_name;
/*------------------------+----------------+---------------+
| College_college_name | college_budget | total_courses |
+------------------------+----------------+---------------+
| College of Engineering | 900000.0 | 3 |
| College of Arts | 200000.0 | 1 |
+------------------------+----------------+---------------*/
Best Practices
Beachten Sie beim Erstellen eines Diagramms mit Messwerten die folgenden Best Practices:
Knoten und Kanten in einer einzelnen Tabelle definieren
Wir empfehlen, für eine Knotentabellendefinition und die zugehörigen Kantentabellendefinitionen dieselbe Tabelle zu verwenden. Durch die Wiederverwendung der Tabelle wird eine genaue 1:1-Beziehung zwischen der Knotentabelle und der Kantentabelle sichergestellt. Dadurch wird ein Fan-out verhindert und die GRAPH_EXPAND-Funktion ignoriert die Kante nicht als mehrdeutig.
Wenn Sie beispielsweise eine Eingabetabelle Enrollment haben, die Fremdschlüssel enthält, die auf die Tabellen Student und Course verweisen, definieren Sie den Knoten Enrollment und seine ausgehenden Kanten mit der Eingabetabelle Enrollment.
N-zu-N-Beziehungen als Knotentabellen modellieren
Eine M:N-Beziehung liegt vor, wenn eine Zeile in Tabelle A mehreren Zeilen in Tabelle B entsprechen kann und eine Zeile in Tabelle B mehreren Zeilen in Tabelle A entsprechen kann. So kann sich ein Schüler/Student beispielsweise für mehrere Kurse anmelden und ein Kurs kann viele Schüler/Studenten haben. Sie können eine m:n-Beziehung in zwei 1:n-Beziehungen aufteilen, indem Sie eine Zwischenverknüpfungstabelle verwenden. Sie können beispielsweise eine Enrollment-Tabelle definieren, die Fremdschlüssel enthält, die auf die Tabellen Student und Course verweisen. Wenn Sie eine Zwischenverknüpfungstabelle als Kantentabelle modellieren, die zwei Dimensionsknotentabellen in Ihrer CREATE PROPERTY GRAPH-Anweisung verbindet, werden diese Kanten von der GRAPH_EXPAND-Funktion ignoriert, da ihre Beziehung mehrdeutig ist: nicht eindeutig 1:n oder 1:1.
CREATE PROPERTY GRAPH university.SchoolGraph
NODE TABLES (
university.Student,
university.Course
)
EDGE TABLES (
-- Modeling the junction table as a standalone edge causes ambiguity
university.Enrollment AS StudentEnrollment
SOURCE KEY (student_id) REFERENCES Student (student_id)
DESTINATION KEY (course_id) REFERENCES Course (course_id)
);
Die Funktion GRAPH_EXPAND ignoriert diese Kanten, da sie mehrdeutig sind (nicht eindeutig n:1 oder 1:1 zwischen den Knotentabellen selbst). Wenn alle Kanten in einem Diagramm ignoriert werden, schlagen Aufrufe von GRAPH_EXPAND oder BQ.SHOW_GRAPH_EXPAND_SCHEMA mit einem Fehler fehl.
Um eine M:N-Beziehung für Messwerte richtig zu modellieren, stufen Sie die Zwischenverknüpfungstabelle zu einer Knotentabelle hoch. In dieser Struktur dient die Knotenverbindungstabelle als einzelne Stammknotentabelle (eine Knotentabelle mit einem Eingangsgrad von null). Definieren Sie dann zwei N:1-Edge-Tabellen, die die Junction-Tabelle gemeinsam nutzen, um N:1 mit jeder der Dimensionsknotentabellen zu verbinden:
CREATE PROPERTY GRAPH university.SchoolGraph
NODE TABLES (
university.Student KEY (student_id),
university.Course KEY (course_id),
-- Promote the junction table to a node table (acting as the single root node)
university.Enrollment KEY (enrollment_id)
)
EDGE TABLES (
-- Share (reuse) the Enrollment table to define N:1 edges to each dimension
university.Enrollment AS EnrollmentToStudent
SOURCE KEY (enrollment_id) REFERENCES Enrollment (enrollment_id)
DESTINATION KEY (student_id) REFERENCES Student (student_id),
university.Enrollment AS EnrollmentToCourse
SOURCE KEY (enrollment_id) REFERENCES Enrollment (enrollment_id)
DESTINATION KEY (course_id) REFERENCES Course (course_id)
);
In dieser Struktur dient Enrollment als einzelne Stammknotentabelle (Eingangsgrad 0), die N:1 mit den Dimensionstabellen Student und Course (Eingangsgrad 1) verbindet. Mit der Funktion GRAPH_EXPAND kann dieses Diagramm vereinfacht werden, indem von Enrollment nach Student und Course durchlaufen wird. Wenn Sie Messwerte für eine dieser Tabellen definieren, können Sie die Funktion AGG für die Messwertspalten aufrufen, um die Aggregationen korrekt zu berechnen, ohne dass Werte doppelt gezählt werden.
GRAPH_EXPAND-Schema ansehen
Wenn Sie das Schema der Tabelle, die von der Funktion GRAPH_EXPAND zurückgegeben wird, ansehen möchten, ohne die Funktion aufzurufen, verwenden Sie die Systemprozedur BQ.SHOW_GRAPH_EXPAND_SCHEMA:
DECLARE schema STRING DEFAULT '';
CALL BQ.SHOW_GRAPH_EXPAND_SCHEMA('university.SchoolGraph', schema);
SELECT schema;
Bei diesem Verfahren wird die Variable schema mit dem Namen, Typ und Modus jeder Spalte gefüllt. Außerdem wird angegeben, ob es sich bei dem Attribut, auf das in der Spalte verwiesen wird, um eine Messung handelt. Außerdem werden alle Beschreibungen oder Synonyme aufgeführt, die Sie dafür definiert haben.
Nächste Schritte
- Informationen zum Erstellen und Abfragen eines Property-Graphen
- Weitere Informationen zu Grafschemas