Spring AI / Vector Databases / Neo4j Spring AI参考文档向量数据库Neo4jNeo4j本节将引导您设置Neo4jVectorStore用于存储文档嵌入并执行相似性搜索。Neo4j 是一个开源的 NoSQL 图数据库。它是一个完全支持事务的数据库ACID将数据存储为由节点和连接节点的关系组成的图结构。受现实世界结构的启发它能够在保持对开发者直观和简单的同时对复杂数据提供高查询性能。Neo4j 的向量搜索功能允许用户从大型数据集中查询向量嵌入。嵌入是数据对象如文本、图像、音频或文档的数值表示。嵌入可以存储在节点属性上并可以使用db.index.vector.queryNodes()函数进行查询。这些索引由 Lucene 驱动使用分层可导航小世界图HNSW对向量字段执行 k-近似最近邻k-ANN查询。前置条件一个正在运行的 Neo4j5.15实例。可以使用以下选项Docker 镜像Neo4j DesktopNeo4j AuraNeo4j Server 实例如果需要需要为EmbeddingModel提供 API 密钥以生成由Neo4jVectorStore存储的嵌入。自动配置关于 Spring AI 自动配置和启动器模块的 artifact 名称有重大变更。请参阅升级说明以获取更多信息。Spring AI 为 Neo4j 向量存储提供了 Spring Boot 自动配置。要启用它请将以下依赖项添加到您项目的 Mavenpom.xml文件中dependencygroupIdorg.springframework.ai/groupIdartifactIdspring-ai-starter-vector-store-neo4j/artifactId/dependency或者添加到您的 Gradlebuild.gradle构建文件中。dependencies { implementation org.springframework.ai:spring-ai-starter-vector-store-neo4j }请参阅依赖管理部分将 Spring AI BOM 添加到您的构建文件中。请查看向量存储的配置属性列表以了解默认值和配置选项。请参阅工件仓库部分将 Maven Central 和/或 Snapshot 仓库添加到您的构建文件中。向量存储实现可以为您初始化所需的模式但您必须选择加入方法是在适当的构造函数中指定initializeSchema布尔值或者在application.properties文件中设置…​initialize-schematrue。这是一个破坏性变更在早期版本的 Spring AI 中此模式初始化是默认发生的。此外您还需要一个已配置的EmbeddingModelbean。请参阅嵌入模型部分以获取更多信息。现在您可以在应用程序中自动装配Neo4jVectorStore作为向量存储。AutowiredVectorStorevectorStore;// ...ListDocumentdocumentsList.of(newDocument(Spring AI rocks!! Spring AI rocks!! Spring AI rocks!! Spring AI rocks!! Spring AI rocks!!,Map.of(meta1,meta1)),newDocument(The World is Big and Salvation Lurks Around the Corner),newDocument(You walk forward facing the past and you turn back toward the future.,Map.of(meta2,meta2)));// 将文档添加到 Neo4jvectorStore.add(documents);// 检索与查询相似的文档ListDocumentresultsvectorStore.similaritySearch(SearchRequest.builder().query(Spring).topK(5).build());配置属性要连接到 Neo4j 并使用Neo4jVectorStore您需要为您的实例提供访问详细信息。可以通过 Spring Boot 的application.yml提供简单配置spring:neo4j:uri:neo4j 实例 URIauthentication:username:neo4j 用户名password:neo4j 密码ai:vectorstore:neo4j:initialize-schema:truedatabase-name:neo4jindex-name:custom-indexembedding-dimension:1536distance-type:cosine以spring.neo4j.*开头的 Spring Boot 属性用于配置 Neo4j 客户端属性描述默认值spring.neo4j.uri连接 Neo4j 实例的 URIneo4j://localhost:7687spring.neo4j.authentication.username用于 Neo4j 身份验证的用户名neo4jspring.neo4j.authentication.password用于 Neo4j 身份验证的密码-以spring.ai.vectorstore.neo4j.*开头的属性用于配置Neo4jVectorStore属性描述默认值spring.ai.vectorstore.neo4j.initialize-schema是否初始化所需的模式falsespring.ai.vectorstore.neo4j.database-name要使用的 Neo4j 数据库名称neo4jspring.ai.vectorstore.neo4j.index-name存储向量的索引名称spring-ai-document-indexspring.ai.vectorstore.neo4j.embedding-dimension向量的维度数1536spring.ai.vectorstore.neo4j.distance-type要使用的距离函数cosinespring.ai.vectorstore.neo4j.label用于文档节点的标签Documentspring.ai.vectorstore.neo4j.embedding-property用于存储嵌入的属性名称embedding以下距离函数可用cosine- 默认适用于大多数用例。衡量向量之间的余弦相似度。euclidean- 向量之间的欧几里得距离。值越低表示相似度越高。手动配置如果不使用 Spring Boot 自动配置您可以手动配置 Neo4j 向量存储。为此您需要将spring-ai-neo4j-store添加到您的项目中dependencygroupIdorg.springframework.ai/groupIdartifactIdspring-ai-neo4j-store/artifactId/dependency或者添加到您的 Gradlebuild.gradle构建文件中。dependencies { implementation org.springframework.ai:spring-ai-neo4j-store }请参阅依赖管理部分将 Spring AI BOM 添加到您的构建文件中。创建一个 Neo4j Driver bean。请阅读 Neo4j 文档以获取有关自定义驱动程序配置的更深入信息。BeanpublicDriverdriver(){returnGraphDatabase.driver(neo4j://host:bolt-port,AuthTokens.basic(username,password));}然后使用构建器模式创建Neo4jVectorStorebeanBeanpublicVectorStorevectorStore(Driverdriver,EmbeddingModelembeddingModel){returnNeo4jVectorStore.builder(driver,embeddingModel).databaseName(neo4j)// 可选默认为 neo4j.distanceType(Neo4jDistanceType.COSINE)// 可选默认为 COSINE.embeddingDimension(1536)// 可选默认为 1536.label(Document)// 可选默认为 Document.embeddingProperty(embedding)// 可选默认为 embedding.indexName(custom-index)// 可选默认为 spring-ai-document-index.initializeSchema(true)// 可选默认为 false.batchingStrategy(newTokenCountBatchingStrategy())// 可选默认为 TokenCountBatchingStrategy.build();}// 这可以是任何 EmbeddingModel 实现BeanpublicEmbeddingModelembeddingModel(){returnnewOpenAiEmbeddingModel(OpenAiEmbeddingOptions.builder().apiKey(System.getenv(OPENAI_API_KEY)).build());}元数据过滤您也可以将通用的、可移植的元数据过滤器与 Neo4j 存储一起使用。例如您可以使用文本表达式语言vectorStore.similaritySearch(SearchRequest.builder().query(The World).topK(TOP_K).similarityThreshold(SIMILARITY_THRESHOLD).filterExpression(author in [john, jill] article_type blog).build());或者使用Filter.ExpressionDSL 以编程方式FilterExpressionBuilderbnewFilterExpressionBuilder();vectorStore.similaritySearch(SearchRequest.builder().query(The World).topK(TOP_K).similarityThreshold(SIMILARITY_THRESHOLD).filterExpression(b.and(b.in(author,john,jill),b.eq(article_type,blog)).build()).build());这些可移植的过滤器表达式会自动转换为专有的 Neo4jWHERE过滤器表达式。例如这个可移植的过滤器表达式author in [john, jill] article_type blog被转换为专有的 Neo4j 过滤器格式node.metadata.author IN [john,jill] AND node.metadata.article_type blog访问原生客户端Neo4j 向量存储实现通过getNativeClient()方法提供对底层原生 Neo4j 客户端Driver的访问Neo4jVectorStorevectorStorecontext.getBean(Neo4jVectorStore.class);OptionalDrivernativeClientvectorStore.getNativeClient();if(nativeClient.isPresent()){DriverdrivernativeClient.get();// 使用原生客户端执行 Neo4j 特定操作}原生客户端使您能够访问可能未通过VectorStore接口公开的 Neo4j 特定功能和操作。