升级Neo4j v5.9.0后Cypher DSL方言配置未生效仍报id警告
id函数弃用警告的问题 问题背景
升级至Neo4j v5.9.0后,已按文档建议创建配置强制使用Neo4j v5方言,但使用Repository查询时,仍频繁出现id函数的弃用警告。
已配置的代码
import org.neo4j.cypherdsl.core.renderer.Dialect import org.springframework.context.annotation.Bean import org.springframework.context.annotation.Configuration import org.neo4j.cypherdsl.core.renderer.Configuration as CypherConfiguration @Configuration class Neo4jConfiguration { @Bean fun cypherDslConfiguration(): CypherConfiguration = CypherConfiguration.newConfig().withDialect(Dialect.NEO4J_5).build() }
Spring Actuator验证结果
通过Spring Actuator确认该配置Bean已成功加载:
"cypherDslConfiguration": { "aliases": [], "scope": "singleton", "type": "org.neo4j.cypherdsl.core.renderer.Configuration", "resource": "class path resource [com/foo/infra/neo4j/Neo4jConfiguration.class]", "dependencies": [ "neo4jConfiguration" ] }
出现的警告信息
Neo.ClientNotification.Statement.FeatureDeprecationWarning: This feature is deprecated and will be removed in future versions. UNWIND $__relationships__ AS relationship WITH relationship MATCH (startNode:`MyNode`) WHERE startNode.entityId = relationship.fromId MATCH (endNode) WHERE id(endNode) = relationship.toId MERGE (startNode)-[relProps:`BELONGS`]->(endNode) RETURN elementId(relProps) AS __elementId__ ^ The query used a deprecated function: `id`.
注:节点的entityId字段已标注@Id注解
相关依赖版本
- org.springframework.boot:spring-boot-starter-data-neo4j 3.1.2
- org.springframework.data:spring-data-neo4j 7.1.2
- kotlin 1.9.0
疑问
当前配置是否存在错误?或是还缺少其他必要配置?
解决方案
你的Cypher DSL配置本身没有问题,出现警告的核心原因是:Spring Data Neo4j(SDN)在处理关系绑定(如MERGE关联关系)时,部分内部生成的查询并未采用Cypher DSL的配置,而是直接使用了旧的id()函数匹配节点。
可尝试以下解决方式:
检查关系实体映射逻辑
确保关联关系的映射是通过@Node标注的实体对象实现,而非手动存储节点ID。若手动维护关系ID,SDN会回退到旧的id()函数语法。升级Spring Data Neo4j版本
SDN 7.1.x系列在Neo4j v5适配存在细节缺陷,建议升级至7.2.x及以上版本(对应Spring Boot 3.2.x),新版本已修复Cypher生成的兼容性问题,默认会用elementId()替代id()。自定义Repository查询(临时方案)
若暂时无法升级版本,可编写自定义Cypher语句,将id(endNode) = relationship.toId替换为elementId(endNode) = relationship.toId,规避SDN自动生成旧语法查询。对齐Neo4j驱动版本
确保使用的Neo4j Java驱动版本与服务器版本(v5.9.0)匹配,Spring Boot 3.1.2默认依赖的驱动版本可能需要调整,需保证驱动为v5.x系列的对应版本。
内容的提问来源于stack exchange,提问作者LeadingMoominExpert

