Spanner Graph를 사용하면 연결된 데이터를 노드와 에지의 네트워크로 정보를 나타내는 속성 그래프로 모델링할 수 있습니다. 노드는 항목을 나타내고 에지는 노드 간의 연결을 보여줍니다. 노드와 에지에는 노드와 에지를 집합으로 분류하는 라벨이 포함됩니다. 노드와 에지에는 키-값 쌍인 속성도 포함됩니다.
입력 테이블의 행을 그래프 노드 및 에지에 매핑하여 Spanner Graph 스키마를 정의합니다. 노드와 에지의 라벨과 속성을 맞춤설정하고 스키마 변경사항이 그래프 종속 항목에 미치는 영향을 파악합니다. 더 유연한 그래프 정의를 위해 스키마 없는 데이터를 관리할 수도 있습니다.
Spanner Graph에 대한 자세한 내용은 Spanner Graph 개요를 참조하세요.
속성 그래프 데이터 모델 이해
속성 그래프를 사용하면 연결된 데이터를 모델링할 수 있습니다. 속성 그래프는 정보를 노드와 에지의 네트워크로 보여줍니다. 노드는 고객, 제품 또는 위치와 같은 데이터 환경의 항목을 상징합니다. 에지는 이러한 노드 간의 연결을 보여주며 구매, 팔로우 또는 위치와 같은 관계를 캡처합니다.
노드와 에지 모두 다음 정보를 포함할 수 있습니다.
- 노드와 에지를 집합으로 분류하는 라벨(예: city)
- 키-값 쌍을 나타내는 속성(예: 인구)
그림 1의 예시에서는 금융 활동을 모델링하는 그래프를 설계하는 방법을 보여줍니다. 이 그래프에는 노드로 모델링되는 다음 유형의 항목이 포함됩니다.
- Person: 금융 활동을 수행하는 개인을 나타냅니다.
- Account: 트랜잭션에 사용된 은행 계정을 나타냅니다.
이러한 항목은 다음과 같이 방향 지정된 에지로 표시되는 여러 유형의 관계로 연결됩니다.
- Owns: 한 사람이 하나 이상의 계정을 소유합니다.
- Transfers: 한 계정에서 다른 계정으로 자금이 이동합니다.
각 방향 에지는 소스 노드에서 대상 노드로 이어지는 단방향 관계를 나타냅니다. 예를 들어 Transfers
에지는 소스 Account
를 대상 Account
에 연결하며, 자금 흐름을 나타냅니다.
그림 1. 여러 노드와 방향 에지가 포함된 그래프 예시.
노드와 에지는 속성에 추가 정보를 포함합니다. 각 속성에는 이름과 값이 포함됩니다.
- Person 노드에는 다음 속성이 포함됩니다.
name
(STRING
)id
(INT64
)
- Transfers 에지에는 다음 속성이 포함됩니다.
amount
(FLOAT64)
방향 에지와 비방향 에지
그래프 예시에서는 항목 간 관계에서 특정 방향을 나타내는 방향 에지가 사용됩니다. 하지만 소셜 네트워크의 친구 관계와 같은 일부 관계에는 방향이 없으며 이러한 관계는 고유한 출발지나 엔드포인트가 없는 상호적인 연결을 나타냅니다. 이 경우 하나의 에지가 각 방향을 나타내는 2개의 방향 에지를 사용해서 비방향 에지를 모델링할 수 있습니다.
Spanner Graph 스키마 설계
Spanner Graph를 사용하면 CREATE PROPERTY GRAPH 문을 사용하여 테이블에서 그래프를 만들 수 있습니다. 그래프를 만드는 데 사용되는 테이블을 입력 테이블이라고 합니다. 이 접근 방식은 SQL:2023 표준에 속하는 SQL/PGQ (속성 그래프 쿼리)를 사용합니다.
속성 그래프에서 노드 정의
노드를 정의하려면 NODE TABLES 절에 노드 정의를 추가합니다. 가장 간단한 노드 정의 형태에는 입력 테이블 이름만 포함됩니다. Spanner Graph는 입력 테이블의 행을 그래프 노드에 매핑합니다.
다음 예시에서는 NODE TABLES 절을 사용하여 FinGraph
속성 그래프에서 Account
노드를 정의합니다. 노드 정의에는 입력 테이블 Account
가 포함됩니다.
-- First, create an Account table.
CREATE TABLE Account (
id INT64 NOT NULL,
create_time TIMESTAMP,
) PRIMARY KEY (id);
-- Next, use the Account table as input table of Account node definition.
CREATE PROPERTY GRAPH FinGraph
NODE TABLES (
Account
);
기본 라벨 및 속성
기본적으로 모든 노드는 입력 테이블 이름을 해당 라벨로 사용하며, Spanner 그래프는 입력 테이블의 모든 열을 노드 속성으로 노출합니다.
위 예시에 대한 설명은 다음과 같습니다.
- 각 계정 노드는
Account
라벨을 사용합니다. - 각 계정 노드에는
Account
테이블 열의[id, create_time]
속성이 포함됩니다.
요소 키
노드 정의는 또한 그래프 노드를 고유하게 식별하는 요소 키를 정의합니다.
- 기본적으로 요소 키는 입력 테이블의 기본 키입니다.
KEY
절을 사용하여 요소 키를 명시적으로 정의할 수 있습니다.- 고유 색인 제약 조건이 있는 열을 요소 키로 사용할 수 있습니다.
다음 예시는 Account
노드 및 Person
노드를 정의합니다.
Account
노드는 기본적으로Account
테이블의 기본 키를 해당 요소 키로 사용합니다.- 반면에
Person
노드는KEY
절을 사용해서id
를 요소 키로 명시적으로 지정합니다.
CREATE TABLE Person (
id INT64 NOT NULL,
name STRING(MAX),
) PRIMARY KEY (id);
CREATE TABLE Account (
id INT64 NOT NULL,
create_time TIMESTAMP,
) PRIMARY KEY (id);
CREATE PROPERTY GRAPH FinGraph
NODE TABLES (
Person KEY (id),
Account
);
입력 테이블의 행을 그래프의 노드에 매핑
- null이 아닌 요소 키가 있는 각 행은 그래프에서 해당 요소 키로 식별된 고유 노드에 매핑됩니다.
- null 요소 키가 있는 행은 무시됩니다.
속성 그래프에서 에지 정의
에지를 정의하려면 에지 정의를 EDGE TABLES 절에 추가합니다. 가장 간단한 에지 정의 형태에는 입력 테이블 이름만 포함됩니다. Spanner Graph는 입력 테이블의 행을 그래프 에지에 매핑합니다.
에지의 기본 라벨과 속성은 노드와 동일한 방식으로 정의됩니다.
각 에지의 요소 키는 노드와 동일한 방법으로 정의됩니다.
소스 및 대상 노드 참조
다음 예시에서는 다음을 사용하여 속성 그래프 FinGraph
를 만듭니다.
Person
및Account
노드PersonOwnAccount
에지
CREATE TABLE Person (
id INT64 NOT NULL,
name STRING(MAX),
) PRIMARY KEY (id);
CREATE TABLE Account (
id INT64 NOT NULL,
create_time TIMESTAMP,
) PRIMARY KEY (id);
CREATE TABLE PersonOwnAccount (
id INT64 NOT NULL,
account_id INT64 NOT NULL,
create_time TIMESTAMP,
FOREIGN KEY (account_id) REFERENCES Account (id)
) PRIMARY KEY (id, account_id),
INTERLEAVE IN PARENT Person;
CREATE PROPERTY GRAPH FinGraph
NODE TABLES (
Person,
Account
)
EDGE TABLES (
PersonOwnAccount
SOURCE KEY (id) REFERENCES Person (id)
DESTINATION KEY (account_id) REFERENCES Account (id)
);
에지 정의는 SOURCE KEY
, DESTINATION KEY
, REFERENCES
절을 사용해서 소스 및 대상 노드 참조를 정의합니다. 다음 예시는 PersonOwnAccount
의 에지 정의를 사용하여 이 개념을 보여줍니다.
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
에지에는 다음이 적용됩니다.
- 요소 키는
PersonOwnAccount
테이블의 기본 키입니다(즉,(id, account_id)
). - 각 에지에
PersonOwnAccount
테이블의 열과 동일한 속성 집합이 포함됩니다. - 각 에지에 기본
PersonOwnAccount
라벨이 포함됩니다.
에지 입력 테이블의 행을 그래프의 에지에 매핑
- 요소 키가 null이 아닌 에지 입력 테이블의 각 행은 일반적으로 그래프에서 고유 에지로 매핑됩니다.
- 행은 그래프에 있는 0개 또는 그 이상의 에지에 대응할 수 있습니다. 예를 들어 소스 노드 참조로 소스 노드 테이블에 있는 0개 또는 그 이상의 노드와 일치할 경우에 이러한 결과가 발생할 수 있습니다.
- 여러 다른 노드 및 에지 정의에서 동일한 입력 테이블을 사용하여 서로 다른 노드 또는 에지 집합을 만들 수 있습니다. 자세한 내용은 노드 및 에지 입력 테이블 병합을 참고하세요.
라벨 및 속성 맞춤설정
LABEL 및 PROPERTIES 절을 사용하여 라벨과 속성을 맞춤설정할 수 있습니다.
다음 예시에서는 Person
및 Account
라는 두 개의 노드를 정의합니다.
Person
노드는Customer
라벨을 사용하여address
속성을 노출합니다.address
속성은 입력 테이블Person
에서city
및country
열을 참조하는CONCAT(city, ", ", country),
표현식으로 정의됩니다.Account
의 경우Account
노드는Account
라벨을 사용하여id
및create_time
속성을 노출합니다.Person
및Account
에는 [id, name
] 속성이 있는Entity
라벨이 포함됩니다.Person
의 경우id
및name
속성은 입력 테이블 열에서 제공됩니다.Account
의 경우name
속성은 입력 테이블의nick_name
열을 참조합니다.
CREATE TABLE Person (
id INT64 NOT NULL,
name STRING(MAX),
birthday TIMESTAMP,
country STRING(MAX),
city STRING(MAX),
) PRIMARY KEY (id);
CREATE TABLE Account (
id INT64 NOT NULL,
create_time TIMESTAMP,
is_blocked BOOL,
nick_name STRING(MAX),
) PRIMARY KEY (id);
CREATE PROPERTY GRAPH FinGraph
NODE TABLES (
Person KEY (id)
LABEL Customer
PROPERTIES (CONCAT(city, ", ", country) AS address)
LABEL Entity PROPERTIES (id, name),
Account KEY (id)
LABEL Account PROPERTIES (id, create_time)
LABEL Entity PROPERTIES (id, nick_name AS name)
);
라벨 및 속성 일관성
그래프에서 라벨과 속성은 해당 이름으로 고유하게 식별됩니다. 여러 노드 또는 에지 정의에서 동일한 이름의 라벨과 속성을 사용할 수 있습니다. 하지만 동일한 이름의 라벨과 속성은 다음 규칙을 따라야 합니다.
- 동일한 이름의 속성은 동일한 값 유형을 사용합니다.
- 동일한 이름의 라벨은 동일한 속성 목록을 노출합니다.
이전 예시에서 Entity
라벨은 Person
및 Account
노드에 모두 정의되어 있습니다. 두 정의 모두 값 유형이 동일한 속성 이름 [id
, name
] 집합을 포함합니다.
그래프와 다른 스키마 객체 사이의 종속 항목
CREATE PROPERTY GRAPH
로 만든 그래프는 노드 및 에지 정의의 입력 테이블과 속성으로 참조되는 테이블 열과 같은 다른 스키마 객체에 종속됩니다. Spanner Graph는 이러한 종속 항목 중 하나를 손상시키는 스키마 변경을 허용하지 않습니다.
다음 문은 FinGraph
이 Account
테이블과 id
, create_time
열에 종속되도록 합니다.
CREATE OR REPLACE PROPERTY GRAPH FinGraph
NODE TABLES (
Account PROPERTIES (id, create_time)
);
이 예시에서 Spanner Graph는 다음 스키마 변경을 허용하지 않습니다.
Account
테이블은 삭제할 수 없습니다. 이렇게 하려면Account
노드 정의를 삭제해야 합니다. 자세한 내용은 기존 노드 또는 에지 정의 삭제를 참조하세요.Account
테이블에서create_time
열을 삭제할 수 없습니다. 이렇게 하려면Account
노드 정의에서create_time
속성을 삭제해야 합니다. 자세한 내용은 기존 노드 또는 에지 정의 업데이트를 참고하세요.
하지만 다음과 같은 스키마 변경은 수행할 수 있습니다.
- 다른 스키마 요구사항에서 허용하는 경우
Account
테이블과id
및create_time
열 스키마를 수정합니다. 자세한 내용은 스키마 업데이트 수행을 참고하세요.
스키마 시각화 보기
Spanner Graph 쿼리를 실행한 후 Spanner Studio에서 스키마 시각화를 확인할 수 있습니다. 자세한 내용은 Spanner Graph 시각화 사용을 참조하세요.
스키마 없는 데이터 관리
또한 Spanner Graph는 더욱 유연한 그래프 정의가 필요한 경우에 유용한 스키마 없는 데이터 관리를 지원합니다. 자세한 내용은 Spanner Graph에서 스키마 없는 데이터 관리를 참조하세요.