Mit Messungen arbeiten
In diesem Dokument wird beschrieben, wie Sie Messwerte in Ihren Diagrammen definieren und abfragen. Mit Measures 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 wird, 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 als Eingabe zulässig sind, finden Sie unter Eingabebeschränkungen.
Sie können die Funktion AGG für die Ausgabe der GRAPH_EXPAND-TVF 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 Keyword MEASURE() 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, was dept_id entspricht.
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 einen Graphen 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 Graph als einzelne vereinfachte Tabelle abzufragen.
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 Kantentabellenlabel 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 vereinfachte Tabelle, indem sie eine Reihe von LEFT JOIN-Vorgängen auf Knoten- und Kantentabellen anwendet. Ein gültiger Eingabegraph 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 die Tabelle des Stammknotens. Die Abteilung Research wird in der Ausgabe nicht berücksichtigt, da sie keine Kurse hat.
Sie können keine Spalte direkt 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 |
+------------------------+----------------+---------------*/
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 Diagrammschemas