开发环境

  1. springboot 2.6.8
<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-data-neo4j</artifactId>
</dependency>

2.neo4j 数据库版本5.10.0

开始填坑

1.注解的坑

在网上看了好多整合示例,但是太老了。5.0用的人比较少,因此注解等差异较大(4.x 和5.0)。比如@NodeEntity在我的版本就没有,作为替代的是@Node 。给大家一个建议,遇到问题10分钟(最多20分钟)内百度不出来答案就去看官方文档。
文档地址: https://neo4j.com/docs/java-manual/current/

2.自定义查询语句动态参数的坑

我想实现给两个任意节点创建关系的通用接口,编写了下面语句:

/**
 * 创建任意两个节点关系(fromNodeId -> relation -> toNodeId)
 * @param fromNodeId 源节点id
 * @param toNodeId 目标节点id
 * @param relation 关系
 */
@Query("match (a),(b) where id(a)= $fromNodeId and id(b)= $toNodeId merge (a)-[: $relation]->(b)")
void createRelationShip(@Param("fromNodeId") Long fromNodeId, @Param("toNodeId") Long toNodeId, @Param("relation") String relation);

在百度上百度了半天,各种参数赋值都写了,就是参数三(relation)始终有各种报错,最后去官方文档里面转悠了半天,终于找到了正确姿势,接下来看正确的姿势:

/**
 * 创建任意两个节点关系(fromNodeId -> relation -> toNodeId)
 * @param fromNodeId 源节点id
 * @param toNodeId 目标节点id
 * @param relation 关系
 */
@Query("match (a),(b) where id(a)= $fromNodeId and id(b)= $toNodeId merge (a)-[:`:#{literal(#relation)}`]->(b)")
void createRelationShip(@Param("fromNodeId") Long fromNodeId, @Param("toNodeId") Long toNodeId, @Param("relation") String relation);

为什么关系里面的赋值跟其他参数(fromNodeId,toNodeId)赋值不一样呢,来,看官网此问题官方的解释链接怎么说:

在这里插入图片描述
大概意思是:在自定义查询中要实现动态的标签或关系。因为标签和关系都不能在Cypher中参数化,即通过$参数值等方式是错误的赋值方式。要用到“literal”扩展才可以。:#{literal(#label)} 将会把你的动态参数还原成文本类型的参数值作为替换,实现动态传参的目的(我理解的,如有错误,请大神评论区指出)。

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