这一部分将指导您设置`Neo4jVectorStore`来存储文档嵌入并执行相似性搜索。

链接:https://neo4j.com[Neo4j] 是一个开源的NoSQL图数据库。它是一个完全支持事务的数据库(遵循ACID原则),以图的形式存储数据,包含节点和连接节点的关系。受到现实世界结构的启发,它能够在复杂数据上提供高查询性能,同时对开发者来说又直观简单。

该链接:https://neo4j.com/docs/cypher-manual/current/indexes-for-vector-search/[Neo4j的向量搜索] 允许用户从大型数据集中查询向量嵌入。嵌入是数据对象的数值表示,例如文本、图像、音频或文档。嵌入可以存储在 节点 属性上,并且可以使用 db.index.vector.queryNodes() 函数进行查询。这些索引由Lucene提供支持,使用分层导航小世界图(HNSW)来执行向量字段的k近似最近邻(k-ANN)查询。

前提条件

  • 一个运行中的Neo4j (5.15及以上版本) 实例。以下选项可用:

  • 如果需要的话,一個 API 密钥用于 EmbeddingClient 来生成由 Neo4jVectorStore 存储的嵌入。

依赖项

将Neo4j Vector Store依赖项添加到您的项目中:

<dependency>
	<groupId>org.springframework.ai</groupId>
	<artifactId>spring-ai-neo4j-store</artifactId>
</dependency>

或者添加到您的Gradle build.gradle 构建文件中。

dependencies {
    implementation 'org.springframework.ai:spring-ai-neo4j-store'
}
Tip
参考依赖管理部分,将Spring AI BOM添加到你的构建文件中。

配置

要连接到Neo4j并使用`Neo4jVectorStore`,你需要提供你实例的访问详情。一个简单的配置可以通过Spring Boot的_application.properties_提供,

spring.neo4j.uri=<uri_for_your_neo4j_instance>
spring.neo4j.authentication.username=<your_username>
spring.neo4j.authentication.password=<your_password>
# API key if needed, e.g. OpenAI
spring.ai.openai.api.key=<api-key>

环境变量

export SPRING_NEO4J_URI=<uri_for_your_neo4j_instance>
export SPRING_NEO4J_AUTHENTICATION_USERNAME=<your_username>
export SPRING_NEO4J_AUTHENTICATION_PASSWORD=<your_password>
# API key if needed, e.g. OpenAI
export SPRING_AI_OPENAI_API_KEY=<api-key>

或者可以是这些的混合。例如,如果你想将你的API密钥存储为环境变量,但其余部分保留在普通的_application.properties_文件中。

Note
如果你选择创建一个shell脚本以便将来工作的便捷,请务必在启动应用程序之前通过“源”运行它,即使用`source <your_script_name>.sh`命令。
Note
除了_application.properties_和环境变量之外,Spring Boot提供了https://docs.spring.io/spring-boot/docs/current/reference/html/features.html#features.external-config[额外的配置选项]。

Spring Boot的Neo4j驱动自动配置功能会创建一个bean实例,该实例将被`Neo4jVectorStore`使用。

自动配置

Spring AI为Neo4j Vector Store提供了Spring Boot自动配置。要启用它,请在项目的Maven `pom.xml`文件中添加以下依赖:

<dependency>
    <groupId>org.springframework.ai</groupId>
    <artifactId>spring-ai-neo4j-store-spring-boot-starter</artifactId>
</dependency>

或者添加到您的Gradle build.gradle 构建文件中。

dependencies {
    implementation 'org.springframework.ai:spring-ai-neo4j-store-spring-boot-starter'
}
Tip
参考依赖管理部分,将Spring AI BOM添加到你的构建文件中。

请查看配置参数列表,以了解向量存储的默认值和配置选项。

Tip
参考仓库部分,添加里程碑和/或快照仓库到你的构建文件中。

此外,您将需要一个已配置的`EmbeddingClient` bean。有关更多信息,请参考EmbeddingClient章节。

这里是所需豆类的一个示例:

@Bean
public EmbeddingClient embeddingClient() {
    // Can be any other EmbeddingClient implementation.
    return new OpenAiEmbeddingClient(new OpenAiApi(System.getenv("SPRING_AI_OPENAI_API_KEY")));
}

在Spring Boot自动配置的Neo4j Driver Bean不符合您的需求时,您仍然可以定义您自己的Bean。请阅读https://neo4j.com/docs/java-manual/current/client-applications/[Neo4j Java Driver reference]以获取有关自定义驱动配置的更深入信息。

@Bean
public Driver driver() {
    return GraphDatabase.driver("neo4j://<host>:<bolt-port>",
            AuthTokens.basic("<username>", "<password>"));
}

现在您可以自动将 Neo4jVectorStore 作为向量存储在您的应用程序中进行配置。

元数据过滤

您也可以利用通用的、可移植的元数据过滤器,与Neo4j存储一起使用。

例如,您可以使用文本表达式语言:

vectorStore.similaritySearch(
                    SearchRequest.defaults()
                            .withQuery("The World")
                            .withTopK(TOP_K)
                            .withSimilarityThreshold(SIMILARITY_THRESHOLD)
                            .withFilterExpression("author in ['john', 'jill'] && 'article_type' == 'blog'"));

或者使用`Filter.Expression` DSL编程方式:

FilterExpressionBuilder b = new FilterExpressionBuilder();

vectorStore.similaritySearch(SearchRequest.defaults()
                    .withQuery("The World")
                    .withTopK(TOP_K)
                    .withSimilarityThreshold(SIMILARITY_THRESHOLD)
                    .withFilterExpression(b.and(
                            b.in("john", "jill"),
                            b.eq("article_type", "blog")).build()));
Note
那些(可移动的)过滤表达式会自动转换成专有的Neo4j WHERE 过滤表达式。

例如,这个便携式过滤表达式:

sql author in ['john', 'jill'] && 'article_type' == 'blog'

转换成专有的Neo4j过滤格式:

node.`metadata.author` IN ["john","jill"] AND node.`metadata.'article_type'` = "blog"

Neo4j向量存储属性

你可以在Spring Boot配置中使用以下属性来自定义Neo4j向量存储。

Property Default value

spring.ai.vectorstore.neo4j.database-name

neo4j

spring.ai.vectorstore.neo4j.embedding-dimension

1536

spring.ai.vectorstore.neo4j.distance-type

cosine

spring.ai.vectorstore.neo4j.label

Document

spring.ai.vectorstore.neo4j.embedding-property

embedding

spring.ai.vectorstore.neo4j.index-name

spring-ai-document-index