springboot集成neo4j

1.NEO4J简介

NEO4J,NoSql家族中的一员,最早发行的图形数据库,目前依然是主流图形数据库。优点是:图论的数据库实现,对各种图算法做了简易封装,使开发者不再关注于算法的具体实现,可以集中精力于业务的实现。采用java编写,社区版开源,企业版闭源。

2.传统关系型数据库与图形数据库的纠葛

上世纪软硬件的限制使oracle\mysql等一大批数据库应运而生,建立在集合论基础上实现的数据库,通过外键理论在实际上勉强完成了简单的关系。而最早的NEO4J等图形数据库还在开发者的肚子里,关系型数据库之名就这样被抢走了。

3.怎么把neo4j怎么集成到我们的程序中?

场景:A同学被老大安排开发一个关于社交关系的需求,根据A同学多年的开发经验,mysql是肯定做不了的(因为关系型数据库的数学基础是集合论,依靠外键来实现简单的关系,对于深层关系的查询递归将会慢到一个让人无法接受的程度)。百度一下,NEO4J——以图论为基础的数据库,就它了。开始百度怎么往项目中集成NEO4J,A同学发现一个看上去不错的demo,这么多人转发and不要脸的抄袭,应该不错,上去鼓捣一阵,最后发现:咦?怎么报错了,一模一样的啊;卧槽,这锤子不发maven依赖,版本用的不对啊......几小时就这么浪费了,还打击了自己的信心。

引入的方法有很多种,但是spring提供的办法绝对是最简单方便的。怎么看?当然是看官网提供的15min的案例,地址:https://spring.io/guides/gs/accessing-data-neo4j/。怎么找,看下面的截图。

4.集成步骤截图:

前置条件

1.电脑已正确安装maven、jdk、Eclipse|IDEA

(1)下载neo4j的window解压包。地址:https://neo4j.com/,下载下来的解压包如下:

(2)配置NEO4J_HOME的环境变量。

(3)安装neo4J的服务

cmd命令:

1.neo4j install-service

2.neo4j start

假如neo4j服务安装失败,也可以用以下命令启动:

neo4j.bat console

查看http://localhost:7474/browser/,账号和密码都是:neo4j,然后修改密码,进入如下页面:

(4)springboot集成neo4j,对比官网demo,下面就放我自己的代码上来:

1.pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.3.2.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.example</groupId>
    <artifactId>neo4j</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>neo4j</name>
    <description>Demo project for Spring neo4j</description>

    <properties>
        <java.version>1.8</java.version>
    </properties>

    <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-test</artifactId>
            <scope>test</scope>
            <exclusions>
                <exclusion>
                    <groupId>org.junit.vintage</groupId>
                    <artifactId>junit-vintage-engine</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

2.application.properties

spring.data.neo4j.uri=bolt://localhost:7687
spring.data.neo4j.username=neo4j
spring.data.neo4j.password=neo4j

3.Person实体类

package com.example.neo4j.entity;

import java.util.Collections;
import java.util.HashSet;
import java.util.Optional;
import java.util.Set;
import java.util.stream.Collectors;

import org.neo4j.ogm.annotation.GeneratedValue;
import org.neo4j.ogm.annotation.Id;
import org.neo4j.ogm.annotation.NodeEntity;
import org.neo4j.ogm.annotation.Relationship;

@NodeEntity
public class Person {

    @Id @GeneratedValue private Long id;

    private String name;

    private Person() {
        // Empty constructor required as of Neo4j API 2.0.5
    };

    public Person(String name) {
        this.name = name;
    }

    /**
     * Neo4j doesn't REALLY have bi-directional relationships. It just means when querying
     * to ignore the direction of the relationship.
     * https://dzone.com/articles/modelling-data-neo4j
     */
    @Relationship(type = "TEAMMATE", direction = Relationship.UNDIRECTED)
    public Set<Person> teammates;

    public void worksWith(Person person) {
        if (teammates == null) {
            teammates = new HashSet<>();
        }
        teammates.add(person);
    }

    public String toString() {

        return this.name + "'s teammates => "
                + Optional.ofNullable(this.teammates).orElse(
                Collections.emptySet()).stream()
                .map(Person::getName)
                .collect(Collectors.toList());
    }

