측정항목으로 작업하기

이 문서에서는 그래프에서 측정항목을 정의하고 쿼리하는 방법을 보여줍니다. 측정항목을 사용하면 조인 전반에서 집계가 올바르게 실행되도록 할 수 있습니다.

개요

측정항목 은 노드 또는 에지 테이블의 PROPERTIES 절 내에서 정의된 집계 속성입니다. 측정항목은 MEASURE 키워드와 다음 지원되는 집계 함수 중 하나를 사용하여 정의됩니다.

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

측정항목은 정의된 노드 또는 에지 테이블의 KEY를 참조하여 집계를 정의합니다. 즉, 측정항목을 쿼리할 때 기본 테이블이 행을 중복시키는 방식으로 조인되더라도 집계가 올바르게 실행됩니다.

GQL 쿼리에서 측정항목으로 정의된 속성을 참조할 수 없습니다. 대신 그래프의 평면화된 테이블 표현을 만들기 위해 GRAPH_EXPAND TVF 를 호출하여 측정항목에 액세스합니다. 이 함수는 모든 유형의 그래프를 허용하지 않습니다. 유효한 입력을 구성하는 그래프에 대한 자세한 내용은 입력 제한사항을 참조하세요.

AGG 함수GRAPH_EXPAND TVF의 출력에서 호출하여 측정항목에서 정의한 집계 함수에 따라 속성을 집계할 수 있습니다.

측정항목 정의

지원되는 집계 함수 주위에 MEASURE() 키워드를 사용하여 노드 또는 에지 테이블 정의의 PROPERTIES 내에서 측정항목을 정의합니다.

다음 예시에서는 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);

다음 문은 DepartmentCourse 노드의 일부 속성에 측정항목을 정의하는 SchoolGraph라는 그래프를 만듭니다. 측정항목으로 정의된 속성의 별칭을 제공해야 합니다.

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)로 잠급니다.

과도한 집계 이해

테이블을 조인하면 데이터에 일대다 관계가 있을 때마다 데이터가 반복됩니다. 예를 들어 Course, Department, College 테이블을 조인하면 과정이 여러 개인 학과가 출력의 여러 행에 표시됩니다.

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_name 또는 Department_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 변수를 채웁니다. 또한 열에서 참조하는 속성이 측정항목인지 여부를 나타내고 정의한 설명 또는 동의어 목록을 표시합니다.

다음 단계