当前位置:   article > 正文

图数据库Neo4j笔记一:入门_neo4j使用教程

neo4j使用教程

一、Neo4j介绍

1、随着社交、金融、零售等行业的发展,现实社会织起了一个庞大而复杂的关系网,采用图数据来处理它,会更高效、更方便,图数据库更擅长支持海量、复杂、多变的关系运算,并且运算性能非常高,在后续的笔记会记录图数据库的其他特性

二、Neo4j基于windows系统环境搭建

1、Neo4j需要jdk11或以上版本,如果本地环境不满足的话,先安装jdk11

2、下载Neo4j最新社区版,下载后复制到自定义目录中解压

3、配置环境变量

3.1、打开环境变量窗口

3.2、在用户环境变量添加变量,变量值引用Neo4j所在目录

3.3、在系统环境变量中设置

3.4、环境变量配置好后,在命令提示窗口输入neo4j.bat console命令验证,出现如下图所示则安装成功

3.5、复制倒数第二行地址http://localhost:7474/在浏览器中打开,默认用户名和密码为neo4j和neo4j,之后会提示修改密码,不要忘记密码

3.6、至此,便成功安装好Neo4j了。

(命令行窗口不可以关闭,需持续打开状态才能成功进入Neo4j的网页)

3.7、安装过程中用到的安装包

链接:https://pan.baidu.com/s/11XoKULqKev8GJaJCFqMyKw 
提取码:73zw

三、Neo4j简单语法使用

1、创建节点:

create(s:Student{name:"熊熊"}) return s

create(g:Group{name:"高一班"}) return g

2、节点查询

2.1、查询全部节点

match(n) return n 

2.2、查询全部的前N个节点

match(n) return n limit 3

2.3、查询某类型的节点,例如查询所有学生节点

match(s:Student) return s

3、建立关联关系

3.1、建立班级学生关系:例如班级管理学生

match(g:Group{name:"高一班"}),(s:Student{name:"熊熊"}) create (g)-[r:管理]->(s) return g,s

4、解除关联关系

有时候因为某种原因,关系建立错了,例如:

match(s:Student{name:"熊熊"}),(g:Group{name:"高一班"}) create (s)-[r:`管理`]->(g) return s,g

这种情况就需把这条错误的关系删除,请看删除关系:

match(g:Group)r:`管理`]-(s:Student) where g.name="高一班" and s.name="熊熊" delete r return g,s,r

5、删除某个节点

先查询出节点 match(p:Persion) return p limit 100

写法1:match(p:Persion) where p.name="张三" delete p

写法2:match(p:Persion{name:"李四"}) delete p

6、修改

match(s:Student) where s.name="熊熊" set s.name="雄哥" return s

在后续学习中会详细记录Neo4j语法,此处先简单做一些增删改查操作

四、spring boot 集成neo4j

1、创建boot工程

2、pom文件

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  5. <modelVersion>4.0.0</modelVersion>
  6. <groupId>org.example</groupId>
  7. <artifactId>neo4j-demo</artifactId>
  8. <version>1.0-SNAPSHOT</version>
  9. <dependencies>
  10. <dependency>
  11. <groupId>org.springframework.boot</groupId>
  12. <artifactId>spring-boot-dependencies</artifactId>
  13. <version>2.7.0</version>
  14. </dependency>
  15. <dependency>
  16. <groupId>org.springframework.boot</groupId>
  17. <artifactId>spring-boot-starter-web</artifactId>
  18. <version>2.3.2.RELEASE</version>
  19. </dependency>
  20. <dependency>
  21. <groupId>org.springframework.boot</groupId>
  22. <artifactId>spring-boot-starter-data-neo4j</artifactId>
  23. <version>2.3.2.RELEASE</version>
  24. </dependency>
  25. <dependency>
  26. <groupId>com.fasterxml.jackson.core</groupId>
  27. <artifactId>jackson-databind</artifactId>
  28. <version>2.12.6</version>
  29. </dependency>
  30. <dependency>
  31. <groupId>com.fasterxml.jackson.core</groupId>
  32. <artifactId>jackson-core</artifactId>
  33. <version>2.12.6</version>
  34. </dependency>
  35. <dependency>
  36. <groupId>com.fasterxml.jackson.core</groupId>
  37. <artifactId>jackson-annotations</artifactId>
  38. <version>2.12.6</version>
  39. </dependency>
  40. </dependencies>
  41. </project>

