Menggunakan ukuran

Dokumen ini menunjukkan cara menentukan dan membuat kueri ukuran pada grafik Anda. Anda dapat menggunakan ukuran untuk memastikan agregasi 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 gabungan 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 yang mendasarinya 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 GRAPH_EXPAND TVF 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. Untuk menjalankan kueri GQL, Anda harus memiliki reservasi yang menggunakan edisi Enterprise atau Enterprise Plus. Jika Anda menggunakan harga sesuai permintaan, Anda dapat memanggil fungsi GRAPH_EXPAND untuk menjalankan kueri SQL pada grafik Anda.

Anda dapat memanggil fungsi AGG pada output dari GRAPH_EXPAND TVF untuk menggabungkan properti sesuai dengan fungsi agregasi yang Anda tentukan dalam ukuran.

Menentukan ukuran

Anda menentukan ukuran dalam klausa PROPERTIES dari definisi tabel node atau edge dengan menggunakan kata kunci MEASURE() di sekitar fungsi gabungan 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 ukuran 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.

Ukuran total_budget ditentukan sebagai MEASURE(SUM(budget)). Ukuran 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 akan 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 yang berbeda yang berkontribusi pada data gabungan Anda. Bagian berikut menunjukkan cara ukuran menyelesaikan masalah ini.

Membuat kueri grafik dengan ukuran

Anda dapat membuat kueri grafik dengan ukuran menggunakan GQL, tetapi kueri Anda tidak dapat langsung mereferensikan properti apa pun yang ditentukan oleh ukuran. Misalnya, kueri berikut mereferensikan node yang memiliki properti ukuran yang ditentukan, tetapi tidak menggunakan atau menampilkan kolom ukuran 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    |
 +------------------------+------------------------+-----------------*/

Menggunakan ukuran

Untuk menggunakan ukuran, Anda menggunakan GRAPH_EXPAND fungsi bernilai tabel (TVF) untuk membuat kueri grafik Anda sebagai satu tabel datar. 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 datar dengan menerapkan serangkaian operasi LEFT JOIN ke tabel node dan edge. Grafik input yang valid harus memiliki tepat satu tabel node root, yaitu tabel yang nilai KEY tidak muncul di tabel lain. Data yang tidak dapat dijangkau dari tabel node root melalui serangkaian gabungan tidak muncul dalam output. Pada contoh sebelumnya, tabel Course adalah tabel node root. Departemen Research dihilangkan dari output karena tidak memiliki kursus apa pun.

Anda tidak dapat langsung memilih kolom untuk properti yang ditentukan oleh ukuran. Sebagai gantinya, Anda harus menggabungkannya 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             |
 +------------------------+----------------+---------------*/

Praktik terbaik

Saat Anda mendesain grafik dengan ukuran, ikuti praktik terbaik berikut:

Menentukan node dan edge dalam satu tabel

Sebaiknya gunakan tabel yang sama untuk definisi tabel node dan definisi tabel edge yang terhubung. Menggunakan kembali tabel memastikan hubungan satu-ke-satu (1:1) yang tepat antara tabel node dan tabel edge, yang mencegah fan-out dan memastikan bahwa fungsi GRAPH_EXPAND tidak mengabaikan edge sebagai ambigu.

Misalnya, jika Anda memiliki tabel input Enrollment yang berisi kunci asing yang mengarah ke tabel Student dan Course, tentukan node Enrollment dan edge keluar menggunakan tabel input Enrollment.

Menghindari penentuan properti yang tidak perlu pada tabel edge

Saat Anda menentukan tabel node dan tabel edge menggunakan tabel fisik yang sama, jangan gunakan klausa PROPERTIES pada tabel edge kecuali jika ada informasi baru yang akan diambil di edge. Karena tabel node dan tabel edge menggunakan tabel fisik yang sama, semua properti ini sudah menjadi bagian dari tabel node.

Menentukan properti yang berlebihan pada tabel edge dapat menyebabkan fungsi GRAPH_EXPAND memperlakukan tabel edge sebagai entity terpisah dari tabel node bersama. Untuk mengoptimalkan performa, tentukan NO PROPERTIES pada definisi tabel edge jika tidak ada properti baru yang akan diambil di edge.

Membuat model hubungan many-to-many sebagai tabel node

Hubungan many-to-many (M:N) terjadi saat baris dalam tabel A dapat sesuai dengan beberapa baris dalam tabel B, dan baris dalam tabel B dapat sesuai dengan beberapa baris dalam tabel A. Misalnya, satu siswa dapat mendaftar ke beberapa kursus dan satu kursus dapat memiliki banyak siswa. Anda dapat memisahkan hubungan many-to-many menjadi dua hubungan satu-ke-banyak menggunakan tabel gabungan perantara. Misalnya, Anda dapat menentukan tabel Enrollment yang berisi kunci asing yang mengarah ke tabel Student dan Course. Jika Anda membuat model tabel gabungan perantara sebagai tabel edge yang menghubungkan dua tabel node dimensi dalam pernyataan CREATE PROPERTY GRAPH, fungsi GRAPH_EXPAND akan mengabaikan edge ini karena hubungannya ambigu: tidak jelas many-to-one atau one-to-one.

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

Fungsi GRAPH_EXPAND mengabaikan edge ini karena ambigu (tidak jelas many-to-one atau one-to-one antara tabel node itu sendiri). Jika semua edge dalam grafik diabaikan, panggilan ke GRAPH_EXPAND atau BQ.SHOW_GRAPH_EXPAND_SCHEMA akan gagal dengan error.

Untuk membuat model hubungan M:N dengan benar untuk ukuran, promosikan tabel gabungan perantara ke tabel node. Dalam struktur ini, tabel node gabungan berfungsi sebagai tabel node root tunggal (tabel node dengan derajat masuk nol). Kemudian, tentukan dua tabel edge many-to-one (N:1) yang berbagi tabel gabungan untuk menghubungkan N:1 ke setiap tabel node dimensi:

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

Dalam struktur ini, Enrollment berfungsi sebagai tabel node root tunggal (derajat masuk nol) yang menghubungkan N:1 ke tabel dimensi Student dan Course (derajat masuk satu). Fungsi GRAPH_EXPAND dapat meratakan grafik ini dengan melintasi ke luar dari Enrollment ke Student dan Course. Jika Anda menentukan ukuran pada salah satu tabel ini, Anda dapat memanggil fungsi AGG pada kolom ukuran untuk menghitung agregasi dengan benar tanpa penghitungan berlebih.

Melihat 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. Prosedur ini juga menunjukkan apakah properti yang direferensikan oleh kolom adalah ukuran, dan mencantumkan deskripsi atau sinonim yang Anda tentukan di dalamnya.

Langkah berikutnya