그래프 만들기 및 쿼리
이 문서에서는 BigQuery 그래프를 사용하여 금융 정보가 포함된 그래프를 만들고 그래프 쿼리 언어 (GQL)를 사용하여 그래프 쿼리를 실행하는 방법을 보여줍니다.
필요한 역할
그래프를 만들고 쿼리하는 데 필요한 권한을 얻으려면 관리자에게 노드 테이블, 에지 테이블, 그래프를 만드는 데이터 세트에 대한 BigQuery 데이터 편집자 (roles/bigquery.dataEditor) IAM 역할을 부여해 달라고 요청하세요.
역할 부여에 대한 자세한 내용은 프로젝트, 폴더, 조직에 대한 액세스 관리를 참조하세요.
커스텀 역할이나 다른 사전 정의된 역할을 통해 필요한 권한을 얻을 수도 있습니다.
노드 및 에지 테이블 만들기
그래프는 기존 BigQuery 테이블에서 빌드되고 데이터 세트에 저장됩니다.
다음 예에서 만드는 테이블과 그래프를 저장하려면 데이터 세트를 만드세요.
다음 쿼리는 graph_db라는 데이터 세트를 만듭니다.
CREATE SCHEMA IF NOT EXISTS graph_db;
다음 표에는 사용자 및 계정에 관한 정보와 이러한 항목 간의 관계가 포함되어 있습니다.
Person: 사람에 관한 정보입니다.Account: 은행 계좌 정보PersonOwnAccount: 누가 어떤 계정을 소유하는지에 관한 정보입니다.AccountTransferAccount: 계정 간 전송에 관한 정보입니다.
이러한 테이블을 만들려면 다음 CREATE TABLE 문을 실행하세요.
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
);
CREATE OR REPLACE TABLE graph_db.AccountTransferAccount (
id INT64 NOT NULL,
to_id INT64 NOT NULL,
amount FLOAT64,
create_time TIMESTAMP NOT NULL,
order_number STRING,
PRIMARY KEY (id, to_id, create_time) NOT ENFORCED,
FOREIGN KEY (id) REFERENCES graph_db.Account(id) NOT ENFORCED,
FOREIGN KEY (to_id) REFERENCES graph_db.Account(id) NOT ENFORCED
);
그래프 만들기
그래프를 만들려면 CREATE PROPERTY GRAPH 문을 사용합니다.
다음 예시에서는 graph_db 데이터 세트에 FinGraph라는 그래프를 만듭니다. Account 및 Person 테이블은 노드 테이블입니다.
AccountTransferAccount 및 PersonOwnAccount 테이블은 노드 테이블 간의 관계를 나타내는 에지 테이블입니다.
CREATE OR REPLACE PROPERTY GRAPH graph_db.FinGraph
NODE TABLES (
graph_db.Account,
graph_db.Person
)
EDGE TABLES (
graph_db.PersonOwnAccount
SOURCE KEY (id) REFERENCES Person (id)
DESTINATION KEY (account_id) REFERENCES Account (id)
LABEL Owns,
graph_db.AccountTransferAccount
SOURCE KEY (id) REFERENCES Account (id)
DESTINATION KEY (to_id) REFERENCES Account (id)
LABEL Transfers
);
데이터 삽입
그래프의 데이터를 업데이트하려면 노드 및 에지 테이블의 데이터를 업데이트합니다. 그래프를 만들 때 데이터는 이동되거나 복사되지 않습니다. 대신 그래프는 노드 및 에지 테이블에 있는 데이터의 논리적 뷰 역할을 합니다. 그래프 쿼리는 쿼리를 실행할 때 노드 및 에지 테이블에 있는 데이터를 기반으로 결과를 반환합니다.
다음 쿼리는 생성한 테이블에 데이터를 삽입합니다.
INSERT INTO graph_db.Account
(id, create_time, is_blocked, nick_name)
VALUES
(7,"2020-01-10 06:22:20.222",false,"Vacation Fund"),
(16,"2020-01-27 17:55:09.206",true,"Vacation Fund"),
(20,"2020-02-18 05:44:20.655",false,"Rainy Day Fund");
INSERT INTO graph_db.Person
(id, name, birthday, country, city)
VALUES
(1,"Alex","1991-12-21 00:00:00","Australia","Adelaide"),
(2,"Dana","1980-10-31 00:00:00","Czech_Republic","Moravia"),
(3,"Lee","1986-12-07 00:00:00","India","Kollam");
INSERT INTO graph_db.AccountTransferAccount
(id, to_id, amount, create_time, order_number)
VALUES
(7,16,300,"2020-08-29 15:28:58.647","304330008004315"),
(7,16,100,"2020-10-04 16:55:05.342","304120005529714"),
(16,20,300,"2020-09-25 02:36:14.926","103650009791820"),
(20,7,500,"2020-10-04 16:55:05.342","304120005529714"),
(20,16,200,"2020-10-17 03:59:40.247","302290001255747");
INSERT INTO graph_db.PersonOwnAccount
(id, account_id, create_time)
VALUES
(1,7,"2020-01-10 06:22:20.222"),
(2,20,"2020-01-27 17:55:09.206"),
(3,16,"2020-02-18 05:44:20.655");