3、创建实体类

  1. package com.neo.demo.domain;
  2. import org.neo4j.ogm.annotation.GeneratedValue;
  3. import org.neo4j.ogm.annotation.Id;
  4. import org.neo4j.ogm.annotation.NodeEntity;
  5. import java.io.Serializable;
  6. @NodeEntity("Person")
  7. public class Person implements Serializable {
  8. @Id
  9. @GeneratedValue
  10. private Long id;
  11. private String name;
  12. public String getName() {
  13. return name;
  14. }
  15. public Long getId() {
  16. return id;
  17. }
  18. public void setId(Long id) {
  19. this.id = id;
  20. }
  21. public void setName(String name) {
  22. this.name = name;
  23. }
  24. }

4、基于spring data,创建dao

  1. package com.neo.demo.dao;
  2. import com.neo.demo.domain.Person;
  3. import org.springframework.data.neo4j.annotation.Query;
  4. import org.springframework.data.neo4j.repository.Neo4jRepository;
  5. import org.springframework.data.repository.query.Param;
  6. import org.springframework.stereotype.Repository;
  7. @Repository
  8. public interface PersonRepository extends Neo4jRepository<Person,Long> {
  9. @Query("match(p:Person{name:$name}) delete p ")
  10. void removePersonByName(@Param("name") String name);
  11. @Query("match(p:Person{name:$oldName}) set p.name=$newName return p ")
  12. Person updatePersonNameById(@Param("oldName") String oldName,@Param("newName") String newName);
  13. }

5、创建controller

  1. package com.neo.demo.controller;
  2. import com.neo.demo.dao.PersonRepository;
  3. import com.neo.demo.domain.Person;
  4. import org.springframework.beans.factory.annotation.Autowired;
  5. import org.springframework.web.bind.annotation.*;
  6. import sun.java2d.pipe.SpanClipRenderer;
  7. import java.util.Map;
  8. @RestController
  9. @RequestMapping("/person")
  10. public class PersonController {
  11. @Autowired
  12. private PersonRepository repository;
  13. @PostMapping("/savePerson")
  14. public Object savePerson(@RequestBody Person param){
  15. Person person = new Person();
  16. person.setName(param.getName());
  17. return repository.save(person);
  18. }
  19. @DeleteMapping("/removePersonById")
  20. public String removePersonById(Long personId){
  21. try {
  22. repository.deleteById(personId);
  23. return "删除成功";
  24. }catch (Exception e ){
  25. e.printStackTrace();
  26. return "删除异常";
  27. }
  28. }
  29. @DeleteMapping("/removePersonByName")
  30. public String removePersonByName(String name){
  31. try {
  32. repository.removePersonByName(name);
  33. return "操作成功";
  34. }catch (Exception e){
  35. e.printStackTrace();
  36. return "通过person name 删除异常";
  37. }
  38. }
  39. @PutMapping("/updateById")
  40. public Person updateById(@RequestBody Map<String,String> person){
  41. return repository.updatePersonNameById(person.get("oldName"),person.get("newName"));
  42. }
  43. }

6、通过代码操作关联关系

6.1、绑定关系类

  1. package com.neo.demo.domain;
  2. import org.neo4j.ogm.annotation.*;
  3. @RelationshipEntity(type = "师徒")
  4. public class PersonRelation {
  5. @Id
  6. @GeneratedValue
  7. private Long id;
  8. @StartNode
  9. private Person parent;
  10. @EndNode
  11. private Person child;
  12. public Person getParent() {
  13. return parent;
  14. }
  15. public void setParent(Person parent) {
  16. this.parent = parent;
  17. }
  18. public Person getChild() {
  19. return child;
  20. }
  21. public void setChild(Person child) {
  22. this.child = child;
  23. }
  24. }

