스키마 개요

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

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

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

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

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

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

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

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

  • Person: 금융 거래에 참여하는 개인을 나타냅니다.
  • Account: 거래에 사용되는 은행 계좌를 나타냅니다.

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

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

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

금융 그래프의 노드, 에지, 라벨, 속성

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

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

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

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

    • amount(FLOAT64)

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

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

스키마 설계

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 테이블 열의 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 노드입니다.
  • 에지의 대상 노드는 id 속성이 에지 account_id 속성과 동일한 Account 노드입니다.
  • 요소 키가 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)
      DEFAULT LABEL OPTIONS(description = 'A checking or savings account')
      PROPERTIES (id, create_time)
      LABEL Entity
      PROPERTIES (
        id,
        nick_name AS name OPTIONS(description = 'A user-defined account name',
                                  synonyms = ['friendly name', 'display name'])
      )
  );
  • Person 노드는 Customer 라벨을 사용하여 address 속성을 노출합니다. address 속성은 입력 테이블 Personcitycountry 열을 참조하는 CONCAT(city, ", ", country), 표현식으로 정의됩니다.

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

PersonAccount 노드에는 모두 idname 속성이 있는 Entity 라벨이 있습니다.

  • Person 노드에서 idname 속성은 입력 테이블 열에서 가져옵니다.
  • Account 노드에서 name 속성은 입력 테이블의 nick_name 열을 참조합니다.
  • Account 노드에서 name 속성은 OPTIONS 절을 사용하여 속성에 대한 설명과 동의어 목록을 제공합니다. 이러한 필드는 컨텍스트를 제공하고 자연어 쿼리 인터페이스의 검색 가능성을 개선합니다. 그래프 쿼리에서 이러한 필드에 직접 액세스할 수 없으며 쿼리 결과는 어떤 방식으로도 변경되지 않습니다.

라벨 및 속성 일관성

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

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

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

스키마 종속 항목 관리

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

스키마 변경으로 인해 호환성이 깨지지 않도록 해야 합니다. 다음 권장사항을 따르세요.

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

그래프 스키마 보기

기존 그래프를 구성하는 데 사용된 CREATE PROPERTY GRAPH 문을 확인하려면 INFORMATION_SCHEMA.PROPERTY_GRAPHS를 쿼리합니다.

SELECT
  property_graph_name,
  ddl
FROM
  `region-REGION`.INFORMATION_SCHEMA.PROPERTY_GRAPHS;

REGION을 그래프가 포함된 데이터 세트의 리전으로 바꿉니다.

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

그래프 스키마 업데이트

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

그래프 스키마 삭제

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

권장사항

다음 섹션에서는 그래프 쿼리 성능을 개선하기 위해 그래프 스키마를 정의하는 권장사항을 설명합니다.

속성 정의 범위 지정

속성은 노드 또는 에지에 연결된 추가 정보를 제공하는 키-값 쌍입니다. 노드나 에지에 필요한 속성만 포함하고 노드 또는 에지 테이블의 모든 열을 속성 목록에 연결하는 PROPERTIES ALL COLUMNS 구문이나 기본 구문은 사용하지 않는 것이 좋습니다. 노드나 에지에 속성이 많으면 그래프 쿼리에서 불필요한 열 스캔이 발생하여 성능이 저하될 수 있습니다.

노드 또는 에지 정의에 포함할 속성을 제한하려면 CREATE PROPERTY GRAPH에서 요소 속성을 정의할 때 PROPERTIES 키워드를 사용합니다.

다음 노드 테이블 정의는 Person 노드 테이블의 속성을 idname로 제한합니다.

NODE TABLES (
  graph_db.Person PROPERTIES (id, name)
)

그래프 노드 및 에지에 기본 키 및 외래 키 제약 조건 정의

BigQuery는 노드 및 에지 테이블의 기본 키 및 외래 키 제약 조건을 사용하여 불필요한 테이블 스캔을 줄여 그래프 쿼리를 최적화할 수 있습니다. 하지만 BigQuery는 테이블에 기본 키 또는 외래 키 제약 조건을 적용하지 않습니다. 애플리케이션에서 참조 무결성 또는 기본 키의 고유성을 보장할 수 없는 경우 쿼리 최적화에 기본 키 또는 외래 키를 사용하면 잘못된 쿼리 결과가 발생할 수 있습니다.

다음 예에서는 노드 테이블 PersonAccount과 에지 테이블 PersonOwnAccount에 기본 키 및 외래 키 제약 조건을 정의합니다.

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

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

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

다음 단계