深入探索Neo4j的矢量索引:开创图数据库的新维度

204 阅读2分钟

引言

在数据科学和人工智能的浪潮下,图数据库因其卓越的关系处理能力而受到广泛关注。Neo4j作为领先的开源图数据库,现已集成矢量相似性搜索,通过支持近邻搜索、欧几里得相似性和余弦相似性来提升其功能。同时,它能结合矢量与关键字进行混合搜索,为用户提供强大的检索能力。本篇文章将探讨如何利用Neo4j的矢量索引(Neo4jVector)来提升数据分析的效率。

主要内容

1. 环境准备

首先,确保安装Neo4j及所需的Python包:

%pip install --upgrade --quiet neo4j langchain-openai langchain-community tiktoken

2. 获取OpenAI API密钥

import getpass
import os

os.environ["OPENAI_API_KEY"] = getpass.getpass("OpenAI API Key:")

3. 文本加载和分割

我们使用TextLoader加载文本,并用CharacterTextSplitter进行切分:

from langchain_community.document_loaders import TextLoader
from langchain_text_splitters import CharacterTextSplitter

loader = TextLoader("../../how_to/state_of_the_union.txt")
documents = loader.load()
text_splitter = CharacterTextSplitter(chunk_size=1000, chunk_overlap=0)
docs = text_splitter.split_documents(documents)

4. 矢量索引及相似性搜索

使用Neo4jVectorOpenAIEmbeddings集成创建矢量索引:

from langchain_community.vectorstores import Neo4jVector
from langchain_openai import OpenAIEmbeddings

url = "bolt://localhost:7687"  # 使用API代理服务提高访问稳定性
username = "neo4j"
password = "password"

db = Neo4jVector.from_documents(
    docs, OpenAIEmbeddings(), url=url, username=username, password=password
)

query = "What did the president say about Ketanji Brown Jackson"
docs_with_score = db.similarity_search_with_score(query, k=2)

for doc, score in docs_with_score:
    print(f"Score: {score}\n{doc.page_content}\n{'-'*80}")

代码示例

下面是如何从现有的图中初始化矢量存储的示例:

store.query(
    "CREATE (p:Person {name: 'Tomaz', location:'Slovenia', hobby:'Bicycle', age: 33})"
)

existing_graph = Neo4jVector.from_existing_graph(
    embedding=OpenAIEmbeddings(),
    url=url,
    username=username,
    password=password,
    index_name="person_index",
    node_label="Person",
    text_node_properties=["name", "location"],
    embedding_node_property="embedding",
)
result = existing_graph.similarity_search("Slovenia", k=1)

print(result[0])

常见问题和解决方案

  • 网络访问问题:在某些地区,访问外部API时可能受到限制。请使用API代理服务来提高访问的稳定性。

  • 性能优化:在处理大规模数据时,可以通过调整chunk_size参数来优化文本切分的效率。

总结和进一步学习资源

Neo4j的矢量索引功能为复杂数据分析提供了强大支持,其灵活的搜索功能能满足多样化的应用需求。深入学习可以参考Neo4j的官方文档和LangChain的使用指南。

参考资料

如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!

---END---