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:

  • SUM
  • AVG
  • COUNT
  • COUNT(DISTINCT)
  • MIN
  • MAX

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)
  );

Visualisasi grafik SchoolGraph.

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