이 문서에서는 Spanner Graph에서 노드와 에지를 삽입, 업데이트, 삭제하여 데이터를 관리하는 방법을 설명합니다. Spanner Graph는 테이블의 데이터를 그래프 노드 및 에지에 매핑합니다. 그래프에서 데이터를 변경하려면 해당 그래프와 연결된 입력 테이블의 데이터를 변경해야 합니다. 그래프 데이터를 관리하려면 Google Cloud 콘솔, Google Cloud CLI 또는 Spanner 클라이언트 라이브러리를 사용할 수 있습니다.
Spanner Graph 설정
Spanner Graph의 데이터를 관리하려면 먼저 다음 단계를 따라 Spanner Graph를 설정해야 합니다.
Spanner 인스턴스 내에 데이터베이스를 만듭니다.
데이터베이스에 그래프 데이터를 삽입합니다.
이 섹션의 예시에서는 이전 단계에서 Spanner Graph를 설정할 때 만든 인스턴스와 데이터베이스를 사용합니다.
노드 또는 에지 삽입
노드 또는 에지를 노드 테이블이나 에지 테이블에 삽입하려면 Google Cloud 콘솔, gcloud CLI 또는 Spanner 클라이언트 라이브러리를 사용하세요.
Google Cloud 콘솔 및 gcloud CLI에서는 GoogleSQL 데이터 조작 언어(DML)를 사용할 수 있습니다. Spanner 클라이언트 라이브러리에서는 DML 또는 변형 API를 사용할 수 있습니다.
에지를 삽입하기 전에 에지로 연결된 소스 및 대상 노드가 존재하는지 확인합니다. 에지에 연결된 소스 또는 대상 노드가 존재하지 않을 때 에지를 삽입하면 참조 무결성 위반 오류가 발생할 수 있습니다. 자세한 내용은 누락된 소스 노드의 INTERLEAVE IN 관계 위반 및 누락된 대상 노드의 외래 키 제약조건 위반을 참조하세요.
다음 예시에서는 Spanner Graph 설정에서 만든 데이터베이스에 Account 노드와 Transfer 에지를 삽입합니다.
콘솔
Google Cloud 콘솔에서 다음 DML 문을 실행합니다. 자세한 내용은 Google Cloud 콘솔에서 문 실행을 참조하세요.
-- Insert 2 Account nodes.
INSERT INTO Account (id, create_time, is_blocked)
VALUES (1, CAST('2000-08-10 08:18:48.463959-07:52' AS TIMESTAMP), false);
INSERT INTO Account (id, create_time, is_blocked)
VALUES (2, CAST('2000-08-12 07:13:16.463959-03:41' AS TIMESTAMP), true);
-- Insert 2 Transfer edges.
INSERT INTO AccountTransferAccount (id, to_id, create_time, amount)
VALUES (1, 2, CAST('2000-09-11 03:11:18.463959-06:36' AS TIMESTAMP), 100);
INSERT INTO AccountTransferAccount (id, to_id, create_time, amount)
VALUES (1, 1, CAST('2000-09-12 04:09:34.463959-05:12' AS TIMESTAMP), 200);
gcloud
gcloud CLI에서 다음 명령어를 실행합니다. 자세한 내용은 gcloud CLI로 문 실행을 참조하세요.
gcloud spanner databases execute-sql DATABASE-NAME --instance=INSTANCE-NAME \ --sql="INSERT INTO Account (id, create_time, is_blocked) VALUES (1, CAST('2000-08-10 08:18:48.463959-07:52' AS TIMESTAMP), false)"gcloud spanner databases execute-sql DATABASE-NAME --instance=INSTANCE-NAME \ --sql="INSERT INTO Account (id, create_time, is_blocked) VALUES (2, CAST('2000-08-12 07:13:16.463959-03:41' AS TIMESTAMP), true)"gcloud spanner databases execute-sql DATABASE-NAME --instance=INSTANCE-NAME \ --sql="INSERT INTO AccountTransferAccount (id, to_id, create_time, amount) VALUES (1, 2, CAST('2000-09-11 03:11:18.463959-06:36' AS TIMESTAMP), 100)"gcloud spanner databases execute-sql DATABASE-NAME --instance=INSTANCE-NAME \ --sql="INSERT INTO AccountTransferAccount (id, to_id, create_time, amount) VALUES (1, 1, CAST('2000-09-12 04:09:34.463959-05:12' AS TIMESTAMP), 200)"
다음을 바꿉니다.
- DATABASE_NAME: 데이터베이스 이름입니다.
 - INSTANCE_NAME: 인스턴스 이름입니다.
 
클라이언트 라이브러리
Python
자바
Go
C++
노드 또는 에지 업데이트
기존 노드나 에지를 업데이트하려면 Google Cloud 콘솔, gcloud CLI 또는 Spanner 클라이언트 라이브러리를 사용합니다.
GoogleSQL 데이터 조작 언어(DML) 문 또는 DML 문이 포함된 Spanner Graph 쿼리를 사용하여 기존 노드 또는 에지를 업데이트할 수 있습니다. Spanner 클라이언트 라이브러리를 사용할 경우 변형 API를 사용할 수도 있습니다.
DML을 사용하여 노드 또는 에지 업데이트
다음 예시에서는 DML을 사용하여 노드 또는 에지 삽입에서 추가한 Account 노드 및 Transfer 에지를 업데이트합니다.
콘솔
Google Cloud 콘솔에서 다음 DML 문을 실행합니다. 자세한 내용은 Google Cloud 콘솔에서 문 실행을 참조하세요.
-- Update Account node
UPDATE Account SET is_blocked = false WHERE id = 2;
-- Update Transfer edge
UPDATE AccountTransferAccount
SET amount = 300
WHERE id = 1 AND to_id = 2;
gcloud
- gcloud CLI로 문을 실행합니다.
 - gcloud CLI에서 다음 명령어를 실행합니다.
 