그래프 쿼리
그래프를 쿼리하려면 Graph Query Language를 사용하는 쿼리를 실행합니다.
다음 쿼리는 MATCH 문을 사용하여 Dana가 누구에게 돈을 송금했는지에 관한 정보를 찾습니다.
GRAPH graph_db.FinGraph
MATCH
(person:Person {name: "Dana"})-[own:Owns]->
(account:Account)-[transfer:Transfers]->(account2:Account)<-[own2:Owns]-(person2:Person)
RETURN
person.name AS owner,
transfer.amount AS amount,
person2.name AS transferred_to
ORDER BY person2.name;
결과는 다음과 유사합니다.
+-------+--------+----------------+ | owner | amount | transferred_to | +-------+--------+----------------+ | Dana | 500.0 | Alex | | Dana | 200.0 | Lee | +-------+--------+----------------+
그래프 쿼리 결과 시각화
%%bigquery --graph 매직 명령어와 GQL 쿼리를 차례로 사용하여 노트북에서 그래프 쿼리 결과를 시각화할 수 있습니다. 쿼리에서 JSON 형식의 그래프 요소를 반환해야 합니다. 이전 섹션에서 실행한 쿼리의 결과를 시각화하려면 노트북 코드 셀에서 다음 쿼리를 실행하세요.
%%bigquery --graph
GRAPH graph_db.FinGraph
MATCH
p = ((person:Person {name: "Dana"})-[own:Owns]->
(account:Account)-[transfer:Transfers]->(acount2:Account)<-[own2:Owns]-(person2:Person))
RETURN
TO_JSON(p) AS path;

그래프 삭제
그래프를 삭제하려면 DROP PROPERTY GRAPH 문을 사용합니다. 그래프를 삭제해도 그래프 노드와 에지를 정의하는 데 사용된 테이블에는 영향을 미치지 않습니다. 다음 쿼리는 FinGraph 그래프를 삭제합니다.
DROP PROPERTY GRAPH graph_db.FinGraph;
다음 단계
- BigQuery 그래프 소개를 참고하세요.
- 그래프 스키마에 대해 자세히 알아보세요.
- 그래프 쿼리를 작성하는 방법을 자세히 알아보세요.
- Graph Query Language (GQL)에 대해 자세히 알아보세요.
- 사기 감지에 관한 튜토리얼은 BigQuery 그래프를 사용한 사기 감지를 참고하세요.
- 고객 프로필에 관한 튜토리얼은 BigQuery 그래프로 고객 360 추천 빌드를 참고하세요.
- 공급망에 관한 튜토리얼은 BigQuery 그래프를 사용한 공급망 추적을 참고하세요.