开发环境
- 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)}
将会把你的动态参数还原成文本类型的参数值作为替换,实现动态传参的目的(我理解的,如有错误,请大神评论区指出)。