스키마 개요

이 문서에서는 속성 그래프 스키마의 구성요소를 설명하고 그래프 스키마를 만들고 관리하는 방법을 보여줍니다.

그래프를 사용하면 정보를 노드와 에지의 네트워크로 나타내는 연결된 데이터를 모델링할 수 있습니다. 그래프 스키마는 노드와 에지, 유형을 분류하는 라벨, 이를 설명하는 속성으로 구성됩니다. 입력 테이블의 행을 그래프 노드와 에지에 매핑하고 커스텀 라벨과 속성을 정의하여 속성 그래프 스키마를 정의합니다. BigQuery Graph에 대한 자세한 내용은 BigQuery Graph 개요를 참고하세요.

속성 그래프 데이터 모델 이해

속성 그래프를 사용하면 연결된 데이터를 노드와 에지의 네트워크로 모델링할 수 있습니다. 노드는 고객, 제품, 위치와 같은 데이터의 항목을 나타냅니다. 에지는 구매, 팔로우, 위치와 같은 관계를 캡처하여 이러한 노드 간의 연결을 나타냅니다.

노드와 에지에는 다음 정보가 포함될 수 있습니다.

  • 라벨: 노드 및 에지 유형을 분류합니다. 예를 들어 수업의 학생은 Student 라벨과 Person 라벨을 가질 수 있습니다. 노드 또는 에지의 라벨을 명시적으로 정의하지 않으면 BigQuery Graph는 입력 테이블 이름을 기본 라벨로 사용합니다.

  • 속성: 노드와 에지를 설명하는 데 사용됩니다. 예를 들어 사람을 나타내는 노드에는 값이 Alexname 속성과 값이 1id 속성이 있을 수 있습니다.

그림 1의 예시에서는 금융 활동을 모델링하기 위한 그래프 설계 방식을 보여줍니다. 이 그래프에는 노드로 모델링되는 다음 유형의 항목이 포함됩니다.

  • Person: 금융 거래에 관련된 개인을 나타냅니다.
  • 계정: 거래에 사용되는 은행 계좌를 나타냅니다.

이러한 항목은 다음과 같은 유형의 방향성 에지로 표시되는 다양한 관계로 연결됩니다.

  • 소유: 한 사람이 하나 이상의 계좌를 소유합니다.
  • Transfers: 한 계좌에서 다른 계좌로 돈이 이동합니다.

각 방향성 에지는 소스 노드에서 대상 노드로 이어지는 단방향 관계를 나타냅니다. 예를 들어 Transfers 에지는 소스 Account와 대상 Account를 연결하여 자금의 흐름을 나타냅니다.

금융 그래프의 노드, 에지, 라벨, 속성입니다.

그림 1. 여러 노드와 방향 에지가 포함된 그래프 예시.

노드와 에지에는 속성에 추가 정보가 포함됩니다.

  • Person 노드에는 다음 속성이 포함됩니다.

    • name (STRING)
    • id (INT64)
  • Transfers 에지에는 다음 속성이 포함됩니다.

    • amount (FLOAT64)

방향성 에지와 비방향성 에지

방향성 에지는 항목 간의 관계에서 특정 방향을 나타냅니다. 예를 들어 사람은 계좌를 소유하지만 계좌는 사람을 소유하지 않습니다. 하지만 소셜 네트워크의 친구 관계와 같은 일부 관계는 비방향성 이며 상호 연결을 나타냅니다. 이 경우, 방향이 없는 에지를 양방향(각 방향 하나씩)의 두 개의 방향성 에지로 모델링할 수 있습니다.

스키마 설계

BigQuery Graph를 사용하면 CREATE PROPERTY GRAPH 문을 사용하여 테이블에서 그래프를 만들 수 있습니다. 그래프를 만드는 테이블을 입력 테이블 이라고 합니다.

노드 정의

노드는 테이블의 행으로 정의됩니다. 노드를 정의하려면 NODE TABLES에 노드 정의를 추가합니다. 가장 간단한 노드 정의 형태에는 기본 키가 있는 입력 테이블의 이름이 포함됩니다. BigQuery Graph는 입력 테이블의 행을 그래프 노드에 매핑합니다.

다음 예시에서는 NODE TABLES 절을 사용하여 FinGraph 속성 그래프에서 Account 노드를 정의합니다. 이 노드 정의에는 입력 테이블 Account가 포함됩니다.

-- Create an Account table.
CREATE TABLE graph_db.Account (
  id           INT64 NOT NULL,
  create_time  TIMESTAMP,
  PRIMARY KEY (id) NOT ENFORCED
);

-- Use the Account table as the input table for the Account node definition.
CREATE PROPERTY GRAPH graph_db.FinGraph
  NODE TABLES (
    graph_db.Account
  );

기본적으로 BigQuery는 테이블 이름을 라벨로 사용하고 입력 테이블의 모든 열을 속성으로 노출합니다.

  • 각 Account 노드는 Account 라벨을 사용합니다.
  • 각 Account 노드에는 Account 테이블 열의 idcreate_time 속성이 포함됩니다.

요소 키

