neo4j图数据库安装教程(windows)

一、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_ToLives_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版本

  • 下载安装完之后, 打开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()函数
  • 将一个输入字符串转换为大写字母.

  • 演示:

    MATCH (e:Employee) RETURN e.id, toUpper(e.name), e.salary, e.deptno

  • 效果:

2 toLower()函数
  • 将一个输入字符串转换为小写字母.

  • 演示:

    MATCH (e:Employee) RETURN e.id, toLower(e.name), e.salary, e.deptno

  • 效果:

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)

  • 效果:
相关推荐
猫的玖月7 小时前
(三)SQL-DML
数据库·sql
p@ssword7 小时前
解决idea-2025.3.3重启项目/停止项目要点两次问题才生效问题
javascript·数据库·intellij-idea
iwS2o90XT7 小时前
仿写一个简化版Redis,理解内存数据库
数据库·redis·缓存
星马梦缘7 小时前
数据库第4章 : 中级 SQL
数据库·sql
ZPC82107 小时前
手眼标定原理
数据库·数码相机·postgresql
S1998_1997111609•X7 小时前
iOS栈被恶意篡改变成开发者模式漏洞裸露内核系统核心功能栈被泄露于政府黑客集团泄漏安全系统置门的犯罪行为原理
数据库·网络协议·百度·ssh·开闭原则
xxjj998a7 小时前
Laravel5.x全版本特性解析
数据库·mysql·adb
小碗羊肉7 小时前
【MySQL | 第九篇】SQL优化
数据库·sql·mysql
xxjj998a8 小时前
Laravel6.x核心特性全解析
数据库·mysql·adb