一、前言
1.1 Neo4J
1.2 对比关系型数据库
二、Windows环境安装
2.1 检查java环境
2.2 下载安装Neo4J及环境变量
2.3 Neo4j基本配置
2.4 网络配置
2.5 启动Neo4j
三、ArchLinux环境安装
四、通过构建三国人物关系快速入门cypher
4.1 Neo4j数据模型
4.2 Cypher语言
4.3 实例
4.3.1 创建节点
4.3.2 创建关系
4.3.3 一些查询场景
五、主要参考材料
原创 及萨博涵五六 码农智涵的程序人生
一、前言
1.1 Neo4J
高性能的、NoSQL数据库
将数据之间的关系存于网(数据结构概念)中
基于Java的、具备完全事务特性的Java持久化引擎
用途:广泛用于人工智能、计算机图像、语音识别、NLP、搜索、智能问答、推荐系统等方面
一般地,知识图谱的建设,包括数据获取、实体识别、关系抽取、数据存储、图谱应用(当前重点发力于 RAG 应用的结合落地)几个方面。
1.2 对比关系型数据库
二、Windows环境安装
windows环境下安装也可以直接下载客户端
2.1 检查java环境
注意版本对齐
jdk版本必须大于17才能正常运行neo4j
java版本与 major version对应关系
需要把开发环境的 jdk 版本提升至>17
具体如何快速切换多版本jdk版本教程可参考下方链接
https://www.cnblogs.com/jaxu/p/14972722.html
2.2 下载安装Neo4J及环境变量
https://neo4j.com/deployment-center/
(支持多版本、包括历史版本)
https://we-yun.com/doc/neo4j/
下载解压完成后文件目录结构
bin:存储neo4j的可执行程序
conf:控制neo4j启动的配置文件
data:存储核心数据库文件
plugins:存储neo4j的插件
创建环境变量
2.3 Neo4j基本配置
conf目录下,neo4j.conf文件用来控制服务器的工作。
默认情况下,不需要进行任何配置即可启动和运行服务器
(1)核心数据文件位置
(2)安全验证
(3)Java堆内存配置
2.4 网络配置
支持网络协议
注意防火墙
默认监听地址
2.5 启动Neo4j
启动命令
neo4j.bat console
启动失败
失败原因:
java版本低,java版本与 major version对应关系
需要把开发环境的 jdk 版本提升至>17
windows切换jdk工具推荐:
GitHub - FelixSelter/JEnv-for-Windows: Change your current Java version with one line
之后重新启动
操作页面
访问 http://localhost:7474
默认用户名:neo4j
默认密码:neo4j
安装、配置完成
三、ArchLinux环境安装
【经验与坑】Manjaro图数据库Neo4j的安装配置使用
设置外部访问
适用场景:在一个linux服务器上安装neo4j,从外部网络访问脚手架
参考材料:
https://blog.csdn.net/weixin_51877649/article/details/137205296
四、通过构建三国人物关系快速入门cypher
4.1 Neo4j数据模型
数据模型是整一个最重要的环节,是基石是地基。
图数据库的数据模型的主要构建:
节点
关系
属性
标签
节点:用来表示一个实体记录,就像关系数据库中的一条记录,在Neo4J中节点可包含多个属性和多个标签。
节点通过关系连接到其他节点;节点可具有 >=1 个属性;
节点可具有 > =1 个标签,用于描述其在图中的作用。
属性
:用于描述图节点和关系的键值对。属性可以被索引和约束,可从多个属性创建复合索引。
关系
:用于连接两个节点,在数据结构图论中的边,始端和末端必须是节点,关系不能指向空也不能从空发起。关系和节点一样可包含多个属性,但关系只能有一个类型。关系还具有方向性(分为单向关系和双向关系)
标签
:将一个公共名称与一组节点/关系相关联,
节点/关系可包含一个/多个标签。
标签用于将节点分组;
通过标签对节点设置索引加快查询效率;
作为一个图数据库,必然存在图、节点以及连接两个节点之间的关系。每个节点相当于一个实体,每个实体都有构成它的属性。
比如三国演义中的刘备和关羽,这是两个抽象的实体,也可称为节点。
他们有个共同的标签:人类;
他们之间的关系:兄弟;
刘备的属性:耳朵大、汉室后裔等;
关羽属性:忠诚、害羞等
4.2 Cypher语言
也称CQL
是图数据库Neo4j的查询语言
遵循SQL语法
4.3 实例
4.3.1 创建节点
// 创建一个标签为Person的节点,该节点具有一个name属性,属性值为刘备
create (n:Person {name="刘备"}) return n
create为创建操作,n是节点,Persion是标签,代表节点的类型;
花括号 {}
代表节点的属性,属性类似 python 中的字典数据结构;
return n
表示返回当前节点的值。
创建多个节点:
// 蜀国主要人物
create (country:shu { name:'刘备'});
create (country:shu { name:'关羽'});
create (country:shu { name:'张飞'});
create (country:shu { name:'诸葛亮'});
// 魏国主要人物
create (country:wei { name:'曹操'});
create (country:wei { name:'曹植'});
create (country:wei { name:'曹丕'});
// 吴国主要人物
create (country:wu { name:'孙策'});
create (country:wu { name:'孙权'});
create (country:wu { name:'周瑜'});
MATCH (n) return (n)
MATCH子句用于指定一个模式,便于在图中查找匹配该模式的节点、关系和路径。
我们在使用 Match(n)时,实际上是在告诉数据库查找图中的全部节点,而没有指定任何特定节点类型或属性。
此外,MATCH 支持限制返回节点数量,我们可用 LIMIT 关键字
MATCH (n) return (n) LIMIT 10
删除节点:
提供两种删除方式:
MATCH(n:wu {name:'周瑜'})
DETACH DELETE n
首先通过 match 语句找到标签为 wu 且 属性 name 等于 '周瑜' 的节点。
其中 DETACH DELETE 语句用于删除这个节点以及与它相关的所有关系。
MATCH(n:wu {name:'周瑜'})
DELETE n
仅删除节点保留关系,使关系处于悬挂状态,即相关关系不与任何节点相连。
更新节点属性:
假设现在想更新名为 ”周瑜“ 的节点,将其名称属性改为 ”黄盖“。
可使用 SET 语句来更新节点的属性
MATCH (n:wu {name:'周瑜'})
SET n.name = '黄盖'
return n
4.3.2 创建关系
MATCH (a:shu {name:'刘备'}),
(b:shu {name:'关羽'})
MERGE (a)-[:二弟]->(b)
MATCH (a:shu {name:'刘备'}),
(b:shu {name:'张飞'})
MERGE (a)-[:三弟]->(b)
更新关系
假设我们在 刘备->关羽 的关系误写成了 【大哥】 关系,但实际上是 【二弟】关系,需要做更新操作:
MATCH (a:shu {name: '刘备'})-[r:大哥]->(b:shu {name: '关羽'})
SET r:二弟
RETURN r
更新节点间关系方向只能通过先删除关系 再新建关系来操作。
删除关系:
MATCH (a:shu {name: '刘备'})-[r:大哥]->(b:shu {name: '关羽'})
DELETE r
创建更多关系:
match (p1:shu {name:'刘备'}),(p2:shu{name:'关羽'}) create (p1)- [r:rel {relation:'结义兄弟'}]->(p2);
match (p1:shu {name:'刘备'}),(p2:shu{name:'张飞'}) create (p1)- [r:rel {relation:'结义兄弟'}]->(p2);
match (p1:shu {name:'刘备'}),(p2:shu{name:'诸葛亮'}) create (p1)- [r:rel {relation:'主公'}]->(p2);
MATCH (p1:wei {name:'曹植'}), (p2:wei {name:'曹操'}) MERGE (p1)-[:儿子]->(p2);
MATCH (p1:wei {name:'曹丕'}), (p2:wei {name:'曹操'}) MERGE (p1)-[:儿子]->(p2);
MATCH (p1:wei {name:'曹操'}), (p2:wei {name:'曹丕'}) MERGE (p1)-[:父亲]->(p2);
MATCH (p1:wei {name:'曹操'}), (p2:wei {name:'曹植'}) MERGE (p1)-[:父亲]->(p2);
MATCH (p1:wu {name:'孙策'}), (p2:wu {name:'孙权'}) MERGE (p1)-[:弟弟 {type:"亲情"}]->(p2);
MATCH (p1:wu {name:'孙权'}), (p2:wu {name:'孙策'}) MERGE (p1)-[:哥哥 {type:"亲情"}]->(p2);
MATCH (p1:wu {name:'周瑜'}), (p2:wu {name:'孙策'}) MERGE (p1)-[:主公 {type:"主从"}]->(p2);
4.3.3 一些查询场景
(1)查询有多少人属于蜀国
match(n:shu) return count(distinct(n))
(2)查找与刘备有结义兄弟关系的人物
MATCH (p1:shu {name: '刘备'})-[r:rel {relation: '结义兄弟'}]->(p2)
RETURN p2.name
(3)查找所有与刘备有直接关系的节点及其关系类型
MATCH (p1:shu {name: '刘备'})-[r]-(p2)
RETURN p2.name, type(r)
(4)查找所有与刘备有关系的节点,包括多跳关系
MATCH path = (p1:shu {name: '刘备'})-[*]-(p2)
RETURN nodes(path), relationships(path)
(5)查找所有与刘备有关系的节点,限制路径长度为2
MATCH path = (p1:shu {name: '刘备'})-[*2]-(p2)
RETURN path
五、主要参考材料
https://developer.aliyun.com/article/1143832
https://www.google.com/url?sa=t&source=web&rct=j&opi=89978449&url=https://www.cnblogs.com/ting1/p/17536915.html&ved=2ahUKEwidtY2muYaJAxU0n2MGHdi0IHQQFnoECCEQAQ&usg=AOvVaw2jF_dIDlLsk_JvmBsaxmVF