Graph+Vector Hybrid Example¶
이 예제는 retail dataset에서 AkasicDB의 graph 기능과 vector 기능을 함께 사용하는 workflow를 보여줍니다.
확장 로드¶
- AkasicDB의 모든 타입과 함수를 데이터베이스에 등록합니다.
- 이 과정은 관리자 권한을 가진 계정으로만 수행할 수 있습니다.
테이블 생성 및 튜토리얼 데이터 준비¶
Graph Example 문서의 테이블 생성과 튜토리얼 데이터 생성 부분을 따라 테이블을 생성하고 데이터를 적재합니다.
벡터 컬럼 추가¶
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',
ARRAY['i_no integer', 'name varchar(50)', 'price decimal(7,2)', 'embedding vector(3)'],
'item'
);
SELECT akasicdb.define_vertex(
'retail_graph',
'v_customer',
ARRAY['c_id integer', 'first_name varchar(20)', 'last_name varchar(30)', 'embedding vector(3)'],
'customer'
);
SELECT akasicdb.define_vertex(
'retail_graph',
'v_store',
ARRAY['s_id integer', 'name varchar(50)', 'embedding vector(3)'],
'store',
'SELECT s_id, name, embedding FROM store'
);
SELECT akasicdb.define_edge(
'retail_graph',
'buy',
'v_customer', 'v_item',
null,
'SELECT null FROM customer c, orders o, item i '
'WHERE c.c_id = o.c_id AND i.i_no = o.i_no',
'customer c', 'item i'
);
SELECT akasicdb.define_edge(
'retail_graph',
'sell',
'v_store', 'v_item',
null,
'SELECT null FROM store s, orders o, item i '
'WHERE s.s_id = o.s_id AND i.i_no = o.i_no',
'store s', 'item i'
);
SELECT akasicdb.create_graph('retail_graph');
- Graph Example 문서의 그래프 정의 및 생성과 유사한 그래프 정의입니다.
- 이 예제에서는 각 테이블에 추가된 벡터 컬럼
embedding을 정점의 속성으로 지정했습니다.
HNSW 인덱스 생성¶
CREATE INDEX ON retail_graph.v_customer USING vectoron (embedding vector_l2_ops);
CREATE INDEX ON retail_graph.v_item USING vectoron (embedding vector_l2_ops);
- 이 예제는 AkasicDB의 기본 vector index family인 HNSW를 사용합니다. Vector-only SQL 예제는 Vector Examples를 참고합니다.
- AkasicDB는 graph vertex와 edge로 노출된 vector column에도 인덱스를 만들 수 있습니다. 이 예제에서는
v_customer,v_itemvertex의embedding속성에 HNSW 인덱스를 만듭니다.
그래프+벡터 질의¶
vectoron.hnsw_ef_search로 query time의 HNSW 검색 폭을 조정합니다.
SELECT first_name, last_name, product_name, price
FROM akasicdb.cypher('retail_graph', $$
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절에서 vector operator로 query vector와 가까운 customer를 찾고customer_top_k로 전달합니다. WITH절을 통해customer_top_k를 다음MATCH절로 넘깁니다.customer_top_k에 해당하는 customer가 구매한 상품을 graph query로 검색합니다.
이 예제에서는 AkasicDB에서 vector search와 graph query를 함께 활용하는 방법을 살펴보았습니다.