使用測量指標

本文說明如何定義及查詢圖表中的指標。您可以運用指標,確保系統在聯結時正確執行匯總作業。

總覽

指標是在節點或邊緣資料表的 PROPERTIES 子句中定義的匯總屬性。測量值是使用 MEASURE 關鍵字和下列其中一個支援的匯總函式定義:

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

指標會參照定義指標的節點或邊緣資料表,定義指標的匯總。KEY也就是說,即使基礎資料表是以導致資料列重複的方式彙整,查詢指標時仍會正確執行匯總作業。

您無法在 GQL 查詢中參照由指標定義的屬性。您必須呼叫 GRAPH_EXPAND TVF,建立圖表的扁平化資料表表示法,才能存取指標。這項函式不接受所有類型的圖表。如要進一步瞭解哪些圖表可做為有效輸入內容,請參閱輸入限制

您可以對 GRAPH_EXPAND TVF 的輸出內容呼叫 AGG 函式,根據您在指標中定義的匯總函式匯總屬性。

定義測量指標

您可以在節點或邊緣資料表定義的 PROPERTIES 子句中定義指標,方法是在支援的匯總函式周圍使用 MEASURE() 關鍵字。

以下範例會建立名為 university 的資料集,以及學院、科系和課程的資料表:

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

以下陳述式會建立名為 SchoolGraph 的圖表,定義 DepartmentCourse 節點中部分屬性的指標。您必須為指標定義的屬性提供別名。

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

SchoolGraph 圖表的視覺化呈現。

total_budget 測量指標定義為 MEASURE(SUM(budget))。這項指標會將匯總作業鎖定至 KEY,也就是 dept_id

瞭解重複計算

當您聯結資料表時,如果資料中存在一對多關係,資料就會重複。舉例來說,如果您彙整 CourseDepartmentCollege 資料表,輸出內容中就會出現多個資料列,顯示有多個課程的部門:

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 |
 +------------------------+------------------------+-----------------+----------*/

如果您嘗試使用 SUM(budget) 計算每個學院的總預算,系統會將電腦科學系的預算計算兩次。您可以直接查詢 Department 資料表來避免這個問題,但如果您想從多個資料表計算多項匯總,而這些資料表會提供聯結資料,這個方法就不適用。下一節將說明指標如何解決這個問題。

使用指標查詢圖表

您可以使用 GQL 查詢含有指標的圖形,但查詢無法直接參照指標定義的任何屬性。舉例來說,下列查詢會參照定義了指標屬性的節點,但不會使用或傳回任何指標欄位:

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    |
 +------------------------+------------------------+-----------------*/

使用指標

如要使用測量指標,請使用GRAPH_EXPAND資料表值函式 (TVF),將圖表查詢為單一扁平化資料表。輸出資料表中的資料欄衍生自圖形中為每個節點和邊緣資料表定義的屬性。為避免命名衝突,系統會將節點或邊緣資料表標籤和屬性名稱串連,做為資料欄名稱,例如 Course_course_nameDepartment_total_budget。下列查詢顯示 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       |
 +------------------------+------------------------+-------------------+--------------------+

GRAPH_EXPAND 函式會對節點和邊緣資料表套用一系列 LEFT JOIN 作業,產生扁平化資料表。有效的輸入圖表必須只有一個根節點資料表,也就是 KEY 值不會出現在任何其他資料表中的資料表。如果資料無法透過一系列彙整作業從根節點資料表存取,就不會顯示在輸出內容中。在上一個範例中,Course 資料表是根節點資料表。由於「Research」部門沒有任何課程,因此輸出結果會省略該部門。

您無法直接選取由指標定義的屬性資料欄。您必須將這些函式包裝在 AGG() 函式中。這項函式可確保系統針對每個鍵,只會執行一次在指標上定義的匯總作業。

下列查詢會同時計算每個學院的預算總額和課程總數:

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結構定義

如要查看 GRAPH_EXPAND 函式傳回的資料表結構定義,但不想呼叫函式,請使用 BQ.SHOW_GRAPH_EXPAND_SCHEMA 系統程序

DECLARE schema STRING DEFAULT '';
CALL BQ.SHOW_GRAPH_EXPAND_SCHEMA('university.SchoolGraph', schema);
SELECT schema;

這項程序會填入 schema 變數,其中包含每個資料欄的名稱、類型和模式。此外,也會指出資料欄參照的屬性是否為指標,並列出您為該屬性定義的任何說明或同義詞。

後續步驟