当前位置:   article > 正文

Neo4j入门_neo4j 4.x版本

neo4j 4.x版本

1. 概述

        Neo4j:是一个开源的 NoSQL 数据库,使用 scala 和 java 语言开发,是目前最流行的图数据库之一。

Neo4j优点:

  1. 使用灵活的查询语言Cypher,可以方便地查询和操作图形数据。
  2. 能够快速执行复杂查询。
  3. 支持集群部署。
  4. 支持 ACID 事务,能够确保数据的一致性、完整性和可靠性。
  5. 提供了多中语言的客户端库,如java、python、.NET等等。
  6. 拥有强大的社区支持,可以更加方便的学习和使用。

1.1 Neo4j的数据模型

节点:用于表达各种实体,如人、部门、物品等等。

属性:存储节点或关系的详细信息,以键值对的形式存在。

标签:用于区分节点,每个节点可以有多个标签。

关系:用于节点之间的连接,是图数据库的核心,每个关系都有方向,从一个节点指向另一个节点。

1.2 Neo4j的适用场景

  1. 社交网络
  2. 实时推荐系统
  3. 知识图谱
  4. 欺诈检测
  5. ...

2. 安装

官网地址:Neo4j Graph Database & Analytics | Graph Database Management System

准备工作:安装 JDK

版本对应:

  • 3.x:JDK8
  • 4.x:JDK11
  • 5.x:JDK17

2.1 Windows

下载地址:Neo4j Deployment Center - Graph Database & Analytics

1. 下载

2.  解压

3. 启动(进入 bin 文件夹,打开 cmd)

4. 访问 http://localhost:7474/

默认账号:neo4j

默认密码:neo4j

2.2 Linux

下面以 CentOS 为例安装 Neo4j:

  1. # 1.添加 Neo4j 仓库
  2. sudo tee /etc/yum.repos.d/neo4j.repo <<EOF
  3. [neo4j]
  4. name=Neo4j Yum Repo
  5. baseurl=http://yum.neo4j.org/stable
  6. enabled=1
  7. gpgcheck=1
  8. EOF
  9. # 2.导入密钥
  10. sudo rpm --import https://debian.neo4j.com/neotechnology.gpg.key
  11. # 3.安装Neo4j
  12. sudo yum install neo4j-版本
  13. # 4.启动 Neo4j 服务
  14. sudo systemctl start neo4j

3. CQL

        CQL:即Cypher Query Language,是 Neo4j 图形数据库的查询语言,是为处理图形数据而构建的。

常用命令作用
create创建节点
match检索相关节点
return返回查询结果
where根据条件过滤检索数据
delete删除节点、关系
remove删除节点和关系的属性
order by对检索数据排序
set

添加或更新属性


 3.1 create命令

创建无属性节点:

create (node:label)

创建有属性节点:

  1. create (
  2. node:label
  3. {
  4. property1:value1,
  5. property2:value2,
  6. property3:value3,
  7. ...
  8. }
  9. )

创建多标签节点:

  1. create (
  2. node:label-1:label-2:...
  3. {
  4. property1:value1,
  5. property2:value2,
  6. property3:value3,
  7. ...
  8. }
  9. )

创建关系:

create (node1-:label)- [relationship:<relationship-label] ->(node2:label)

注意:节点之间的关系是有方向的。

3.2 match命令

语法:

match ( node:label )

3.3 return命令

        不能够单独使用,常与 match 一起使用。

语法:

  1. match (node:label)
  2. return node.<property1>, ······ node.<propertyN>

3.4  where命令

        不能单独使用,通常与 match、return 一起使用。

简单条件检索:

  1. match (node:label)
  2. where 条件
  3. return node.<property1>, ······ node.<propertyN>

复杂条件检索:

  1. match (node:label)
  2. where 条件1 bool 条件2
  3. return node.<property1>, ······ node.<propertyN>

