Bekerja dengan ukuran
Dokumen ini menunjukkan cara menentukan dan membuat kueri metrik pada grafik Anda. Anda dapat menggunakan ukuran untuk memastikan bahwa penggabungan dilakukan dengan benar di seluruh gabungan.
Ringkasan
Ukuran adalah properti gabungan yang ditentukan dalam klausa PROPERTIES
dari tabel node atau edge. Ukuran ditentukan menggunakan kata kunci MEASURE dan
salah satu fungsi agregat yang didukung berikut:
SUMAVGCOUNTCOUNT(DISTINCT)MINMAX
Ukuran menentukan agregasinya dalam referensi ke KEY tabel node atau
edge tempat ukuran tersebut ditentukan. Artinya, saat Anda membuat kueri ukuran, agregasi dilakukan dengan benar meskipun tabel pokok digabungkan dengan cara yang menyebabkan baris diduplikasi.
Anda tidak dapat mereferensikan properti yang ditentukan oleh ukuran dalam kueri GQL. Sebagai gantinya,
Anda mengakses ukuran dengan memanggil
TVF GRAPH_EXPAND
untuk membuat representasi tabel datar dari grafik Anda. Fungsi ini tidak
menerima semua jenis grafik. Untuk mengetahui informasi selengkapnya tentang
grafik mana yang membentuk input yang valid, lihat batasan input.
Anda dapat memanggil
fungsi AGG
pada output dari TVF GRAPH_EXPAND untuk menggabungkan
properti sesuai dengan fungsi agregasi yang Anda tentukan dalam
pengukuran.
Menentukan ukuran
Anda menentukan ukuran dalam
klausa PROPERTIES
dari definisi tabel node atau edge dengan menggunakan kata kunci MEASURE() di sekitar
fungsi agregat yang didukung.
Contoh berikut membuat set data bernama university dan tabel
untuk perguruan tinggi, departemen, dan kursus:
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);
Pernyataan berikut membuat grafik bernama SchoolGraph yang menentukan
pengukuran pada beberapa properti di node Department dan Course.
Anda harus memberikan alias untuk properti yang ditentukan oleh ukuran.
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)
);

Pengukuran total_budget ditentukan sebagai MEASURE(SUM(budget)). Pengukuran
mengunci agregasi ke KEY, yaitu dept_id.
Memahami penghitungan berlebih
Saat Anda menggabungkan tabel, data akan diulang setiap kali ada hubungan satu-ke-banyak dalam data Anda. Misalnya, jika Anda menggabungkan tabel Course, Department, dan College, departemen dengan beberapa kursus akan muncul di beberapa baris dalam output:
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 |
+------------------------+------------------------+-----------------+----------*/
Jika Anda mencoba menghitung total anggaran per perguruan tinggi menggunakan SUM(budget),
anggaran departemen Ilmu Komputer dihitung dua kali. Anda dapat menghindari masalah ini dengan membuat kueri tabel Department secara langsung, tetapi pendekatan ini tidak berfungsi jika Anda ingin menghitung beberapa agregasi dari tabel berbeda yang berkontribusi pada data gabungan Anda. Bagian berikut menunjukkan cara pengukuran menyelesaikan masalah ini.
Mengkueri grafik dengan ukuran
Anda dapat membuat kueri grafik dengan ukuran menggunakan GQL, tetapi kueri Anda tidak dapat mereferensikan secara langsung properti apa pun yang ditentukan oleh ukuran. Misalnya, kueri berikut mereferensikan node yang memiliki properti pengukuran yang ditentukan, tetapi tidak menggunakan atau menampilkan kolom pengukuran apa pun:
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 |
+------------------------+------------------------+-----------------*/
Bekerja dengan ukuran
Untuk menggunakan ukuran, Anda menggunakan
GRAPH_EXPAND
fungsi bernilai tabel (TVF)
untuk mengkueri grafik sebagai satu tabel yang diratakan.
Kolom dalam tabel output berasal dari properti yang ditentukan dalam
grafik untuk setiap tabel node dan edge. Untuk mencegah konflik penamaan, kolom diberi nama dengan menggabungkan label tabel node atau edge dan nama properti—misalnya, Course_course_name atau Department_total_budget. Kueri berikut menunjukkan beberapa contoh output dari TVF GRAPH_EXPAND:
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 |
+------------------------+------------------------+-------------------+--------------------+
Fungsi GRAPH_EXPAND menghasilkan tabel yang diratakan dengan menerapkan serangkaian
operasi LEFT JOIN ke tabel node dan edge. Grafik input yang valid harus
memiliki tepat satu tabel node akar, yaitu tabel yang nilai KEY-nya tidak
muncul di tabel lain. Data yang tidak dapat dijangkau dari tabel node root melalui serangkaian gabungan tidak akan muncul dalam output. Pada contoh
sebelumnya, tabel Course adalah tabel node root. Departemen Research
dihapus dari output karena tidak memiliki kursus apa pun.
Anda tidak dapat langsung memilih kolom untuk properti yang ditentukan oleh ukuran.
Sebagai gantinya, Anda harus membungkusnya dalam
fungsi AGG().
Fungsi ini memastikan bahwa agregasi yang ditentukan pada ukuran dilakukan
tepat satu kali per kunci.
Kueri berikut secara bersamaan menghitung total anggaran dan total jumlah kursus untuk setiap perguruan tinggi:
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 |
+------------------------+----------------+---------------*/
Lihat skema GRAPH_EXPAND
Untuk melihat skema tabel yang ditampilkan oleh fungsi GRAPH_EXPAND tanpa memanggil fungsi, gunakan prosedur sistem BQ.SHOW_GRAPH_EXPAND_SCHEMA:
DECLARE schema STRING DEFAULT '';
CALL BQ.SHOW_GRAPH_EXPAND_SCHEMA('university.SchoolGraph', schema);
SELECT schema;
Prosedur ini mengisi variabel schema dengan nama, jenis, dan mode
setiap kolom. Kolom ini juga menunjukkan apakah properti yang dirujuk oleh kolom
adalah ukuran, dan mencantumkan deskripsi atau sinonim yang Anda tentukan di dalamnya.
Langkah berikutnya
- Pelajari cara membuat dan mengkueri grafik properti.
- Pelajari skema grafik.