一、neo4j数据库介绍

- Neo4j是由Java实现的开源NoSQL图数据库. 自从2003年开始研发, 到2007年发布第一版. neo4j现如今已经被各行各业的数十万家公司和组织采用.
- Neo4j实现了专业数据库级别的图数据模型的存储. 与普通的图处理或内存级数据库不同, neo4j提供了完整的数据库特性, 包括ACID事物的支持, 集群支持, 备份与故障转移等. 这使其适合于企业级生产环境下的各种应用.
- Neo4j的版本说明:
- 企业版: 需要高额的付费获得授权, 提供高可用, 热备份等性能.
- 社区开源版: 免费使用, 但只能单点运行(只能单机部署,不支持集群).
1.1neo4j图数据概念
在spo三元组中,一般会把属性形容为实体,而在neo4j中的属性指的是对节点或者关系的补充说明:实体-属性-属性值;
neo4j关系也具备属性和属性值,比如结婚的关系,有结婚时长属性,属性值是**年;
属性和属性值使用key:value的方式进行存储;
ann:主实体,起点节点;
dan:客实体,终点节点;
标签分为节点标签和关系标签,关系标签是对实体间关系的分类,节点标签是对实体的分类,一个节点可以携带多个标签,但是一个关系只能有一个标签;

节点标签和关系标签的对比:
- RDF 三元组(S-P-O)中,关系(Predicate)本身是不能带属性的;
- 但 Neo4j 是属性图模型,关系可以有自己的类型(标签)和属性,这也是它比传统三元组更灵活的地方。
- 在 Neo4j 中,关系的 "标签" 就是它的类型名称(比如
Is_Married_To、Lives_With),用来定义关系的语义; - 关系的 "内容" 除了标签本身,还可以包含自定义的属性(比如结婚年份
since: 1995、同住开始时间since: 2000),但这张图里没有展示这些额外属性。
这个关系里面只有标签,没有属性;
在 Neo4j 中,节点和关系都可以有属性,用来存储实体或关系的补充信息,就像给 "实体" 加了一堆字段。
只有节点和关系(标签)可以带有属性,person这个实体标签不能带有属性;
属性的存储方式是字典;

二、安装java
Neo4j依赖java,所以我们先进行jdk安装
以下是Neo4j与JVM版本要求参考文档:
https://neo4j.com/docs/operations-manual/current/installation/requirements/
neo4j版本对java版本有要求:
本节演示我们使用的neo4j数据库版本是4.x,对应的java版本是11

windows支持安装多个java版本
- 第一步: 安装JAVA SE 的 JDK
- 下载地址: https://www.oracle.com/java/technologies/downloads/#java11 (注意: 在点击下载的过程中, 可能需要需要oracle账户, 直接注册登录即可下载)

- 下载安装完之后, 打开windows终端, 输入java --version检查是否安装好

三、下载安装neo4j
- 从官网下载社区版本, 下载地址: https://neo4j.com/download-center/#community
- 这里注意, 因为JDK为11版本, 所以我们这里对应下载Neo4j 4.0版本
- 下载好后, 解压到自己想放的盘里(注意, 路径不要出现中文, 以免报错). 例如: C:\Program Files (x86)\neo4j-community-4.4.41

- 对Neo4j进行环境变量配置
-
创建系统环境变量
- 过程: 电脑--->属性--->高级系统设置--->环境变量--->新建
- 手动添加变量名称和变量值(注意变量值是你存放文件的路径)
-

-
在path路径中将变量添加进去

-
第四步: 启动neo4j数据库
-
打开cmd, 输入: neo4j console

浏览器页面展示
- 注意: 如果你是第一次安装登录成功, 需要输入用户名和密码(默认用户名和密码一致都是: neo4j). 第一次登录需要更改密码.

更改密码:

四、Cypher介绍与使用
graph rag的基本流程:
先使用LLM生成一个cypher语句,然后在neo4j数据库里面查询,查询到的结果返回给LLM,然后循环操作

4.1create命令
# 创建命令格式:
# 此处create是关键字, 创建节点名称node_name, 节点标签Node_Label, 放在小括号里面()
# 后面把所有属于节点标签的属性放在大括号'{}'里面, 依次写出属性名称: 属性值, 不同属性用逗号','分隔
# 例如下面命令创建一个节点e, 节点标签是Employee, 拥有id, name, salary, deptnp四个属性:
CREATE (e:Employee{id:222, name:'Bob', salary:6000, deptnp:12})
标签名:e:Employee,节点名:name:Bob,
在 Neo4j 里,当你创建节点并设置了name属性时,Neo4j Browser(可视化界面)会默认用name属性的值来显示节点的标签 / 名称


