Spring data neo4j 密码方言并非在任何地方都强制执行

Spring data neo4j cypher dialect is not enforced everywhere

提问人:LeadingMoominExpert 提问时间:8/10/2023 最后编辑:MattLeadingMoominExpert 更新时间:11/15/2023 访问量:143

问:

赏金将于明天到期。这个问题的答案有资格获得 +100 声望赏金。马特引起人们对这个问题的更多关注

升级到 Neo4j v5.9.0 时,我尝试通过创建以下配置来强制执行 Neo4j v5 方言,如文档所示

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()
}

从弹簧执行器检查时,似乎存在以下 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

是否仍然缺少某些配置,或者我的 cypherDslConfiguration bean 不正确?

相关版本:

  • org.springframework.boot:spring-boot-starter-data-neo4j 3.1.2
  • org.springframework.data:spring-data-neo4j 7.1.2
  • Kotlin 1.9.0 版本
java spring-boot kotlin spring-data-neo4j

评论

1赞 meistermeier 8/10/2023
如果要在域类上定义 of 类型,它仍将使用该函数。@GeneratedValue@IdLongid
0赞 LeadingMoominExpert 8/14/2023
@meistermeier我没有定义,id 是字符串而不是长@GeneratedValue

答:

0赞 Anish B. 11/15/2023 #1

请阅读此 Spring Data Neo4j 7.1 发行说明。

从发行说明中:

Neo4j 5 引入了新的、更通用的内部标识符, 跨多个共享的 Neo4j 数据库安全工作。他们被称为 元素 id,可以使用 Cypher 函数进行检索。在此过程中,Cypher 函数得到了 荒废的。后者返回一个标识节点的长值,并且 关系。elementId(n)id(n)

我从他们的文档中了解到的内容以点的形式给出如下:

  • id()Neo4j 中的函数用于返回长整型值。

  • 由于该函数已被弃用,因此将不再支持返回类型为类型字段的数据模型。id()id

正确的数据模型应包含表示 id 的字段。@Id@GeneratedValue

例如:

@Node("model")
public class Model {

   @Id
   @GeneratedValue
   private String entityId;

   .......

}

请阅读上面的文档以获取更多信息。

评论

0赞 LeadingMoominExpert 11/16/2023
这有点令人困惑,因为文档指出 So @GeneratedValue 注释没有被描述为强制性的。docs.spring.io/spring-data/neo4j/docs/current/reference/html/......Each entity has to have an id. If you don’t have such a unique key, you can use the combination of @Id and @GeneratedValue to configure SDN to use Neo4j’s internal id.