콘텐츠로 이동

Advanced Example - Graph & Vector

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

확장 로드

CREATE EXTENSION IF NOT EXISTS akasicdb;

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

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

Basic Example - Graph문서의 "2. 테이블 생성"과 "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차원 벡터값으로 생성됩니다.

그래프 정의 및 생성

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이 추가되었기 때문에 각 정점이 속성으로 이 임베딩값을 함께 가지게 됩니다.

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 인덱스를 생성합니다.

그래프+벡터 질의

-- 탐색 깊이 설정
SET vectoron.hnsw_ef_search = 64;
* vectoron.hnsw_ef_search으로 검색 품질(Recall)을 조절할 수 있습니다.

SELECT first_name, last_name, product_name, price
FROM akasicdb.cypher('test', $$
    MATCH (v:v_customer)
    WITH v.vertex_id AS customer_top_k
    ORDER BY v.embedding_ <-> '[0.15,0.15,0.35]'
    LIMIT 5
    MATCH (c:v_customer)-[:buy]->(i:v_item)
    WHERE c.vertex_id = customer_top_k
    RETURN
        c.first_name_ as first_name,
        c.last_name_ as last_name,
        i.name_ as product_name,
        i.price_ as price
$$) as (
    first_name varchar,
    last_name varchar,
    product_name varchar,
    price decimal
)
ORDER BY first_name, last_name, product_name;
  • 첫번째 MATCH 절에서 벡터 연산자를 통해 조건에 맞는 소비자들(customer_top_k)을 찾습니다.
  • WITH 절을 통해 customer_top_k를 다음 MATCH 절로 넘깁니다.
  • customer_top_k 에 해당하는 소비자가 구매한 상품을 그래프 질의로 검색합니다.

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