4.2 match命令
- 匹配(查询)已有数据
- 演示:
格式:
查询某些实体的某些属性:MATCH (对象:节点类型) RETURN 对象.属性名
查询所有节点的所有属性:MATCH (n) RETURN n
# match命令专门用来匹配查询, 节点名称: 节点标签, 依然放在小括号内, 然后使用return语句返回查询结果, 和SQL很相似.
MATCH (e:Employee) RETURN e.id, e.name, e.salary, e.deptno
MATCH (n) return n # 查询所有结点
- 效果

4.3 merge命令
-
若节点存在, 则等效与match命令; 节点不存在, 则等效于create命令.
-
演示:
MERGE (e:Employee {id:146, name:'Lucer', salary:3500, deptno:16})
- 效果:

4.4用create创建关系
-
必须创建有方向性的关系, 否则报错.
-
演示:
创建一个节点p1到p2的有方向关系, 这个关系r的标签为Buy, 代表p1购买了p2, 方向为p1指向p2
CREATE (p1:Profile1)-[r:Buy]->(p2:Profile2)
-
效果:
节点没有设置name属性,默认显示id作为节点名;

4.5 使用merge创建关系
-
可以创建有方向性的关系.
-
演示:
创建一个节点p1到p2的无方向关系, 这个关系r的标签为miss, 代表p1-miss-p2, 方向为相互的
MERGE (p1:Profile1)-[r:miss]-(p2:Profile2)
- 效果:

2.6 where命令
-
类似于SQL中的添加查询条件.
-
演示:
查询节点Employee中, id值等于123的那个节点
MATCH (e:Employee) WHERE e.id=123 RETURN e
- 效果:

2.7delete命令
-
删除节点/关系及其关联的属性.
-
演示:
注意: 删除节点的同时, 也要删除关联的关系边
MATCH (p1:Profile1)-[r]-(p2:Profile2) DELETE p1, r, p2
- 效果:
删除前先进性查询:

查询到以后进行删除(节点关系一起删除):

2.8 sort命令
-
Cypher命令中的排序使用的是order by.
-
演示:
匹配查询标签Employee, 将所有匹配结果按照id值升序排列后返回结果
MATCH (e:Employee) RETURN e.id, e.name, e.salary, e.deptno ORDER BY e.id
如果要按照降序排序, 只需要将ORDER BY e.salary改写为ORDER BY e.salary DESC
MATCH (e:Employee) RETURN e.id, e.name, e.salary, e.deptno ORDER BY e.salary DESC
- 效果:

2.9 字符串函数:
1 toUpper()函数

2 toLower()函数
- 效果:

3 substring()函数
-
返回一个子字符串.
-
演示:
输入字符串为input_str, 返回从索引start_index开始, 到end_index-1结束的子字符串
substring(input_str, start_index, end_index)
示例代码, 返回员工名字的前两个字母
MATCH (e:Employee) RETURN e.id, substring(e.name,0,2), e.salary, e.deptno
- 效果:

4 replace()函数
-
替换掉子字符串.
-
演示:
输入字符串为input_str, 将输入字符串中符合origin_str的部分, 替换成new_str
replace(input_str, origin_str, new_str)
示例代码, 将员工名字替换为添加后缀_HelloWorld
MATCH (e:Employee) RETURN e.id, replace(e.name,e.name,e.name + "_HelloWorld"), e.salary, e.deptno
还原
MATCH (e:Employee) RETURN e.id, replace(e.name, "_HelloWorld", ""), e.salary, e.deptno
- 效果:

10 聚合函数
1 count()函数
-
返回由match命令匹配成功的条数.
-
演示:
返回匹配标签Employee成功的记录个数
MATCH (e:Employee) RETURN count( * )
- 效果:

2 max()函数
-
返回由match命令匹配成功的记录中的最大值.
-
演示:
返回匹配标签Employee成功的记录中, 最高的工资数字
MATCH (e:Employee) RETURN max(e.salary)
- 效果:

3 min()函数
-
返回由match命令匹配成功的记录中的最小值.
-
演示:
返回匹配标签Employee成功的记录中, 最低的工资数字
MATCH (e:Employee) RETURN min(e.salary)
- 效果:

4 sum()函数
-
返回由match命令匹配成功的记录中某字段的全部加和值.
-
演示:
返回匹配标签Employee成功的记录中, 所有员工工资的和
MATCH (e:Employee) RETURN sum(e.salary)
- 效果:

5 avg()函数
-
返回由match命令匹配成功的记录中某字段的平均值.
-
演示:
返回匹配标签Employee成功的记录中, 所有员工工资的平均值
MATCH (e:Employee) RETURN avg(e.salary)
- 效果:

11 索引index
- Neo4j支持在节点或关系属性上的索引, 以提高查询的性能.
- 可以为具有相同标签名称的所有节点的属性创建索引.
1 创建索引
-
使用create index on来创建索引.
-
演示:
创建节点Employee上面属性id的索引
CREATE INDEX ON:Employee(id)
- 效果:

2 删除索引
-
使用drop index on来删除索引.
-
演示:
删除节点Employee上面属性id的索引
DROP INDEX ON:Employee(id)
- 效果:

