doc: https://neo4j.com/docs/genai/tutorials/embeddings-vector-indexes/embeddings/sentence-transformers/ doc: https://neo4j.com/docs/cypher-manual/current/indexes/semantic-indexes/vector-indexes/
embedding vector를 생성하는 과정은 open source 또는 cloud api를 통해 해야 함. neo4j에서 embedding 해주는 기능은 없음.
embedding vector를 db에 주입하는 과정은 cypher query로 수행됨.
MATCH (m) // 특정 노드 또는 엣지 검색
CALL db.create.setNodeVectorProperty(m, 'embedding', $embeddings) // m 객체에 embedding 속성으로 임베딩 벡터 추가.
# python script
async def upsert_embed(self, tmp_node: dict[str, str]):
"""vector index를 노드 또는 엣지에 추가
tmp_node example)
tmp_node = {
'entity_name': "최정민",
'entity_type': "CHARACTER",
'description': "desc",
'__vector__': list[float],
'__id__': "최정민"
}
"""
embeddings = tmp_node.get("__vector__", None)
if embeddings is None:
logger.warning(f"[-] no embeddings in {tmp_node}")
return
embeddings = list(embeddings)
query = """
UNWIND $tmp_node as tmp
MATCH (m:ENTITY {entity_name: tmp.entity_name})
CALL db.create.setNodeVectorProperty(m, 'embedding', $embeddings)
"""
parameters = {
"tmp_node": tmp_node,
'embeddings': embeddings
}
logger.info(f"[-] Embeddings for {tmp_node['entity_name']} upserted")
return await self._execute_write_query(query, parameters)