측정항목으로 작업하기
이 문서에서는 그래프에서 측정항목을 정의하고 쿼리하는 방법을 보여줍니다. 측정항목을 사용하면 조인 전반에서 집계가 올바르게 실행되도록 할 수 있습니다.
개요
측정항목 은 노드 또는 에지 테이블의 PROPERTIES 절 내에서 정의된 집계 속성입니다. 측정항목은 MEASURE 키워드와 다음 지원되는 집계 함수 중 하나를 사용하여 정의됩니다.
SUMAVGCOUNTCOUNT(DISTINCT)MINMAX
측정항목은 정의된 노드 또는 에지 테이블의 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);
다음 문은 Department 및 Course 노드의 일부 속성에 측정항목을 정의하는 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)
);

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 변수를 채웁니다. 또한 열에서 참조하는 속성이 측정항목인지 여부를 나타내고 정의한 설명 또는 동의어 목록을 표시합니다.
다음 단계
- 속성 그래프를 만들고 쿼리하는 방법을 알아보세요.
- 그래프 스키마에 대해 알아보세요.