콘텐츠로 이동

Graph DML

AkasicDB에서 생성된 그래프에 정점 및 간선을 추가/삭제하고, 속성을 업데이트하는 방법을 안내합니다.


그래프 준비

-- 그래프 'community_graph'를 정의
SELECT akasicdb.define_graph('community_graph');

-- 그래프 정의 'community_graph'에 정점 정의 'person' 추가
SELECT akasicdb.define_vertex(
  'community_graph', 
  'person',
  ARRAY['name text', 'age int']
);

-- 그래프 정의 'community_graph'에 간선 정의 'knows' 추가
SELECT akasicdb.define_edge(
  'community_graph', 'knows', 
  'person', 'person', 
  ARRAY['since timestamptz']
);

-- 그래프 정의 'community_graph'를 기반으로 그래프 생성   
SELECT akasicdb.create_graph('community_graph');

정점/간선 추가

Warning

SQL INSERT를 사용하여 정점이나 간선을 추가하려 하면 정상적으로 동작하지 않습니다. 반드시 제공된 함수를 사용해야 합니다.

정점 추가

-- 그래프 'community_graph'에 'person' 정점 4개를 추가
SELECT akasicdb.insert_vertex(
  'community_graph', 
  'person', 
  '{"name": "Alice", "age": 30}'
);
SELECT akasicdb.insert_vertex(
  'community_graph', 
  'person', 
  '{"name": "Bob", "age": 25}'
);
SELECT akasicdb.insert_vertex(
  'community_graph', 
  'person', 
  '{"name": "Charlie", "age": 42}'
);
SELECT akasicdb.insert_vertex(
  'community_graph', 
  'person', 
  '{"name": "Diana", "age": 28}'
);

함수 인자 설명

akasicdb.insert_vertex(
    graph_name,     -- 정점을 추가할 그래프명
    vertex_label,   -- 정점 레이블
    prop_kv         -- 정점의 속성, {"컬럼명":속성값}의 key-value 형태를 가지는 JSON 오브젝트
);
주어진 레이블과 속성 정보를 기반으로 새로운 정점을 만들어서 그래프에 추가합니다.

prop_kv는 추가할 정점의 속성을 명시하기 위한 파라미터로, 키(key)가 추가할 정점 레이블의 속성명과 일치해야 합니다. 명시되지 않은 속성은 NULL로 저장됩니다.

정점의 식별자인 vertex_id의 경우 자동으로 배정되며, 함수의 반환값으로 확인할 수 있습니다.

간선 추가

-- 그래프 'community_graph'에 정점 ID 1, 2(이 경우 Alice와 Bob)를 연결하는 knows 간선을 추가
SELECT akasicdb.insert_edge(
  'community_graph', 
  'knows', 1, 2, 
  '{"since": "2020-01-01T00:00:00Z"}'
);
SELECT akasicdb.insert_edge(
  'community_graph', 
  'knows', 2, 4, 
  '{"since": "2018-09-01T00:00:00Z"}'
);

함수 인자 설명

akasicdb.insert_edge(
    graph_name, -- 간선을 추가할 그래프명
    edge_label, -- 간선 레이블
    src_vid,    -- 간선의 출발 정점 ID
    dst_vid,    -- 간선의 도착 정점 ID
    prop_kv,    -- 간선의 속성, {"컬럼명":속성값}의 key-value 형태를 가지는 JSON 오브젝트
);

주어진 레이블과 속성 정보, 연결할 정점의 ID를 기반으로 새로운 간선을 만들어서 그래프에 추가합니다.

이때 정점 ID는 이미 그래프에 존재하는 정점에 대한 것이어야 합니다.

prop_kv는 추가할 간선의 속성을 명시하기 위한 파라미터로, 키(key)가 추가할 간선 레이블의 속성명과 일치해야 합니다. 명시되지 않은 속성은 NULL로 저장됩니다.

간선의 식별자인 edge_id의 경우 자동으로 배정되며, 함수의 반환값으로 확인할 수 있습니다.

Warning

AkasicDB 커뮤니티 에디션의 경우, 그래프의 정점/간선 수에 제한이 있습니다. 각 정점/간선 레이블 별로 최대 1,000,000 (1M)개의 정점/간선만 저장할 수 있습니다.

정점/간선 삭제

Warning

SQL DELETE를 사용하여 정점이나 간선을 제거할 경우 예상대로 동작하지 않을 수 있습니다. 반드시 제공된 함수를 사용해야 합니다.

정점 삭제

  • 조건부 정점 삭제
-- 그래프 'community_graph'에서 person 레이블의 ID 3번 정점을 삭제
-- 연결된 간선이 없으니 에러 없이 성공
SELECT akasicdb.delete_vertex_restrict(
  'community_graph', 
  'person', 3
);

함수 인자 설명

akasicdb.delete_vertex_restrict(
    graph_name,     -- 정점을 삭제할 그래프 
    vertex_label,   -- 정점의 레이블
    vertex_id       -- 삭제할 정점의 ID
);

주어진 레이블과 ID를 가지는 정점을 찾고, 연결된 간선이 없다면 해당 정점을 삭제합니다. 연결된 간선이 있다면 에러(Exception) 메시지를 출력합니다.

정점 삭제에 성공했다면 이 함수는 1을 반환하며, 해당하는 정점이 없어서 삭제하지 못했다면 0을 반환합니다.

  • 연쇄형 정점 삭제
-- 그래프 'community_graph'에서 person 레이블의 ID 1번 정점을 삭제
-- 연결된 간선(knows, 1->2)도 함께 삭제됨
SELECT akasicdb.delete_vertex_cascade(
  'community_graph', 
  'person', 1
);

함수 인자 설명

akasicdb.delete_vertex_cascade(
    graph_name,     -- 정점을 삭제할 그래프 
    vertex_label,   -- 정점의 레이블
    vertex_id       -- 삭제할 정점의 ID
);

주어진 레이블과 ID를 가지는 정점을 찾고, 연결된 간선이 있다면 해당 간선들까지 모두 삭제합니다.

정점 삭제에 성공했다면 이 함수는 1을 반환하며, 해당하는 정점이 없어서 삭제하지 못했다면 0을 반환합니다.

간선 삭제

-- 그래프 'community_graph'에서 knows 레이블의 ID 2번 간선을 삭제
SELECT akasicdb.delete_edge(
  'community_graph', 
  'knows', 2
);

함수 인자 설명

akasicdb.delete_edge(
    graph_name, -- 간선을 삭제할 그래프 
    edge_label, -- 간선의 레이블
    edge_id     -- 삭제할 간선의 ID
);

주어진 레이블과 ID를 가지는 간선을 찾아서 삭제합니다.

간선 삭제에 성공했다면 이 함수는 1을 반환하며, 해당하는 간선이 없어서 삭제하지 못했다면 0을 반환합니다.

정점/간선 속성 업데이트

-- 그래프 'community_graph'에서 person 레이블의 ID 4번 정점의 속성을 업데이트
UPDATE community_graph.person
SET name = 'Daniel'
WHERE vertex_id = 4;

정점과 간선의 속성을 업데이트할 때는 일반적인 관계형 테이블을 업데이트할 때와 마찬가지로 SQL의 UPDATE 문을 사용할 수 있습니다. 각 정점/간선 속성은 그래프 이름을 네임스페이스 이름으로, 레이블을 테이블 이름으로 사용하는 테이블에 저장됩니다.

Warning

akasicdb.create_graph()replace_if_exists 옵션을 사용해 그래프를 재생성하면 기존에 수행한 정점/간선의 추가/삭제 및 속성 업데이트 내역은 모두 사라집니다.