相关文章推荐
兴奋的口罩  ·  svm ...·  6 月前    · 
开朗的茄子  ·  Recyclerview的notifyIte ...·  7 月前    · 
成熟的饭盒  ·  js findIndex ...·  9 月前    · 
率性的黄瓜  ·  linux - Google Cloud ...·  1 年前    · 

本文在 访问Neo4j spring-data-neo4j入门 (一) 基础上成文,因此请先阅读 访问Neo4j spring-data-neo4j入门 (一)

我们在上一篇提到使用@Query完成复杂查询,如同我们的业务一样,使用简单的比较大小、日期范围无法完成业务需要,特别是当我们需要在多个关系中进行查询时,返回的对象也需要包括关联的内容。例如返回Movie的所有参演者,就需要Person对象的name等信息。因此返回的对象也不再是简单的domain对象,而是复杂的组合对象。笔者这里以Person为例。实际中可以使用map等。

我们只需要在自己的Repository实现类上完成@Query注解即可。

public interface PersonRepository extends Neo4jRepository<Person, Long> , CustomizedRepository<Person> {
	Person findByfirstName(@Param("firstName") String firstName);
	Collection<Person> findByfirstNameLike(@Param("firstName") String firstName);
	// returns a Page of Actors that have a ACTS_IN relationship to the movie node with the title equal to movieTitle parameter.
	@Query(value = "MATCH (movie:Movie {title:{0}})<-[:ACTED_IN]-(p:Person) RETURN p",
			countQuery= "MATCH (movie:Movie {title:{0}})<-[:ACTED_IN]-(p:Person) RETURN count(p)")
	Page<Person> getActorsThatActInAmoviesFromTitle(String movieTitle, Pageable pageable );

我们可以看到需要传入的参数主要是movieTitle, 然后他作为{0}会在MATCH (movie:Movie {title:{0}})<-[:ACTED_IN]-(p:Person) RETURN p中使用到。 因为我们使用Pageable 对象,因此需要提供计算count的cypher

完成的代码在这里`,欢迎加星,fork,注意我的代码中有CustomizedRepositoryImpl这个是我为了做其他demo添加的, 使用@Query注解不需要该类. 你可以把CustomizedRepository删除了。
在这里插入图片描述

分页效果
注意,一定要配置好@Query中的countQuery部分,负责计算分页可能失败或者无法达到预期效果
在这里插入图片描述

public interface BaseNodeRepository extends Neo4jRepository<BaseNode, Long> { @Query("MATCH (n) WHERE n.name =~ ('.*'+$name+'.*') RETURN n") List<BaseNode> findBaseNodeByNameLike(String name); 返回各种各样的node哈哈,如果对诸君有帮助,随手点个赞哦!... 前两篇文章Springboot+Neo4j 初级框架搭建(一),Springboot+Neo4j 初级增删改查()我们介绍了Springboot集成Neo4j,以及Neo4j单节点的操作。本篇文章我们就来写写节点与节点中关系的操作!!!话不多说直接开干。在上篇文章中,我们以公司为例子做了演示,本篇文章我们还是以公司和产品为示例演示。在生活中公司和产品有很多种关系,比如苹果是一个公司,iPhone12是一个产品,苹果和iPhone12就是一个生产的关系。我们就以这样一个简单的例子来做一个增删改查的操作我可能 对于MATCH和OPTTNAL MATCH, WHERE为模式增加约束, 它不能看作是匹配完成后的结果过滤。这个查询会返回 Tom Hanks 在 2000 年之后参演过的电影。这个查询会返回在 2000 年到 2010 年之间发布的电影的标题。这个查询会返回姓名中包含 "smith"(不区分大小写)的所有人。这个查询会匹配年龄大于 25 岁的所有人,并返回他们的姓名。这个查询会返回姓名中包含 "John" 的所有人。这个查询会返回那些有年龄属性的人的姓名。这个查询会返回年龄属性为空的人的姓名。 Neo4J 安装,Neo4J 常见语句操作,Neo4J 项目中的集成应用,Neo4J 复杂查询(@Query注解和自定义Match,多条件分页查询&结点、关系组合查询等) 接着上一篇讲       上一篇我们学习了如何创建节点,以及查询节点,但未涉及者之间的关系relationship,本篇,我们将通过简单的案列来完整的走一遍整个节点--关系--节点的流程,为了降低复杂度,关系是(1...n)单向的,也就是默认关系是Out出去的。一、场景节点Nodes:1.创建一个Coder类型的节点,代表程序员,属性有id,name,sex,hobby(姓名,性别,爱好)2.创 通过{}来替换字符串中的值,很多人都这么写的,而我就不行,总给我报错,说语法不对。于是我问了一个好心的大佬,告诉我说不要用{},而是用' '单引号,我信了,果然没报错。首先neo4j整合成功,然后可以通过自带的新增,删除,查询方法,做一些简单的操作,但当你想做一个自定义查询的时候就得在Dao层编写方法,就在这里。于是乎,我又找到一个博主,终于解答了我的疑惑,我们可以用$符来替换值,就比如上面那个例子,不用{},也不用' ',而是直接用$name就ok了。最后还是没能解决,不想找了,妥协了。 2.1、配置文件 Pom文件中引入依赖 Spring生态中Spring-data部分不仅仅提供了Spring-data-jpa , 也提供了Spring-data-neo4j 支持springneo4j的完美融合,pom.xml 文件中依赖如图 <dependency> <groupId>org.springframework.boot</groupId> 使用spirng-data-neo4j中的手写query,因为有些地方的语法比较复杂一直纠结返回数据的结构,一直用list 和 map拼,后来发现内置有一个Result类 import org.springframework.data.neo4j.annotation.Query; import org.springframework.data.neo4j.repository.Neo4jRepository; import org.springframework.stereotype.Rep. match ()-[r:logicRelation]->() where r.logicDevRelationId={logicDevRelationId} set r.name = {name},r.fromPort = {fromPort},r.toPort = {toPort},r.status={status},r.type= {type} retur... SDN中Repository的使用 最近在学习Neo4j,同时使用SpringBoot+SDN开发新的项目 因为以前一直用SpringBoot+MyBatisPlus,发现类似MyBatis的DAO的Repository并不像MyBatis用起来方便,以及之前没有用过所以很多地方不太会用 比如平时用MyBatis时,我们传入DAO接口的都是一个对象,通过对象属性来传递参数 但Repository中... @RequestMapping(value="/testRequestMapping", method={RequestMethod.POST}, params = {"use...     Cypher命令:  节点模式的构成:(Variable:Lable1:Lable2{Key1:Value1,Key2,Value2}),实际上,每个节点都有一个整数ID,在创建新的节点时,Neo4j自动为节点设置ID值,在整个数据库中,节点的ID值是递增的和唯一的。 下面的Cypher查询创建一个节点,标签是Industry,具有两个属性... 提到spring boot整合Neo4j,一般都会提到spring-data-neo4j,使用类似于jpa的方式,使用entity去maintain,但是如果想要添加动态关系或者动态的node,就算是@Query也是不够用了 使用OGM 其实这个包也被spring-data-neo4j引入了,所以不必要单独引入 import org.neo4j.ogm.session.Session; import org.neo4j.ogm.session.SessionFactory; import org.s. JPA实际上就是Hibernate 的封装,根据Interface方法名,生成对应的方法,也支持Query注解的方式。现在说说执行原生SQL 。注解@Query方式执行原生SQL语句:@Query(value="select user.id from user where user.id =15", nativeQuery = true)public User queryByI...