    public String getName() {
        return name;
    }

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

4.dao层调用neo4j,jpa的方式:

package com.example.neo4j.repository;

import java.util.List;

import com.example.neo4j.entity.Person;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.neo4j.annotation.Query;
import org.springframework.data.neo4j.repository.Neo4jRepository;

public interface PersonRepository extends Neo4jRepository<Person, Long> {

    Person findByName(String name);

    List<Person> findByTeammatesName(String name);

    @Query(value = "match (Greg:Person) return Greg",
            countQuery= "match (Greg:Person) return count(Greg)")
    Page<Person> getActorsThatActInAmoviesFromTitle( Pageable pageable );

    @Query(value ="",countQuery = "")
    List<Person> getAllById();
}

5.springboot启动类

package com.example.neo4j;

import com.example.neo4j.entity.Person;
import com.example.neo4j.repository.PersonRepository;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.neo4j.repository.config.EnableNeo4jRepositories;

import java.util.Arrays;
import java.util.List;


@SpringBootApplication
@EnableNeo4jRepositories
public class Neo4jApplication {

    private final static Logger log = LoggerFactory.getLogger(Neo4jApplication.class);


    public static void main(String[] args) {
        SpringApplication.run(Neo4jApplication.class, args);
        System.exit(0);
    }

    @Bean
    CommandLineRunner demo(PersonRepository personRepository) {
        return args -> {

            personRepository.deleteAll();

            Person greg = new Person("Greg");
            Person roy = new Person("Roy");
            Person craig = new Person("Craig");

            List<Person> team = Arrays.asList(greg, roy, craig);

            log.info("Before linking up with Neo4j...");

            team.stream().forEach(person -> log.info("\t" + person.toString()));

            personRepository.save(greg);
            personRepository.save(roy);
            personRepository.save(craig);

            greg = personRepository.findByName(greg.getName());
            greg.worksWith(roy);
            greg.worksWith(craig);
            personRepository.save(greg);

            roy = personRepository.findByName(roy.getName());
            roy.worksWith(craig);
            // We already know that roy works with greg
            personRepository.save(roy);

            // We already know craig works with roy and greg

            log.info("Lookup each person by name...");
            team.stream().forEach(person -> log.info(
                    "\t" + personRepository.findByName(person.getName()).toString()));

            List<Person> teammates = personRepository.findByTeammatesName(greg.getName());
            log.info("The following have Greg as a teammate...");
            teammates.stream().forEach(person -> log.info("\t" + person.getName()));
            Page<Person> grag=personRepository.getActorsThatActInAmoviesFromTitle(PageRequest.of(0,5));
            log.info("\t" + grag);
        };
    }

}

6.启动截图

7.在neo4j控制台查询结果:

 

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
Spring Boot集成Neo4j需要进行以下步骤: 1. 添加依赖:在`pom.xml`文件中添加Neo4j的依赖。 ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-neo4j</artifactId> </dependency> ``` 2. 配置数据源:在`application.properties`文件中配置Neo4j的连接信息。 ```properties spring.data.neo4j.uri=bolt://localhost:7687 spring.data.neo4j.username=neo4j spring.data.neo4j.password=password ``` 3. 创建实体类:创建表示节点以及关系的实体类。 ```java @NodeEntity public class Person { @Id @GeneratedValue private Long id; private String name; // 省略getter和setter方法 } @RelationshipEntity(type = "FRIEND") public class Friendship { @Id @GeneratedValue private Long id; @StartNode private Person person1; @EndNode private Person person2; // 省略getter和setter方法 } ``` 4. 创建Repository:创建用于操作数据库的Repository接口。 ```java public interface PersonRepository extends Neo4jRepository<Person, Long> { // 自定义查询方法 } ``` 5. 使用Repository:在需要使用Neo4j的地方注入Repository,进行CRUD操作。 ```java @Service public class PersonService { private final PersonRepository personRepository; public PersonService(PersonRepository personRepository) { this.personRepository = personRepository; } public void savePerson(Person person) { personRepository.save(person); } // 其他操作方法 } ``` 这样就完成了Spring BootNeo4j集成。你可以根据需要自定义Repository的方法,也可以使用Spring Data Neo4j提供的方法进行操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值