一、项目创建

新建springboot项目,项目结构如下:
在这里插入图片描述
(1)结构说明:
controller:控制层;
service:服务层;
config:项目配置类
dao: 关系数据库对应的实体类;
entity:与图数据库对应的节点类;
repository:节点类对应的仓库类,使用jpa,实现neo4j的相关操作
mapper:操作关系数据库、mybatis的映射文件
utils:工具类

(2)springboot版本:2.6.3

<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>2.6.3</version>
		<relativePath/> <!-- lookup parent from repository -->
</parent>

二、配置

2.1 POM中Neo4j依赖配置:

<dependencies>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-data-neo4j</artifactId>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>
		<dependency>
			<groupId>org.mybatis.spring.boot</groupId>
			<artifactId>mybatis-spring-boot-starter</artifactId>
			<version>2.2.1</version>
		</dependency>
		<dependency>
			<groupId>org.springframework.experimental</groupId>
			<artifactId>spring-native</artifactId>
			<version>${spring-native.version}</version>
		</dependency>
		<dependency>
			<groupId>org.springframework.session</groupId>
			<artifactId>spring-session-core</artifactId>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-devtools</artifactId>
			<scope>runtime</scope>
			<optional>true</optional>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-configuration-processor</artifactId>
			<optional>true</optional>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
			<scope>test</scope>
		</dependency>
		<dependency>
			<groupId>org.projectlombok</groupId>
			<artifactId>lombok</artifactId>
			<optional>true</optional>
		</dependency>
		<!--postgresql相关配置-->
		<dependency>
			<groupId>org.postgresql</groupId>
			<artifactId>postgresql</artifactId>
			<scope>runtime</scope>
		</dependency>
		<!--neo4j相关配置-->
		<dependency>
			<groupId>org.neo4j.driver</groupId>
			<artifactId>neo4j-java-driver</artifactId>
			<version>4.4.2</version>
		</dependency>
		<dependency>
			<groupId>org.neo4j</groupId>
			<artifactId>neo4j-ogm-embedded-driver</artifactId>
			<version>3.2.28</version>
			<exclusions>
				<exclusion>
					<artifactId>classgraph</artifactId>
					<groupId>io.github.classgraph</groupId>
				</exclusion>
			</exclusions>
			<!--	<scope>test</scope>-->
		</dependency>
	</dependencies>

2.2 application.properties文件配置:

# neo4j config
spring.data.neo4j.open-in-view=false
spring.data.neo4j.uri= bolt://localhost:7687
spring.data.neo4j.username=neo4j
spring.data.neo4j.password=neo4j

三、使用

以创建一个开发者和所属部门关系为例
3.1 实体类创建
使用jpa自动构建实体,减少代码量,需要lombok包

import lombok.Data;
import org.neo4j.ogm.annotation.NodeEntity;
import org.springframework.data.neo4j.core.schema.GeneratedValue;
import org.springframework.data.neo4j.core.schema.Id;
import org.springframework.data.neo4j.core.schema.Property;

import java.io.Serializable;

/**
 * 开发者实体类
 */
@Data
@NodeEntity(label = "Developer")
public class Developer implements Serializable {

    @Id
    @GeneratedValue
    private Long id;
    @Property
    private String name;

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}
import lombok.Data;
import org.neo4j.ogm.annotation.NodeEntity;
import org.springframework.data.neo4j.core.schema.GeneratedValue;
import org.springframework.data.neo4j.core.schema.Id;
import org.springframework.data.neo4j.core.schema.Property;

import java.io.Serializable;


/**
 * 部门实体类
 */
@Data
@NodeEntity(label = "Department")
public class Department implements Serializable {

    @Id
    @GeneratedValue
    private Long id;
    @Property
    private String name;
    private Long DepartmentId;

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Long getDepartmentId() {
        return DepartmentId;
    }

    public void setDepartmentId(Long departmentId) {
        DepartmentId = departmentId;
    }
}

3.3 repository映射类创建:
(1) Developer对应的仓库类

import com.Demo.neo4j.entity.Developer;
import org.springframework.data.neo4j.repository.Neo4jRepository;
import org.springframework.data.neo4j.repository.query.Query;
import org.springframework.data.repository.query.Param;
import org.springframework.stereotype.Repository;

import java.util.List;

@Repository
public interface DeveloperRepository extends Neo4jRepository<Developer,Long> {
    /**
     * 获取开发者节点集合
     * @return
     */
    @Query("MATCH (n:Developer) RETURN n ")
    List<Developer> getDeveloperList();

    /**
     * 创建开发者节点
     * @param name
     * @return
     */
    @Query("create (n:Developer{name:{name}}) RETURN n")
    List<Developer> addDeveloperList(@Param("name") String name);
}

(2) Department对应的仓库类

import com.chinadci.neo4j.dao.entity.Department;
import org.springframework.data.neo4j.repository.Neo4jRepository;
import org.springframework.data.neo4j.repository.query.Query;
import org.springframework.data.repository.query.Param;

public interface DepartmentRepository extends Neo4jRepository<Department,Long> {

    @Query("MATCH (d:Department) WHERE d.name = $name return d")
    Department findDepartmentByName(@Param("name") String name);

    /**
     * 自定义创建developer与department间关系的方法
     * @param person
     * @param department
     */
    @Query("MATCH (p:Person{name:$person}),(d:Department{name:$department}) with p,d"
            + " CREATE (p)-[r:RELATION{name:'BelongTo'}]->(d)")
    void createPToDRel(@Param("person") String person,@Param("department") String department);
}

3.4 Controller层代码:

@ApiOperation(value = "实体创建")
@RequestMapping(value = "/createGraphData",method = RequestMethod.POST)
    public ServiceResult createGraphData(
            @RequestParam(name = "label") @ApiParam(value = "创建节点所属标签",required = true) String label,
            @RequestParam(name = "name") @ApiParam(value = "创建节点名称",required = true) String name
    ){
        return graphDbService.createGraphData(label,name);
    }

3.5 Service层代码:
方式一:通过repository自带save方式创建

public ServiceResult createGraphData(String label, String name){
        List res = new ArrayList();
        try{
            Developer developer = new Developer();
            developer.setName(name);
            developerRepository.save(developer);
            res.add(developer);
        }catch (Exception e){
            return new ServiceResult(ServiceResult.ServiceErrorCode.UNKNOWN_ERROR, e.getMessage());
        }
        return new ServiceResult(res);
    }

方式二:
通过repository中自定义的addDeveloperList方法创建:

public ServiceResult createGraphData2(String label, String name){
        List res = new ArrayList();
        try{
            Developer developer = new Developer();
            developer.setName(name);
            developerRepository.addDeveloperList(name);
            res.add(developer);
        }catch (Exception e){
            return new ServiceResult(ServiceResult.ServiceErrorCode.UNKNOWN_ERROR, e.getMessage());
        }
        return new ServiceResult(res);
    }

service层调用DepartmentRepository中方法实现关系创建:

 departmentRepository.createPToDRel("小慧","研发中心");

结果示例:
在这里插入图片描述

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