Advanced Example - Graph & Vector

이 예제에서는 AkasicDB의 그래프와 벡터 기능을 모두 활용해서 보다 복잡한 유통 관련 질의를 수행하는 워크플로우를 보여줍니다.

1. 확장 로드

CREATE EXTENSION IF NOT EXISTS akasicdb;

SELECT akasicdb_admin.initialize();
  • AkasicDB의 모든 타입과 함수를 데이터베이스에 등록합니다.
  • 이 과정은 관리자 권한을 가진 계정으로만 수행할 수 있습니다.

2. 테이블 생성 및 튜토리얼 데이터 준비

Basic Example - Graph문서의 “2. 테이블 생성”과 “3. 튜토리얼 데이터 생성” 부분을 참고해주세요.

3. 벡터 컬럼 추가

ALTER TABLE store
ADD COLUMN embedding vector(3) NOT NULL DEFAULT '[0,0,0]';
ALTER TABLE item
ADD COLUMN embedding vector(3) NOT NULL DEFAULT '[0,0,0]';
ALTER TABLE customer
ADD COLUMN embedding vector(3) NOT NULL DEFAULT '[0,0,0]';
ALTER TABLE orders
ADD COLUMN embedding vector(3) NOT NULL DEFAULT '[0,0,0]';

UPDATE store
SET embedding = ARRAY[random(), random(), random()]::real[];
UPDATE item
SET embedding = ARRAY[random(), random(), random()]::real[];
UPDATE customer
SET embedding = ARRAY[random(), random(), random()]::real[];
UPDATE orders
SET embedding = ARRAY[random(), random(), random()]::real[];
  • 각 테이블에 임베딩 벡터를 저장할 컬럼을 추가합니다.
  • 임베딩은 임의의 3차원 벡터값으로 생성됩니다.

4. 그래프 정의 및 생성

SELECT akasicdb.define_graph('retail_graph');

SELECT akasicdb.define_vertex('retail_graph', 'v_item', 'item');
SELECT akasicdb.define_vertex('retail_graph', 'v_customer', 'customer');
SELECT akasicdb.define_vertex('retail_graph', 'v_store', 'store');

SELECT akasicdb.define_edge('retail_graph', 
                            'sell',
                            'v_store', 'store s',
                            'v_item', 'item i',
                            'SELECT null FROM store s, orders o, item i '
                            'WHERE s.s_id = o.s_id AND i.i_no = o.i_no');
SELECT akasicdb.define_edge('retail_graph', 
                            'buy',
                            'v_customer', 'customer c',
                            'v_item', 'item i',
                            'SELECT null FROM customer c, orders o, item i '
                            'WHERE c.c_id = o.c_id AND i.i_no = o.i_no');
                        
SELECT akasicdb.create_graph('retail_graph');
  • Basic Example - Graph문서의 “4. 그래프 정의 및 생성”과 동일한 그래프 정의입니다.
  • 이 예제에서는 각 테이블에 벡터 컬럼 embedding이 추가되었기 때문에 각 정점이 속성으로 이 임베딩값을 함께 가지게 됩니다.

5. HNSW 인덱스 생성

CREATE INDEX ON test.v_customer USING vectoron (embedding_ vector_l2_ops);
CREATE INDEX ON test.v_item USING vectoron (embedding_ vector_l2_ops);
  • Basic Example - Vector문서와 마찬가지로, 기본 HNSW 알고리즘을 사용합니다.
  • AkasicDB는 그래프의 정점/간선의 벡터 컬럼에 대해서도 인덱스를 생성할 수 있습니다. 이 예제에서는 정점 v_customer, v_item의 속성 embedding_에 대해서 각각 HNSW 인덱스를 생성합니다.

6. 그래프+벡터 질의

-- 탐색 깊이 설정
SET vectoron.hnsw_ef_search = 64;
  • vectoron.hnsw_ef_search으로 검색 품질(Recall)을 조절할 수 있습니다.
WITH customer_top_k AS (
    SELECT * 
    FROM test.v_customer
    ORDER BY embedding_ <-> '[0.15,0.15,0.35]'::vector
    LIMIT 5
)
SELECT ck.first_name_, ck.last_name_, cq.product_name, cq.price
FROM customer_top_k ck, 
     LATERAL akasicdb.cypher('test', $$
MATCH (c:v_customer)-[:buy]->(i:v_item)
WHERE c.c_id_ = $c_id::integer
RETURN 
    i.name_ as product_name,
    i.price_ as price
$$, jsonb_build_object('c_id', ck.c_id_)) as cq(
    product_name varchar,
    price decimal
)
  • WITH 절의 벡터 검색 질의를 통해 조건에 맞는 소비자(customer_top_k)를 찾습니다.
  • SQL의 LATERAL 문법을 통해 customer_top_k의 각 튜플에 대해서 그래프 질의를 수행합니다.
  • customer_top_kc_id_ 값을 jsonb_build_object 함수를 통해 파라미터로 넘깁니다.
  • 파라미터로 넘긴 c_id_값을 가지는 소비자가 구매한 상품을 그래프 질의로 검색합니다.

이 과정을 통해 AkasicDB에서 벡터 검색과 그래프 질의를 결합하는 방법을 쉽게 이해할 수 있습니다.


This site uses Just the Docs, a documentation theme for Jekyll.