gcloud spanner databases execute-sql DATABASE-NAME --instance=INSTANCE-NAME \ --sql="UPDATE Account SET is_blocked = false WHERE id = 2"gcloud spanner databases execute-sql DATABASE-NAME --instance=INSTANCE-NAME \ --sql="UPDATE AccountTransferAccount SET amount = 300 WHERE id = 1 AND to_id = 2"
다음을 바꿉니다.
- DATABASE_NAME: 데이터베이스 이름입니다.
 - INSTANCE_NAME: 인스턴스 이름입니다.
 
클라이언트 라이브러리
Python
자바
Go
C++
그래프 쿼리 및 DML을 사용하여 노드 또는 에지 업데이트
다음 예시에서는 DML이 포함된 Spanner Graph 쿼리를 사용하여 노드 또는 에지 삽입에서 추가한 Account 노드 및 Transfer 에지를 업데이트합니다.
콘솔
Google Cloud 콘솔에서 다음 DML 문을 실행합니다. 자세한 내용은 Google Cloud 콘솔에서 문 실행을 참조하세요.
-- Use Graph pattern matching to identify Account nodes to update:
UPDATE Account SET is_blocked = false
WHERE id IN {
  GRAPH FinGraph
  MATCH (a:Account WHERE a.id = 1)-[:Transfers]->{1,2}(b:Account)
  RETURN b.id
}
gcloud
gcloud CLI에서 다음 명령어를 실행합니다. 자세한 내용은 gcloud CLI로 문 실행을 참조하세요.
gcloud spanner databases execute-sql DATABASE-NAME --instance=INSTANCE_NAME \ --sql="UPDATE Account SET is_blocked = false"gcloud spanner databases execute-sql DATABASE-NAME --instance=INSTANCE-NAME \ --sql="UPDATE AccountTransferAccount SET amount = 300 WHERE id = 1 AND to_id = 2" --sql=" WHERE id IN { GRAPH FinGraph MATCH (a:Account WHERE a.id = 1)-[:Transfers]->{1,2}(b:Account) RETURN b.id }"
다음을 바꿉니다.
- DATABASE_NAME: 데이터베이스 이름입니다.
 - INSTANCE_NAME: 인스턴스 이름입니다.
 
클라이언트 라이브러리
Python
자바
Go
C++
노드 또는 에지 삭제
기존 노드나 에지를 삭제하려면 Google Cloud 콘솔, gcloud CLI 또는 Spanner 클라이언트 라이브러리를 사용합니다.
Google Cloud 콘솔과 gcloud CLI에서는 GoogleSQL 데이터 조작 언어(DML)를 사용하여 삭제할 수 있습니다. Spanner 클라이언트 라이브러리에서는 DML 또는 변형 API를 사용하여 노드 또는 에지를 삭제할 수 있습니다.
참조 무결성 위반 오류를 방지하려면 노드를 삭제할 때 해당 노드를 참조하는 에지가 없도록 확인하세요. 자세한 내용은 분리된 발신 에지의 상위-하위 관계 위반 및 분리된 수신 에지의 상위-하위 관계 위반을 참조하세요.
다음 예시에서는 그래프에서 Transfer 에지와 Account 노드를 삭제합니다.
콘솔
Google Cloud 콘솔에서 다음 DML 문을 실행합니다. 자세한 내용은 Google Cloud 콘솔에서 문 실행을 참조하세요.
-- Delete Transfer edge
DELETE FROM AccountTransferAccount
WHERE id = 1 AND to_id = 2;
-- Delete Account node
DELETE FROM Account WHERE id = 2;
gcloud
gcloud CLI에서 다음 명령어를 실행합니다. 자세한 내용은 gcloud CLI로 문 실행을 참조하세요.
gcloud spanner databases execute-sql DATABASE-NAME --instance=INSTANCE-NAME \ --sql="DELETE FROM AccountTransferAccount WHERE id = 1 AND to_id = 2"gcloud spanner databases execute-sql DATABASE-NAME --instance=INSTANCE-NAME \ --sql="DELETE FROM Account WHERE id = 2"
다음을 바꿉니다.
- DATABASE_NAME: 데이터베이스 이름입니다.
 - INSTANCE_NAME: 인스턴스 이름입니다.
 
클라이언트 라이브러리
Python
자바
Go
C++
다음 예시와 같이 Spanner Graph 쿼리를 DML 문과 결합할 수 있습니다.
  -- Use Graph pattern matching to identify Account nodes to delete:
  DELETE FROM AccountTransferAccount
  WHERE id IN {
    GRAPH FinGraph
    MATCH (a:Account WHERE a.id = 1)-[:Transfers]->(b:Account)
    RETURN b.id
  }
자동화 및 대량 데이터 작업
개별 노드와 에지를 삽입, 업데이트, 삭제하기 위해 DML을 사용하는 것 외에도, 다음 방법을 사용하여 Spanner Graph 데이터를 관리할 수 있습니다.
ON DELETE CASCADE 동작을 사용하여 그래프의 에지 삭제를 자동화할 수 있습니다.
TTL 정책을 사용하여 그래프의 노드와 에지 삭제를 자동화할 수 있습니다. 자세한 내용은 노드 및 에지의 TTL을 참조하세요.
분할 DML을 사용하여 그래프의 노드와 에지를 효율적으로 일괄 업데이트 및 삭제할 수 있습니다.
다음 단계
- Spanner Graph 쿼리 개요 읽어보기
 - Spanner Graph 쿼리 조정 권장사항 알아보기