6.2、绑定关系dao

  1. package com.neo.demo.dao;
  2. import com.neo.demo.domain.PersonRelation;
  3. import org.springframework.data.neo4j.annotation.Query;
  4. import org.springframework.data.neo4j.repository.Neo4jRepository;
  5. import org.springframework.data.repository.query.Param;
  6. import org.springframework.stereotype.Repository;
  7. @Repository
  8. public interface PersonRelationRepository extends Neo4jRepository<PersonRelation,Long> {
  9. @Query("match(p:Person{name:$parentName})-[r:`师徒`]->(pp:Person{name:$childName}) delete r")
  10. void relievePersonRelation(@Param("parentName") String parentName, @Param("childName") String childName,@Param("relation") String relation);
  11. }

6.3、controller调用代码

  1. @PostMapping("/createPersonRelation")
  2. public PersonRelation createPersonRelation(@RequestBody PersonRelationVo vo){
  3. PersonRelation relation = new PersonRelation();
  4. Person parentPerson = repository.selectPersonByName(vo.getParent());
  5. Person childPerson = repository.selectPersonByName(vo.getChild());
  6. if(Objects.isNull(parentPerson)){
  7. parentPerson = new Person();
  8. parentPerson.setName(vo.getParent());
  9. repository.save(parentPerson);
  10. }
  11. if(Objects.isNull(childPerson)){
  12. childPerson = new Person();
  13. childPerson.setName(vo.getChild());
  14. repository.save(childPerson);
  15. }
  16. relation.setParent(parentPerson);
  17. relation.setChild(childPerson);
  18. return relationRepository.save(relation);
  19. }
  20. @PostMapping("/relieve")
  21. public String relieve(@RequestBody PersonRelationVo vo){
  22. try {
  23. relationRepository.relievePersonRelation(vo.getParent(),vo.getChild(),"师徒");
  24. return "解除成功";
  25. }catch (Exception e){
  26. e.printStackTrace();
  27. return "解除失败";
  28. }
  29. }

7、查询

7.1、查询某个节点的子节点,例如:查询雄霸的所有弟子

  1. /**
  2. * 查询某个人的所有徒弟
  3. * @param name 师傅名称
  4. * @return 徒弟
  5. */
  6. @Query("match(p:Person{name:$name})-[r:`师徒`]->(pp:Person) return pp ")
  7. List<Person> selectChildByParentName(@Param("name") String name);

7.2、controller调用

  1. /**
  2. * 查询某个节点的子节点
  3. * 示例:查询某个人的所有徒弟
  4. * @return 子节点
  5. */
  6. @GetMapping("/findChildByParentName")
  7. public List<Person> findChildByParentName(String name){
  8. return repository.selectChildByParentName(name);
  9. }

7.3、postman测试

7.4、查询一个人的父节点

例:查询步惊云的所有师傅

  1. /**
  2. * 查询某个人的所有师傅
  3. * @param name 徒弟名称
  4. * @return 师傅
  5. */
  6. @Query("match(p:Person{name:$name})<-[r:`师徒`]-(p1:Person) return p1 ")
  7. List<Person> selectParentByChildName(@Param("name") String name);
  1. /**
  2. * 查询父节点
  3. * @param name 子节点名称
  4. * @return 所有的父节点
  5. */
  6. @GetMapping("/findParentByChildName")
  7. public List<Person> findParentByChildName(String name){
  8. return repository.selectParentByChildName(name);
  9. }

注意:运行过程中有可能会报JSON parse error: Cannot construct instance of错误

原因是当实体类没有默认构造器时候,发送json参数会报错

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/笔触狂放9/article/detail/369749
推荐阅读
相关标签
  

闽ICP备14008679号