Hello World 之Spring Boot 调用图数据库Neo4j


  1. 明日歌
  2. [清]钱鹤滩
  3. 明日复明日,明日何其多!
  4. 我生待明日,万事成蹉跎

1. 图数据库Neo4j之爱的初体验 ----与君初相识,犹似故人归

在如今大数据(big data)横行的时代,传统的关系型数据库如oracle,mysql在大数据量,高并发的场景下显得力不从心。于是乎,NoSQL横空出世,如column-based的cassandra数据库,document-based的MongoDB,还有今天介绍的小众的graph-based的图数据数据库Neo4j。

图数据库名字的由来其实与其在底层的存储方式有关,图数据库并不表示会存储图形,图片等。Neo4j底层会以图的方式把用户定义的节点(nodes)以及关系(relationships)存储起来,Nodes 和 Relationships 包含key/value形式的属性。Nodes通过Relationships所定义的关系相连起来,形成关系型网络结构。通过这种方式,可是高效的实现从某个节点开始,通过节点与节点间关系,找出两个节点间的联系。

2. Neo4j之爱的再判断----天生我材必有用

以金庸先生的《神雕侠侣》为例,这里面的人物关系图很复杂,神雕大侠杨过有很多粉丝,他的粉丝又有自己的粉丝(二度人脉),粉丝的粉丝又有自己的粉丝……..假设杨大侠从南宋就开了个博客,到如今必定圈粉无数,如果要找到杨过的粉丝和他的六度七度人脉,运用传统的关系型数据库的话,则需要在关系表里存储很多关系数据,成万上亿,百亿,千亿甚至更多。不论用关系型数据库的分库分表技术还是其他优化手段,在复杂度和性能方面都可能会遇到瓶颈。

而图数据库neo4j运用了图的遍历算法设计,即从一个节点开始,根据其连接的关系,可以快速和方便地找出它的邻近节点,从而具有简单的存储方式和极高的查询性能。