bool的取值:

  • AND:与
  • OR:或
  • NOT:非
  • XOR:异或

3.5 delete命令

        不能单独使用,通常与 match 一起使用。

删除节点:

match (xx:label) delete xx

删除节点及其关系:

match (n1:label)-[r]->(n2:label) delete n1,r,n2

3.6 remove命令

        不能单独使用,通常与 match 一起使用。

删除节点或关系的属性:

  1. match (node:label)
  2. remove property1,property2,...,propertyN

删除节点或关系的标签:

  1. match (node:label)
  2. remove label1,label2,...,labelN

3.7 set命令

语法:

  1. match (node:label)
  2. where 条件
  3. set node.property1 = value1,...,node.property2 = value2

3.8 order by命令

        不能单独使用,通常与 match 一起使用。

按属性升序:

  1. match (node:label)
  2. return ...
  3. order by node.property

按属性降序:

  1. match (node:label)
  2. return ...
  3. order by node.property desc

3.9 merge 命令 

        merge:当前查询节点的属性存在,则不创建新的节点,如果属性不存在就创建新节点。

merge = match + create

语法:

  1. merge (
  2. node:label
  3. {
  4. property1:value1,
  5. property2:value2,
  6. property3:value3,
  7. ...
  8. }
  9. )

3.10 load cvs命令

        load cvs:从 cvs 文件中导入数据。

准备工作:将 cvs 文件放入到 import 文件夹中。

参数:

参数说明
with headers读取文件的第一行作为参数名
as line为每行数据重命名
fieldterminator ‘,’自定义字段定界符为 ,
using periodic commit x每满 x 条提交一次,防止内存溢出,默认值 1000

举例:

  1. load csv with headers
  2. from 'file:///abc.csv'
  3. as line
  4. fieldterminator ','
  5. create (
  6. p:content
  7. {
  8. id: toInteger(line.id),
  9. content: line.content
  10. }
  11. )

4. CQL函数

4.1 常用的String函数

函数作用
upper(节点.属性)将字符串中的所有字母更改为大写字母
lower(节点.属性)将字符串中的所有字母更改为小写字母
substring(节点.属性,起始索引,结束索引)获取所给字符串的指定子字符串
replace(节点.属性,要替换的字符串,替换成的字符串)替换所给字符串的子字符串

4.2 聚合函数

函数作用
count(*)统计 match 命令返回的行数
max(节点.属性)找到 match 命令返回的一组数据中的最大值
min(节点.属性)找到 match 命令返回的一组数据中的最小值
sum(节点.属性)统计 match 命令返回的一组数据的值求和
avg(节点.属性)统计 match 命令返回的一组数据的值求平均值

4.3 关系函数

函数作用
startnode(关系)获取关系的开始节点
endnode(关系)获取关系的结束节点
id(关系)获取关系的id
type(关系)获取关系的类型信息

5. SpringBoot整合Neo4j

5.1 依赖

  1. <dependency>
  2. <groupId>org.springframework.boot</groupId>
  3. <artifactId>spring-boot-starter</artifactId>
  4. </dependency>
  5. <dependency>
  6. <groupId>org.springframework.boot</groupId>
  7. <artifactId>spring-boot-starter-test</artifactId>
  8. <scope>test</scope>
  9. </dependency>
  10. <!-- Neo4j依赖 -->
  11. <dependency>
  12. <groupId>org.springframework.boot</groupId>
  13. <artifactId>spring-boot-starter-data-neo4j</artifactId>
  14. </dependency>
  15. <!-- Lombok -->
  16. <dependency>
  17. <groupId>org.projectlombok</groupId>
  18. <artifactId>lombok</artifactId>
  19. </dependency>

5.2 创建实体

注解说明:

  • @Node:标明是一个实体。
  • @Id:实体主键。
  • @GeneratedValue:实体属性值自增。
  • @Property:实体属性。
  • @Relationship:声明实体之间关系。

