在上几篇的文章中,基于Springboot+Neo4j搭建了框架,做了一些节点与关系的常用操作。实际开发中还是会遇到一些问题,比如从Neo4j查询的数据如何转化成我们需要的结果?定义的Dto怎么接收到查询的结果呢?今天就来讲讲如何返回自定义的结果。
还是以公司生产产品为例子。第一种返回方式:关系对象,节点对象。这种返回方式就是把定义的关系类和节点类直接作为接收对象返回。
首先定义model里两个类:公司节点类(CompanyEntryNode),生产关系类(ProductionRelationship)
@NodeEntity(label = "CompanyEntry")
@Data
public class CompanyEntryNode {
private String companyEntryId;
/\*\*
\* 模板id
private String templateId;
/\*\*
\* 名称
private String name;
/\*\*
\* 类型
private String type;
/\*\*
\* 别名
private String aliasName;
生产关系类(ProductionRelationship)
@Data
@RelationshipEntity(type = "Production")
public class ProductionRelationship {
private String uuid;
@StartNode
private CompanyEntryNode startNode;
@EndNode
private ProductEntryNode endNode;
/\*\*
\* 创建关系词条的关系词条名称,例如:阿博茨公司 生产 产业链图谱
private String relationEntryName;
/\*\*
\* 名称
private String name;
/\*\*
\* 别名
private String aliasName;
/\*\*
\* 简介
private String introduction;
在公司的dao层就直接返回CompanyEntryNode就行了
@Repository
public interface CompanyEntryRepository extends Neo4jRepository<CompanyEntryNode, String> {
/\*\*
\* 通过名称查询公司
\* @param name
\* @return
@Query("match (c:CompanyEntry) where c.name={name} return c")
CompanyEntryNode getEntryByName(String name);
同时在生产关系的dao层直接返回ProductionRelationship,这里需要注意的是我在match查询时定义了一个productionRelationship 返回所有的查询结果,这样做的目的是把ProductionRelationshipg关系中的开始节点@StartNode和结束节点@EndNode也都返回了出来。
@Repository
public interface ProductionRelationshipRepository extends Neo4jRepository<ProductionRelationship, String> {
\* 通过公司词条id和产品词条id 查询 ProductionRelationship
\* @param companyEntryId 公司词条id
\* @param productEntryId 产品词条id
\* @param relationName 关系类型名称
\* @return ProductionRelationship
@Query("MATCH productionRelationship = (c:CompanyEntry)-\[r\]->(p:ProductEntry) " +
"where type(r) = {relationName} " +
"and c.companyEntryId={companyEntryId} " +
"and p.productEntryId = {productEntryId}" +
"return productionRelationship ")
ProductionRelationship findProductionRelationship(String companyEntryId, String productEntryId, String relationName);
查询生产关系的controller结果如下
这种结果包含了开始节点与结束节点的信息,如果不想要这些信息,只想定义一个Dto返回生产关系的属性信息。那该怎么做呢?这就用到了第二种接收方式-自定义类。这种定义方式就是只关心定义的信息。先在Dto定义一个类RelationshipDto ,这里要注意,我们用到了注解@QueryResult,他代表了Neo4j查询结果返回的类,这个注解不加的话会接收不到返回数据。
@Data
@QueryResult
public class RelationshipDto {
/\*\*
\* 关系uuid
private String uuid;
/\*\*
\* 产品名称
private String productName;
/\*\*
\* 产品uuid
private String productEntryId;
/\*\*
\* 收入占比
private String incomeProportion;
接着我们到dao层定义返回一个集合结果List ,并且对应的值都要像 r.uuid as uuid这样单独的重命名下。这样自定义返回结果就OK了。
@Repository
public interface ProductionRelationshipRepository extends Neo4jRepository<ProductionRelationship, String> {
\* 通过公司词条id和产品词条id 查询 ProductionRelationship
\* @param companyEntryId 公司词条id
\* @param productEntryId 产品词条id
\* @param relationName 关系类型名称
\* @return ProductionRelationship
@Query("MATCH (c:CompanyEntry)-\[r\]->(p:ProductEntry) " +
"where type(r) = {relationName} " +
"and c.companyEntryId={companyEntryId} " +
"and p.productEntryId = {productEntryId}" +
"return r.uuid as uuid,p.name as productName,p.productEntryId as productEntryId")
List<RelationshipEntryDto> findRelationship(String companyEntryId, String productEntryId, String relationName);
我们controller层请求返回结果
两种自定义返回结果就讲完了,当然我们也可以返回单独的boolean类型,String类型等结果就不说了。
彩蛋下期文章开始我们谈谈Neo4j基于Lucene的搜索,以及用Neo4j做语义搜索等内容。
- 本期完 -
有疑问请点赞哈,我会及时回复。由于微信限制了公众号留言功能,有问题你可以直接发公众号聊天,我会在下期末尾解答问题。
为方便看最新内容,记得关注哦!
在上几篇的文章中,基于Springboot+Neo4j搭建了框架,做了一些节点与关系的常用操作。实际开发中还是会遇到一些问题,比如从Neo4j查询的数据如何转化成我们需要的结果?定义的Dto怎么接收到查询的结果呢?今天就来讲讲如何返回自定义的结果。还是以公司生产产品为例子。第一种返回方式:关系对象,节点对象。这种返回方式就是把定义的关系类和节点类直接作为接收对象返回。首先定义model里两个类:公司节点类(CompanyEntryNode),生产关系类(ProductionRelationship)@Nod
本资源中的源码都是经过本地编译过可运行的,下载后按照文档配置好环境就可以运行。资源项目的难度比较适中,内容都是经过助教老师审定过的,应该能够满足学习、使用需求,如果有需要的话可以放心下载使用。有任何问题也可以随时私信博主,博主会第一时间给您解答!!!
本资源中的源码都是经过本地编译过可运行的,下载后按照文档配置好环境就可以运行。资源项目的难度比较适中,内容都是经过助教老师审定过的,应该能够满足学习、使用需求,如果有需要的话可以放心下载使用。有任何问题也可以随时私信博主,博主会第一时间给您解答!!!
本资源中的源码都是经过本地编译过可运行的,下载后按照文档配置好环境就可以运行。资源项目的难度比较适中,内容都是经过助教老师审定过的,应该能够满足学习、使用需求,如果有需要的话可以放心下载使用。有任何问题也可以随时私信博主,博主会第一时间给您解答!!!
本资源中的源码都是经过本地编译过可运行的,下载后按照文档配置好环境就可以运行。资源项目的难度比较适中,内容都是经过助教老师审定过的,应该能够满足学习、使用需求,如果有需要的话可以放心下载使用。有任何问题也可以随时私信博主,博主会第一时间给您解答!!!
本资源中的源码都是经过本地编译过可运行的,下载后按照文档配置好环境就可以运行。资源项目的难度比较适中,内容都是经过助教老师审定过的,应该能够满足学习、使用需求,如果有需要的话可以放心下载使用。有任何问题也可以随时私信博主,博主会第一时间给您解答!!!
本资源中的源码都是经过本地编译过可运行的,下载后按照文档配置好环境就可以运行。资源项目的难度比较适中,内容都是经过助教老师审定过的,应该能够满足学习、使用需求,如果有需要的话可以放心下载使用。有任何问题也可以随时私信博主,博主会第一时间给您解答!!!
使用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.
SDN中Repository的使用
最近在学习Neo4j,同时使用SpringBoot+SDN开发新的项目
因为以前一直用SpringBoot+MyBatisPlus,发现类似MyBatis的DAO的Repository并不像MyBatis用起来方便,以及之前没有用过所以很多地方不太会用
比如平时用MyBatis时,我们传入DAO接口的都是一个对象,通过对象属性来传递参数
但Repository中...
application.properties
spring.neo4j.uri=neo4j://localhost:7687
spring.neo4j.authentication.username=neo4j
spring.neo4j.authentication.password=neo4j
spring.dat
<groupId>org.neo4j.driver</groupId>
<artifactId>neo4j-java-driver</artifactId>
<version>4.2.1</version>
</dependency>
2. 配置neo4j连接信息
在application.yml文件中添加neo4j连接信息:
spring:
data:
neo4j:
uri: bolt://localhost:7687
username: neo4j
password: neo4j
3. 创建实体类
创建需要存储到neo4j中的实体类,并添加@NodeEntity注解,示例代码如下:
@NodeEntity
public class Person {
@GeneratedValue
private Long id;
private String name;
public Person(String name) {
this.name = name;
// getter and setter
4. 创建Repository
创建Repository接口,继承Neo4jRepository,示例代码如下:
@Repository
public interface PersonRepository extends Neo4jRepository<Person, Long> {
5. 测试
在测试类中注入PersonRepository,进行CRUD操作,示例代码如下:
@SpringBootTest
class Neo4jTest {
@Autowired
private PersonRepository personRepository;
@Test
public void test() {
Person person = new Person("Tom");
personRepository.save(person);
Person savedPerson = personRepository.findById(person.getId()).get();
System.out.println(savedPerson.getName());
personRepository.deleteAll();
运行测试,如果能够正常输出“Tom”,则说明neo4j集成成功。