노드 정의는 또한 그래프 노드를 고유하게 식별하는 열 모음인 요소 키를 정의합니다. 기본적으로 요소 키는 입력 테이블의 기본 키입니다. 또는 KEY 절을 사용하여 요소 키를 명시적으로 정의할 수 있습니다.

다음 예시에서는 Account 노드와 Person 노드를 정의합니다. Account 노드는 Account 테이블의 기본 키를 요소 키로 사용합니다. Person 노드는 KEY 절을 사용하여 id 열을 요소 키로 명시적으로 지정합니다.

CREATE TABLE graph_db.Person (
  id           INT64 NOT NULL,
  name         STRING
);

CREATE TABLE graph_db.Account (
  id           INT64 NOT NULL,
  create_time  TIMESTAMP,
  PRIMARY KEY (id) NOT ENFORCED
);

CREATE PROPERTY GRAPH graph_db.FinGraph
  NODE TABLES (
    graph_db.Person KEY (id),
    graph_db.Account
  );
  • 요소 키가 null이 아닌 각 행은 요소 키를 기준으로 그래프 내의 고유한 노드에 매핑됩니다.
  • 요소 키가 null인 행은 무시됩니다.

동일한 입력 테이블을 여러 노드 정의에서 사용할 수 있습니다. 이 경우 입력 테이블의 지정된 행은 각 노드 정의에 대해 하나의 노드에 매핑됩니다.

에지 정의

에지는 테이블의 행으로 정의됩니다. 에지를 정의하려면 EDGE TABLES에 에지 정의를 추가합니다. 가장 간단한 에지 정의 형태에는 입력 테이블의 이름이 포함되며 소스 및 대상 노드 참조를 정의합니다. BigQuery Graph는 이 정의를 사용하여 입력 테이블의 행을 그래프 에지에 매핑합니다.

기본적으로 BigQuery는 테이블 이름을 라벨로 사용하고 입력 테이블의 모든 열을 속성으로 노출합니다.

소스 및 대상 노드 참조

에지 정의는 SOURCE KEY, DESTINATION KEY, REFERENCES 절을 사용해서 소스 및 대상 노드 참조를 정의합니다. 에지 정의에서 소스 및 대상 노드를 사용하기 전에 정의해야 합니다.

다음 예시에서는 다음을 사용하여 속성 그래프 FinGraph를 만듭니다.

  • PersonAccount 노드
  • PersonOwnAccount 에지
CREATE TABLE graph_db.Person (
  id            INT64 NOT NULL,
  name          STRING,
  PRIMARY KEY (id) NOT ENFORCED
);

CREATE TABLE graph_db.Account (
  id            INT64 NOT NULL,
  create_time   TIMESTAMP,
  PRIMARY KEY (id) NOT ENFORCED
);

CREATE TABLE graph_db.PersonOwnAccount (
  id            INT64 NOT NULL,
  account_id    INT64 NOT NULL,
  create_time   TIMESTAMP,
  FOREIGN KEY (account_id) REFERENCES graph_db.Account (id) NOT ENFORCED,
  PRIMARY KEY (id, account_id) NOT ENFORCED
);

CREATE PROPERTY GRAPH graph_db.FinGraph
  NODE TABLES (
    graph_db.Person,
    graph_db.Account
  )
  EDGE TABLES (
    PersonOwnAccount
      SOURCE KEY (id) REFERENCES Person (id)
      DESTINATION KEY (account_id) REFERENCES Account (id)
  );

PersonOwnAccount 에지는 Person (소스) 노드를 Account (대상) 노드에 연결합니다.

  • 에지의 소스 노드는 id 속성이 에지 id 속성과 동일한 Person 노드입니다.
  • 에지의 대상 노드는 Account 노드이며, 여기서 id 속성은 에지 account_id 속성과 동일합니다.
  • 요소 키가 PersonOwnAccount 테이블의 기본 키입니다(즉, (id, account_id)).
  • 각 에지에 PersonOwnAccount 테이블의 열과 동일한 속성 집합이 포함됩니다.
  • 각 에지에 기본 PersonOwnAccount 라벨이 포함됩니다.

행을 에지에 매핑

요소 키가 null이 아닌 에지 입력 테이블의 각 행은 일반적으로 그래프에서 단일 에지에 매핑됩니다. 하지만 소스 또는 대상 노드 참조가 소스 또는 대상 노드 테이블의 0개 이상의 노드와 일치하는 경우 에지 입력 테이블의 행으로 인해 그래프에 0개 이상의 에지가 발생할 수 있습니다.

단일 테이블 내에서 노드와 에지 정의

테이블의 열이 다른 테이블과의 관계를 정의하는 경우 단일 테이블에서 노드와 수신 또는 발신 에지를 정의할 수 있습니다. 이 접근 방식을 사용하면 테이블 수가 줄어들고 데이터 관리가 간소화되며 별도의 에지 테이블에 조인할 필요가 없어 쿼리 성능이 개선될 수 있습니다.

예를 들어 다음 Account 테이블에 복합 기본 키 (owner_id, account_id)가 있는 경우 owner_id 열은 Person 테이블을 참조하는 외래 키일 수 있습니다. 이 구조를 사용하면 Account 테이블이 Account 노드와 Person 노드에서 수신되는 에지를 모두 나타낼 수 있습니다.