关于neo4j的更多细节和neo4j server的安装以及用cypher语言创建节点,关系等内容可以参考网上资料(如:https://blog.csdn.net/victory0508/article/details/78414798),本文着重关注Spring boot 2.0 如何简洁的调用neo4j.

3. Neo4j执Spring boot之手----窈窕淑女,Spring boot好逑

在我的第一篇博客里介绍了Spring boot 2.0。本文将Spring boot 结合Spring Data,用极少的代码,基本零配置,不用书写任何查询(queries)语句(这里是cypher)实现了Neo4j的增删改查。

3.1 Neo4j的连接配置

Spring boot的配置文件默认在src/main/resources下面,支持传统的application.properties 和application.yml

application.properties版:


  1. spring.data.neo4j.username=neo4j
  2. spring.data.neo4j.password=helloworld

application.yml版:


  1. spring:
  2. data:
  3. neo4j:
  4. username: neo4j
  5. password: helloworld

3.2 实体类(model)


  1. @NodeEntity
  2. public class Legend {
  3. @Id @GeneratedValue private Long id;
  4. private String name;
  5. private Legend() {
  6. // Empty constructor required as of Neo4j API 2.0.5
  7. };
  8. public Legend(String name) {
  9. this.name = name;
  10. }
  11. /**
  12. * Neo4j doesn‘t REALLY have bi-directional relationships. It just means when querying
  13. * to ignore the direction of the relationship.
  14. * https://dzone.com/articles/modelling-data-neo4j
  15. */
  16. @Relationship(type = "FANS", direction = Relationship.UNDIRECTED)
  17. public Set<Legend> fans;
  18. public void fansWith(Legend legend) {
  19. if (fans == null) {
  20. fans = new HashSet<>();
  21. }
  22. fans.add(legend);
  23. }
  24. public String toString() {
  25. //java 8 stream and optional
  26. return this.name + "‘s fans => "
  27. + Optional.ofNullable(this.fans).orElse(
  28. Collections.emptySet()).stream()
  29. .map(Legend::getName)
  30. .collect(Collectors.toList());
  31. }
  32. public String getName() {
  33. return name;
  34. }
  35. public void setName(String name) {
  36. this.name = name;
  37. }
  38. }

实体类annotated by 注解@NodeEntity,这样当调用保存这个实体时(save方法),会将它保存到neo4j数据库。

另一个重要的部分是

        @Relationship(type = "FANS", direction = Relationship.UNDIRECTED)

用来建立关系,UNDIRECTED表示忽略关系的方向性。

应用程序通过调用fansWith方法,可以将神雕的人物们联系起来。

3.3 Spring data neo4j

Spring Data  属于Spring 大家庭,用于简化对数据库的访问,在很多情况下,甚至都不用写任何queries就可以实现对数据库的各种操作。


  1. import org.springframework.data.repository.CrudRepository;
  2. public interface LegendRepo extends CrudRepository<Legend, Long> {
  3. Legend findByName(String name);
  4. }

CrudRepository 是关键,它封装常用的如保存,更新等操作。

上面的findByName方法表示用name来查询。name必须是实体类的一个属性。在关系型数据库里,spring data会自己将他转化成 select * from table where name=?。而neo4j使用cypher语言,类似转化成查询语句


  1. MATCH (n:`Legend`) WHERE n.`name` = { `name_0` } WITH n RETURN n,
  2. [ [ (n)-[r_f1:`FANS`]-(l1:`Legend`) | [ r_f1, l1 ] ] ], ID(n) with params {name_0=杨过}

如果要表达Or或者And关系(假设legend有属性level),方法名将会是

findByNameAndLevel(String name,String level)

如果要分页,需要继承PagingAndSortingRepository,而不是CrudRepository 。有关springdata的更多细节,笔者将会在以后的博客中详细介绍。

3.4 Spring boot 启动类


  1. @SpringBootApplication
  2. @EnableNeo4jRepositories
  3. public class SpringBootNeo4jApplication {
  4. public static void main(String[] args) {
  5. SpringApplication.run(SpringBootNeo4jApplication.class, args);
  6. }
  7. }

这里的注解@EnableNeo4jRepositories告诉spring boot程序使用neo4j repository。

3.5 Spring boot 测试类 

开发工具Spring tool suites自动会生成测试类,添加自己的逻辑代码,保存三个节点:杨过,小龙女和郭襄。

然后建立她们之间的关系,小龙女和郭襄均是杨过的粉丝。最后查询出杨过的粉丝。


  1. @RunWith(SpringRunner.class)
  2. @SpringBootTest
  3. public class SpringBootNeo4jApplicationTests {
  4. @Autowired
  5. LegendRepo legendRepo;
  6. private final static Logger log = LoggerFactory.getLogger(SpringBootNeo4jApplicationTests.class);
  7. @Test
  8. public void contextLoads() {
  9. legendRepo.deleteAll();
  10. Legend yangguo = new Legend("杨过");
  11. Legend dragonGirl = new Legend("小龙女");
  12. Legend guoxiang = new Legend("郭襄");
  13. List<Legend> team = Arrays.asList(yangguo, dragonGirl, guoxiang);
  14. log.info("Before linking up with Neo4j...");
  15. //java 8 stream
  16. team.stream().forEach(legend -> log.info("\t" + legend.toString()));
  17. legendRepo.save(yangguo);
  18. legendRepo.save(dragonGirl);
  19. legendRepo.save(guoxiang);
  20. yangguo = legendRepo.findByName(yangguo.getName());
  21. yangguo.fansWith(dragonGirl);
  22. yangguo.fansWith(guoxiang);
  23. legendRepo.save(yangguo);
  24. dragonGirl = legendRepo.findByName(dragonGirl.getName());
  25. dragonGirl.fansWith(guoxiang);
  26. // We already know that dragonGirl is a fan of yangguo
  27. legendRepo.save(dragonGirl);
  28. // We already know guoxiang fans with yangguo and dragongirl
  29. log.info("Look up yangguo‘s fans ...");
  30. log.info(legendRepo.findByName("杨过").toString());
  31. }
  32. }

运行代码查看日志:

Look up yangguo‘s fans ...
Request: MATCH (n:`Legend`) WHERE n.`name` = { `name_0` } WITH n RETURN n,[ [ (n)-[r_f1:`FANS`]-(l1:`Legend`) | [ r_f1, l1 ] ] ], ID(n) with params {name_0=杨过}
 杨过‘s fans => [郭襄, 小龙女]

4. Neo4j与Spring boot----一生一代一双人

Neo4j在某些场合能发挥自己的优势,而用spring boot的方式,使得neo4j的使用非常简单,自从有了spring boot,生活变得好轻松。

关注spring boot,请继续关注我的博客。

原文地址:https://blog.csdn.net/weixin_41897365/article/details/79835319

原文地址:https://www.cnblogs.com/jpfss/p/11231415.html

时间: 2024-09-30 13:24:22

Hello World 之Spring Boot 调用图数据库Neo4j的相关文章

转:图数据库Neo4J的介绍

,图数据库Neo4J的介绍:http://www.neo4j.org/learn/neo4jNeo4J是个开源的图数据,很好用,轻便灵活,嵌入式,功能强大,而且相关资料比较齐全.按照Neo4J官方网站公布,该数据库可以支持数十亿的节点数:massively scalable, up to several billion nodes/relationships/properties而且支持分布式部署,Master,Slave.对Neo4J的性能和可用性的介绍:http://video.neo4j.

Spring Boot 连接MySql数据库

Spring Boot 以后也许会成为入门Spring的首选! 记一下Spring Boot 成功连接Mysql数据库的方法步骤! 一.新建Maven工程,不全Maven所需文件夹,在pom.xml引入SpringBoot的依赖包!可以参照:http://www.cnblogs.com/liangblog/p/5207855.html 二.有两种方法与数据库建立连接,一种是集成Mybatis,另一种用JdbcTemplate (1).用JdbcTemplate <dependency> <

Spring Boot连接Mysql数据库问题解决

在spring Boot项目中使用mysql数据库进行数据库的增删查改,出现以下错误: Error starting ApplicationContext. To display the auto-configuration report re-run your application with 'debug' enabled. 2017-06-15 15:04:37.122 ERROR 10072 --- [ restartedMain] o.s.boot.SpringApplication

spring boot 定时备份数据库

第一步 :添加mysqldump.exe 进环境变量 第二步  新建一个spring boot 项目,连接数据库 spring.datasource.url=jdbc:mysql://localhost:3308/springbootdb?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true spring.datasource.username=root spring.datasource.password=mysql

Spring Boot调用SOAP Web Service

Spring Boot项目中,调用遗留的SOAP Web Service,方法很简单,仅需引入spring-boot-starter-web-services. <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web-services</artifactId> </dependency> WebServic

Spring Boot集成mongodb数据库

一.认识mongodbMongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的.它支持的数据结构非常松散,是类似json的bson格式,因此可以存储比较复杂的数据类型.Mongo最大的特点是它支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引.二.Spring boot项目集成mongodb1.添加mongodb依赖 <dependency> <group

spring boot + mybaits 操作数据库

spring boot 访问 mysql方式三:spring boot + mybaits pom 文件引入 依赖 <!-- mybatis --> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>2.0.1</version>

开源软件:NoSql数据库 - 图数据库 Neo4j

转载自原文地址:http://www.cnblogs.com/loveis715/p/5277051.html 最近我在用图形数据库来完成对一个初创项目的支持.在使用过程中觉得这种图形数据库实际上挺有意思的.因此在这里给大家做一个简单的介绍. NoSQL数据库相信大家都听说过.它们常常可以用来处理传统的关系型数据库所难以解决的一系列问题.通常情况下,这些NoSQL数据库分为Graph,Document,Column Family以及Key-Value Store等四种.这四种类型的数据库分别使用

主流图数据库Neo4J、ArangoDB、OrientDB综合对比:架构分析

1: 本地存储方式 2: 内置查询语言分析 3: 性能分析 4: 图算法支持 本地存储方式 Neo4J neo4j数据库支持最大多少个节点?最大支持多少条边? 目前累积统计它有34.4亿个节点,344亿的关系,和6870亿条属性. 在数据库中,读/写性能跟节点/边的数量有关吗? 这个问题意味着两个不同的问题.单次读/写操作不依赖数据库的大小.不管数据库是有10个节点还是有1千万个都一样. - 然而,有一个事实是如果数据库太大,你的内存可能无法完全缓存住它,因此,你需要频繁的读写磁盘.虽然很多用户