实例:

  1. @Data
  2. @Node(labels = {"NBAathletes"}) // 声明实体,并指定标签名
  3. public class NBAathlete implements Serializable {
  4. @Id
  5. @GeneratedValue
  6. private Long id; // 声明主键
  7. @Property
  8. private String name; // 声明 name 属性
  9. @Property
  10. private String height; // 声明 height 属性
  11. @Property
  12. private String weight; // 声明 weighr 属性
  13. @Property
  14. private int num; // 声明 num 属性
  15. @Property
  16. private String role; // 声明 role 属性
  17. @Relationship(type = "TeamMate",direction = Relationship.Direction.OUTGOING)
  18. // 声明关系属性 TeamMate,指定关系方向
  19. private List<NBAathlete> teamMate = new ArrayList<>();
  20. @Override
  21. public String toString() {
  22. return "NBAathlete{" +
  23. "id=" + id +
  24. ", teamMateCount=" + (teamMate != null ? teamMate.size() : 0) +
  25. '}';
  26. }
  27. }

5.3 创建接口

  1. /*
  2. 1.继承 Neo4jRepository 接口。
  3. 2.指定实体 NBAathlete
  4. 3.指定ID类型为 Long
  5. */
  6. @Repository
  7. public interface NBAathleteRepository extends Neo4jRepository<NBAathlete,Long> {
  8. }

5.4 功能——查询

  1. @SpringBootTest
  2. class Neo4jDemoApplicationTests {
  3. @Autowired
  4. NBAathleteRepository nbAathleteRepository;
  5. @Test
  6. void findByID() {
  7. Optional<NBAathlete> athleteOptional = nbaAthleteRepository.findById(3L);
  8. NBAathlete athlete = athleteOptional.get();
  9. }
  10. @Test
  11. void findAll() {
  12. List<NBAathlete> allAthlete = nbaAthleteRepository.findAll();
  13. }
  14. }

5.5 功能——添加

  1. @SpringBootTest
  2. class Neo4jDemoApplicationTests {
  3. @Autowired
  4. NBAathleteRepository nbAathleteRepository;
  5. @Test
  6. void add() {
  7. // 配置实体信息
  8. NBAathlete athlete = new NBAathlete();
  9. athlete.setHeight("196cm");
  10. athlete.setWeight("86kg");
  11. athlete.setRole("后卫");
  12. athlete.setNum(10);
  13. athlete.setName("xx-aa");
  14. // 保存
  15. nbaAthleteRepository.save(athlete);
  16. }
  17. }

5.6 功能——删除

  1. @SpringBootTest
  2. class Neo4jDemoApplicationTests {
  3. @Autowired
  4. NBAathleteRepository nbAathleteRepository;
  5. @Test
  6. void delete() {
  7. NBAathlete athlete_1 = new NBAathlete();
  8. athlete_1.setId(34L);
  9. nbaAthleteRepository.delete(athlete_1);
  10. }
  11. @Test
  12. void deleteById() {
  13. nbaAthleteRepository.deleteById(34L);
  14. }
  15. @Test
  16. void deleteAll() {
  17. nbaAthleteRepository.deleteAll();
  18. }
  19. }

5.7 功能——添加关系

  1. @SpringBootTest
  2. class Neo4jDemoApplicationTests {
  3. @Autowired
  4. NBAathleteRepository nbAathleteRepository;
  5. @Test
  6. void addRelationShip() {
  7. // 查找
  8. Optional<NBAathlete> athlete_1 = nbaAthleteRepository.findById(0L);
  9. Optional<NBAathlete> athlete_2 = nbaAthleteRepository.findById(35L);
  10. NBAathlete n1 = athlete_1.get();
  11. NBAathlete n2 = athlete_2.get();
  12. // 添加关系
  13. n1.getTeamMate().add(n2);
  14. // 保存
  15. nbaAthleteRepository.save(n1);
  16. }
  17. }

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

闽ICP备14008679号