CREATE TABLE graph_db.Person (
  id INT64 NOT NULL,
  PRIMARY KEY (id) NOT ENFORCED
);

-- Assume each account has exactly one owner.
CREATE TABLE graph_db.Account (
  owner_id INT64 NOT NULL,
  account_id INT64 NOT NULL,
  FOREIGN KEY (owner_id) REFERENCES graph_db.Person(id) NOT ENFORCED,
  PRIMARY KEY (owner_id, account_id) NOT ENFORCED
);

Account 테이블을 사용하여 Account 노드와 수신 Owns 에지를 모두 정의할 수 있습니다. 다음 CREATE PROPERTY GRAPH 문에서 이를 확인할 수 있습니다. EDGE TABLES 절에서 Account 테이블에 Owns라는 별칭을 지정합니다. 그래프 스키마의 각 요소에는 고유한 이름이 있어야 하기 때문입니다.

CREATE PROPERTY GRAPH graph_db.FinGraph
  NODE TABLES (
    graph_db.Person,
    graph_db.Account
  )
  EDGE TABLES (
    graph_db.Account AS Owns
      SOURCE KEY (owner_id) REFERENCES Person
      DESTINATION KEY (owner_id, account_id) REFERENCES Account
  );

라벨 및 속성 맞춤설정

LABELPROPERTIES 절을 사용해서 라벨 및 속성을 맞춤설정할 수 있습니다.

다음 예시에서는 커스텀 속성이 있는 Person 노드와 여러 라벨이 있는 Account 노드를 정의합니다.

CREATE TABLE graph_db.Person (
  id               INT64 NOT NULL,
  name             STRING,
  birthday         TIMESTAMP,
  country          STRING,
  city             STRING,
  PRIMARY KEY (id) NOT ENFORCED
);

CREATE TABLE graph_db.Account (
  id               INT64 NOT NULL,
  create_time      TIMESTAMP,
  is_blocked       BOOL,
  nick_name        STRING,
  PRIMARY KEY (id) NOT ENFORCED
);

CREATE PROPERTY GRAPH graph_db.FinGraph
  NODE TABLES (
    graph_db.Person KEY (id)
      LABEL Customer
      PROPERTIES (CONCAT(city, ", ", country) AS address)
      LABEL Entity PROPERTIES (id, name),
    graph_db.Account KEY (id)
      LABEL Account PROPERTIES (id, create_time)
      LABEL Entity PROPERTIES (id, nick_name AS name)
  );
  • Person 노드는 Customer 라벨을 사용하여 address 속성을 노출합니다. address 속성은 입력 테이블 Personcitycountry 열을 참조하는 CONCAT(city, ", ", country), 표현식으로 정의됩니다.

  • Account 노드는 Account 라벨을 사용하여 idcreate_time 속성을 노출합니다.

Person 노드와 Account 노드 모두 idname 속성이 있는 Entity 라벨을 포함합니다.

  • Person 노드의 idname 속성은 입력 테이블의 열에서 가져옵니다.
  • Account 노드의 name 속성은 입력 테이블의 nick_name 열 을 참조합니다.

라벨 및 속성 일관성

그래프에서 라벨과 속성은 해당 이름으로 고유하게 식별됩니다. 여러 노드 또는 에지 정의에서 동일한 이름의 라벨과 속성을 사용할 수 있습니다. 하지만 동일한 이름의 라벨과 속성은 다음 규칙을 따라야 합니다.

  • 동일한 이름의 속성은 동일한 값 유형을 사용해야 합니다.
  • 동일한 이름의 라벨은 동일한 속성 목록을 노출해야 합니다.

이전 예시에서 Entity 라벨은 Person 노드와 Account 노드 모두에서 정의됩니다. 두 정의 모두 동일한 값 유형을 가진 idname 속성 이름 집합을 포함합니다.

스키마 종속 항목 관리

그래프는 노드 및 에지 정의의 입력 테이블 스키마와 속성에서 참조되는 테이블 열에 종속됩니다. BigQuery Graph는 테이블 또는 열을 삭제하거나 변경하여 기존 그래프 스키마가 무효화되는지 확인하지 않습니다.

스키마 변경으로 인해 중단되지 않도록 하는 것은 사용자의 책임입니다. 다음 권장사항을 따르세요.

  • 그래프 노드 정의에 사용되는 테이블을 삭제하기 전에 먼저 그래프에서 해당 노드 정의를 삭제합니다.
  • 그래프에서 속성으로 노출되는 테이블에서 열을 삭제하기 전에 해당 노드 또는 에지 정의에서 속성을 삭제합니다.

그래프 스키마 보기

노트북에서 그래프 스키마를 시각화할 수 있습니다.

그래프 스키마 업데이트

기존 그래프의 스키마를 변경하려면 CREATE PROPERTY GRAPH 문을 사용하여 그래프 스키마를 재정의해야 합니다.

그래프 스키마 삭제

속성 그래프를 삭제하려면 DROP PROPERTY GRAPH 문을 사용합니다.

다음 단계