开发者学堂课程【SpringBoot 实战教程: SpringBoot 整合 Neo4j】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/651/detail/10811
SpringBoot 整合 Neo4j
1、查询在 springboot 中如何在 neo4j 中使用图形数据库,首先做相关依赖,以下是 springboot 提供的依赖,放入工程中,做好 web 依赖。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-neo4j</artifactId>
</dependency>
2、做全局属性配置,把以下放入全局配置中
配置文件中:
spring.data.neo4j.uri=http://localhost:7474
访问地址
spring.data.neo4j.username=neo4j
设置的用户名
spring.data.neo4j.password=123
密码
创建 application.properties。第一次访问 neo4j 时,用户名是 neo4j,密码是 neo4j,会让修改密码,修改后密码是123。
3、按照数据库的思想实现相应的功能,首先创建一个实体类,建一个包, com.qianteng.pojo。
4、在 neo4j 中,重点是节点和关系,在这里建立的实体类是节点对应的实体类以及关系所对应的实体类,在 com.qianteng.pojo 创建实体类,命名为 usernode。
除了定义属性,还需要定义 nodeid,存的时候是以图形的形式存的,把它作为图形id。
/ /表示的节点类型
@NodeEntity(label="User")节点所对应的实体类
public class
UserNode
{
会把这个类型存到neo
4
j数据库中
@GraphId
private Long nodeId;
//给用户配置属性,指明普通属性
@Property
Private
String userId;
@Property
private String name;
@Property
Private
Int
age ;
//生成 get,set 方法
public Long getNodeId ()
{
Return
nodeId;
}
public void setAge (int age)
{
this.age = age;
}
5、创建关系类型,UserRelation。
表示用户与用户的关系,在存的时候也是用图形方式存的,所以要有图形 id,表示关系必须是两个用户的关系。
package com. qianfeng.pojo;
import org. neo4j . ogm. annotation . GraphId;
public class UserRelation
{
@GraphId
Private
Long
id;
private UserNode
startNode;
起始类型
private UserNode endNode;
结束类型
}
比如 tim 和 jack,jack 认识 tim,tim 是 jack 的朋友,jack 的节点就是用户节点,jack相当于起始节点,tim 相当于用户节点,tim 和 lili,tim 是起始节点,lili是结束节点,表示关系必须是两个用户,所以要定义两 个节点类型。
package com. qianfeng .pojo;
import org. neo4j . ogm. annotation. EndNode;
import org.neo4j .ogm. annotation. GraphId;
import org.neo4j .ogm. annotation. StartNode;
@RelationshipEntity (type="UserRelation")
把关系存储到数据库中,用户和用户之间的别名,当两个用户在建立关系时就用这个名字
public class UserRelation
{
表示关系实体类
@GraphId
private Long
id;
@StartNode
private UserNode startNode;
@EndNode
private UserNode endNode ;
}
//生成set,get方法
Public
Long getId ()
return
id;
public void setId (Long id)
{
this.id=:id;
}
public UserNode getStartNode ()
{
return startNode;
}
public void
setStartNode (UserNode startNode)
{
this . startNode = startNode ;
}
public UserNode get EndNode ()
{
return endNode ;
}
public void setEndNode (UserNode endNode)
{
this . endNode = endNode ;
}
6、创建 dao,com.qianfeng.dao,也可以是 mapper,相当于操作数据库的第 dao 层。
添加节点,建立节点和节点之间的关系,或者查询节点。查询节点就是查询用户,或者查询什么关系等等。这里只需要写接口,不需要写实现,类似于 jpa,写操作节点的 dao,命名为 UserRepository。
需要让它继承 GraphRepository,这个类型就是节点类型,那么增删改查的功能在这里都已经实现了。
package com.qianfeng .dao;
import org. spring framework.data .neo4j . reposi tory .GraphRepository;
import com. qianfeng .pojo. UserNode ;
@Component
Public
interface
UserRepository
extends
GraphRepository<UserNode>{
接口
@Query("MATCH(n:User)RETURN
n")
return 用 n 代表返回
List<UserNode>
getUserNodeList();
查询用户节点
@Query("create(n:User{age:{age},name:{name}})
RETURN
n")
List<UserNode>addUserNodeList(@Param("name")String
name
添加节点,创建新用户,要指定属性对应的值
@Param("age")intage);
}
7、创建接口,命名为 UserRelationRepository,用户关系
package com. qianfeng .dao;
import org. springframework .data.neo4j . repository . GraphRepository;
import com. qianfeng.pojo.UserRelation;
public interface UserRe lationRepository extends
GraphReposi tory<
UserRelation>
//增删改查的方法
@Component
创建 dao 对象
Public
interface
UserRelationRepository
extends
GraphRepository
<UserRelation>{
@Query("matchp=(n:User)<-[r:UserRelation]->(n1:User)where
n.userId={firstUserId}andn1.userId={secondUserId}returnp")
List<UserRelation>
findUserRelationByEachId(@Param("firstUserId")StringfirstUserId,@Param("secondUserId")StringsecondUserId);
@Query("match(fu:User),(su:User)wherefu.userId={firstUserId}
andsu.userId={secondUserId}createp=(fu)-[r:UserRelation]->(su)
returnp")
查询两个用户之间的关系,还有查询条件,有两个用户,一个n,一个n1,指定了要查询用户的id,所以要接收两个值,一个是左边用户的id值,一个是右边用户的id值List<UserRelation>addUserRelation(@Param("firstUserId")StringfirstUserId,@Param("secondUserId")StringsecondUserId);
添加关系,给相应 id 的用户建立两个关系
8、com.qianteng.service
UserService
写一个添加用户的功能。添加关系也一样。
package com. qianfeng. service;
import org. springframework . beans. factory . annotation . Autowired;
import org . springframework. stereotype .Service;
import com. qianfeng. dao. UserRepository;
@Service
public class UserService
{
@Autowired
private UserRepository userRepository;
public void addUserNode (UserNode
userNode)
添加用户
,
相当于用户节点
{
userRepository . addUserNodeList (userNode .getName () , userNode.getAge() ) ;
}
}
9、创建 controller,命名为 Neo4jController
加注解,调用 service。注入,写入一个功能,保存用户节点。
package com. qianfeng. controller;
import org. springframework .beans . factory . annotation. Autowired;
import org. springframework. stereotype . Controller;
import org. springframework . web .bind. annotation. Reques tMapping;
import com. qianfeng. service . UserService;
@Controller
public class Neo4jController {
@Autowired
private UserService userService;
@RequestMapping ("/ saveUser")
@ ResponseBody
public String saveUserNode ()
{
UserNode node=new UserNode () ;
node . setNodeId(11) ;
node . setUserId("666") ;
node . setName ("'
张三
") ;
node.setAge (25) ;
userService . addUserNode (node) ;
return " success";
}
10、扫描 service 和 controller,都是以 com.qianfeng 为基础。
@SpringBootApplication ( scanBasePackages="com.qi anfeng")
扫描 dao。
@EnableNeo4jRepositories(basePackages="com.qianfeng.dao"
)
扫描是实体类。
@EntityScan (basePackages="com. qianfeng .pojo"
)
11、访问 controller,实现张三用户节点。启动。输入localhost:8080/saveUser
。
成功说明用户节点已经被添加到 neo4j 数据库。用 Cypher 语句查询,在UserRepository.java 中 MATCH(n: User ) RETURN
n
。可以看见张三,都是以图形的方式存储的。