【Neo4j】Day01-Neo4j入门、安装和Cypher语法

写在前面 / 链接存档

Neo4j入门

图形数据库

是基于图论实现的一种新型 nosql 数据库,

其数据库存储结构和数据的查询方式都是以图论为基础的。

图论中图的基本元素为节点和边,

在图数据库中对应的就是节点和关系。

图的结构和组成

Neo4j 基本元素和概念

标签

在Neo4j中,一个节点可以有一个以上的标签

一个标签可以认为是节点的某个类别

比如:BOOK、MOVIE

节点

节点是指一个实实在在的对象

节点可以有很多个标签→表示节点的种类

节点可以有很多属性→描述节点的特征

节点与节点之间还可以形成多个有向 /无向的关系

Example: Employee Node

关系

用来描述节点与节点之间的关系【图数据与普通数据库最大的区别】

→得以描述普通行列数据库难以表示的网状关系

例如:复杂的人际关系网、六度理论、大脑神经元之间的连接方式等

关系

属性

描述节点的特性

采用Key-Value结构,可以随意设定来描述节点的特征

概念:图论

图论是数学的一个分支,以图为研究对象,

图论中的图是由若干个给定的点以及连接两点的线所构成的图形

这种图形常用来 描述某些事物之间的某种特定关系

点→事物 线→两个事物间的关系

Neo4j 图形理论基础

  • 最简单:单个节点

单节点

可以使用节点表示社交网络(如Google+(GooglePlus)个人资料),不包含任何属性

  • 向节点添加属性

向节点添加属性

节点包含一组属性

属性是一个键:值

  • 在两个节点之间创建关系

在两个节点之间创建关系

此处在两个配置文件之间创建关系名称“跟随”。

意味着 Profile-1遵循 Profile-2

  • 复杂一点的示例图

复杂一点的示例图

节点用关系连接。 关系是单向 / 双向的。
从PQR到XYZ的关系是单向关系。
从ABC到PQR的关系是双向关系。

什么是Neo4j

是一个高性能的NOSQL图形数据库,

将结构化数据存储在节点网络 / 图上,而不是行列表中

是一个嵌入式的、基于磁盘的、具备完全的事务特性的Java持久化引擎

Neo4j也可以被看作是一个高性能的图引擎,

该引擎具有成熟数据库的所有特性。

Neo4j的优点

  • 以简易的方式显示节点和节点之间的连接

  • 能够简易且快速地进行数据的检索/遍历/导航

  • 容易表示半结构化数据

  • Neo4j CQL查询语言命令→人性化且易读易学

  • 使用简单而强大的数据模型

  • 不需要复杂的连接来检索连接起来的/相关的数据

    这句话机翻味道太浓了没看懂。。。。

Neo4j安装

Ubuntu安装Neo4j步骤

我的环境是Ubuntu,所以就记录这个

在通义搜的

  1. 更新系统包列表
1
sudo apt-get update
  1. 安装必要的依赖
1
sudo apt install curl
  1. 添加 Neo4jAPT仓库

3.1. 下载并添加Neo4jGPG密钥

1
curl -fsSL https://debian.neo4j.com/neotechnology.gpg.key | sudo gpg --dearmor -o /usr/share/keyrings/neo4j-archive-keyring.gpg

3.2. 添加Neo4jAPT仓库

1
echo "deb [signed-by=/usr/share/keyrings/neo4j-archive-keyring.gpg] https://debian.neo4j.com stable 4.4" | sudo tee /etc/apt/sources.list.d/neo4j.list
  1. 更新 APT包列表
1
sudo apt update
  1. 安装Neo4j

    安装的是Neo4j 社区版(Community Edition)

1
sudo apt install neo4j
  1. 启动Neo4j服务
1
sudo systemctl start neo4j
  1. 设置Neo4j开机自启
1
sudo systemctl enable neo4j
  1. 配置防火墙

    允许 Neo4j 的端口(默认是 7474 和 7687)通过防火墙

    允许HTTP端口7474

    允许Bolt端口7687

1
2
sudo ufw allow 7474/tcp
sudo ufw allow 7687/tcp
  1. 访问Neo4j命令行形式
1
cypher-shell

正确输入用户名和密码后,就可以进入命令行模式

用户名默认为:neo4j

密码是自己设置

  1. 访问Neo4j浏览器

如果是带有图形界面的操作系统,直接在浏览器访问http://localhost:7474即可,但是苯人的环境是命令行的,所以搞了ssh代理到本机localhost,使用本机Win系统的浏览器打开

  • 按照尝试,7474和7687好像都要代理过去
1
2
ssh -CNg -L 7474:127.0.0.1:7474 usernameOf服务器@ipAddressOf服务器
ssh -CNg -L 7687:127.0.0.1:7687 usernameOf服务器@ipAddressOf服务器

输入密码之后无回显无error就是成功了,然后再打开浏览器访问即可

成功访问Neo4j之后的界面

  1. 验证安装
1
sudo systemctl status neo4j
  1. 配置Neo4j(可选)
1
sudo nano /etc/neo4j/neo4j.conf
  1. 重启Neo4j(可选)
1
sudo systemctl restart neo4j

第二种安装方式

来自第一篇教程

  • 检查 jdk 环境 必须为 jdk 11
  • 下载安装包
  • 解压
1
tar -zxvf neo4j-chs-community-4.2.4-unix.tar.gz
  • 修改配置文件
1
vim conf/neo4j.conf
  • 放开访问权限
1
dbms.connectors.default_listen_address=0.0.0.0
  • 启动
1
./bin/neo4j start
  • 停止
1
./bin/neo4j stop
  • 访问 web 管理页面
1
http://ip:7474/browser

安装过程可能出现的问题——登录不成功

  • 问题描述:使用cypher-shell连接到Neo4j时遇到报错:
1
The client is unauthorized due to authentication failure.

原因:用户名或密码不正确

第一种解决方式:先无密码登录再修改密码
  • 解决方案和步骤:
  1. 确认用户名和密码

默认情况下,Neo4j 的初始用户名是 neo4j,初始密码在第一次启动时会提示设置

  1. 重置密码
  • 停止Neo4j服务
1
sudo systemctl stop neo4j
  • 启用无密码模式

通过编辑Neo4j配置文件,启用无密码模式

1
sudo nano /etc/neo4j/neo4j.conf

找到并取消注释以下行

1
dbms.security.auth_enabled=false
  1. 修改完再启动Neo4j服务
1
sudo systemctl start neo4j
  1. 使用cypher-shell登录
1
cypher-shell
  1. 重置密码

运行以下 Cypher 查询来重置密码

1
ALTER USER neo4j SET PASSWORD 'new_password'
  1. 禁用无密码模式

成功登录并修改密码后,再次编辑Neo4j配置文件,禁用无密码模式

1
sudo nano /etc/neo4j/neo4j.conf

注释掉或删除以下行

1
# dbms.security.auth_enabled=false
  1. 重启Neo4j服务
1
sudo systemctl restart neo4j
第二种方式:使用neo4j-admin命令重置密码

如果有root权限,可以使用neo4j-admin命令重置密码

  1. 停止Neo4j服务
1
sudo systemctl stop neo4j
  1. 重置密码
1
sudo neo4j-admin set-initial-password new_password
  1. 启动Neo4j服务
1
sudo systemctl start neo4j

排查Neo4j出错的方式

  1. 查看日志文件
1
sudo tail -f /var/log/neo4j/neo4j.log
  1. 查找日志中的错误信息

Neo4j 自带示例:Movie Graph

  • 节点创建
  • 节点查询
  • 关系查询

neo4j 自带示例:Movie Graph

Cypher查询语言

Cypher语言简单介绍

是一种声明式图数据库查询语言,

类似关系数据库中当中 SQL,Python 语言惯用做法

  • MATCH:匹配图模式
  • WHERE:过滤条件
  • RETURN:定义返回结果

Cypher基本语法

关键字作用
CREATE创建
MATCH匹配
RETURN加载
WHERE过滤检索条件
DELETE删除节点和关系
REMOVE删除节点和关系的属性(?机翻没看懂
ORDER BY排序
SET添加或更新属性
CREATE语法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
CREATE (<node-name>:<label-name>)
// 创建一个带有标签名“Employee”的节点“emp”。
CREATE (emp:Employee)

CREATE (
<node-name>:<label-name>
{
<Property1-name>:<Property1-Value>
........
<Propertyn-name>:<Propertyn-Value>
}
)

// 创建具有一些属性(deptno,dname,位置)的Dept节点
CREATE (dept:Dept { deptno:10,dname:"Accounting",location:"Hyderabad" })
MATCH语法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
MATCH 
(
<node-name>:<label-name>
)

// 查询Dept下的内容
MATCH (dept:Dept) return dept

// 查询Employee标签下 id=123,name="Lokesh"的节点
MATCH (p:Employee {id:123,name:"Lokesh"}) RETURN p

// 查询Employee标签下name="Lokesh"的节点,使用(where命令)
MATCH (p:Employee)
WHERE p.name = "Lokesh"
RETURN p
RETURN语法
1
2
3
4
5
6
RETURN 
<node-name>.<property1-name>,
........
<node-name>.<propertyn-name>

RETURN dept.deptno
DELETE 语法
1
2
3
4
5
6
7
8
9
10
11
// 删除节点子句
DELETE <node-name-list>
// 删除节点和关系子句
DELETE <node1-name>,<node2-name>,<relationship-name>

MATCH (e: Employee) DELETE e

MATCH (cc: CreditCard)-[rel]-(c:Customer)
DELETE cc,c,rel

match(aa:pig{name:"猪爷爷",age:12})-[r:夫妻]-(bb:pig{name:"猪奶奶",age:12}) delete aa,bb,r
REMOVE语法

删除节点或关系的标签、属性

1
2
3
4
5
6
7
8
9
10
REMOVE <property-name-list>

REMOVE <label-name-list>

MATCH (book { id:122 })
REMOVE book.price
RETURN book

MATCH (m:Movie)
REMOVE m:Picture
UNION语法

它将两组结果中的公共行组合并返回到一组结果中。

从两个节点返回重复的行

限制:结果列类型和来自两组结果的名称必须匹配,这意味着列名称应该相同列的数据类型应该相同

1
2
3
4
5
6
7
8
<MATCH Command1>
UNION
<MATCH Command2>


MATCH (cc:CreditCard) RETURN cc.id,cc.number
UNION
MATCH (dc:DebitCard) RETURN dc.id,dc.number

UNION语句示例

UNION ALL语法

它结合并返回两个结果集的所有行成一个单一的结果集。

它还返回两个结果集的重复行

限制:结果列类型和结果集的名字必须匹配,这意味着列名称应该是相同的,列的数据类型应该是相同的。

1
2
3
4
5
6
7
8
9
10
11
<MATCH Command1>
UNION ALL
<MATCH Command2>

MATCH (cc:CreditCard)
RETURN cc.id as id,cc.number as number,cc.name as name,
cc.valid_from as valid_from,cc.valid_to as valid_to
UNION ALL
MATCH (dc:DebitCard)
RETURN dc.id as id,dc.number as number,dc.name as name,
dc.valid_from as valid_from,dc.valid_to as valid_to

UNION ALL语句示例

LIMIT语法

LIMIT子句过滤或限制查询返回的行数

1
2
3
4
5
LIMIT <number>

MATCH (emp:Employee)
RETURN emp
LIMIT 2
SKIP语法

SKIP子句过滤或限制查询返回的行数

1
2
3
4
5
SKIP<number>

MATCH (emp:Employee)
RETURN emp
SKIP 2
Neo4j字符串函数

upper,lower,substring,replace四种字符串的操作,

其中upper与lower在将来的版本中会被修改为toupper/tolower

1
2
// 大写转换操作
MATCH (p:pig) RETURN toupper(p.name);
聚合函数

常用的聚合函数有COUNT、MAX、MIN、AVG、SUM等五种

1
MATCH (p:pig) return p.name as name,p.age as age,count(p) as count,max(p.age) as maxAge,min(p.age) as minAge,avg(p.age) as avgAge,sum(p.age) as sumAge;
关系函数
函数名功能描述
STARTNODE查找关系起点
ENDNODE查找关系终点
ID查找关系id
TYPE查找关系的类型,也就是我们在图中看到的名称
1
2
3
// 先获取关系,然后通过关系函数来获取关系 id,type,起始节点,终止节点等信息

MATCH ()-[r:父子]-() return startnode(r).name as start_node,endnode(r).name as end_node,id(r) as relationship_id,type(r) as realtionship_type

关系函数使用示例

Cypher语言一些使用例子

  1. 基本查找match return
1
2
3
4
5
6
7
8
9
// 创建两个节点,猪爸爸与猪妈妈,他们之间是属于夫妻关系
// 其中create表示新建
// p 表示这个节点的别名
// pig表示节点p的标签pig的属性
// {} 大括号中间的键值对,表示p这个节点作为pig这个标签类别所拥有的属性
// -[r:夫妻]-> 表示节点p指向节点f,他们之间的关系是夫妻,这个关系的别名是r,r可以拥有属于自己的属性
// return 表示执行这段语句之后,需要返回的对象,return p,r,f 表示返回 节点p,节点f,以及他们之间的关系r

CREATE (p:pig{name:"猪爸爸",age:5})-[r:夫妻]->(f:pig{name:"猪妈妈",age:4}) RETURN p,r,f;
  1. 查找指定节点、指定属性、指定关系的节点、关系
1
2
3
4
// MATCH 匹配命令
// return 后面的别名p还可以利用as 设置指定返回值名称,如:p as username

MATCH (p:pig{name:"猪爸爸"})-[r]-(n) RETURN p,r,n;
  1. 对查找结果进行排序order by,并限制返回条数limit

order by关键字与SQL里面是一样的操作,

后面跟上需要根据排序的关键字,

limit的操作是指定输出前几条

1
2
3
// 这里利用order by来指定返回按照Person.name来排序
// limit 表示只返回前3条数据
match(p:pig) return p order by p.name limit 3
  1. 删除节点delete命令

删除节点的操作也是通过delete来操作

如果被删除的节点存在Relationship,那么单独删除该节点的操作会不成功

所以想删除一个已经存在关系的节点,需要同时将关系进行删除。

1
2
3
4
5
6
// 删除指定条件的节点
// 先通过匹配关键字match找到匹配元素,然后通过delete关键字指定删除
MATCH (p:pig{name:"猪爸爸"}) delete p;

// 删除节点和节点相关的关系
MATCH (p:pig{name:"猪爸爸"})-[r]-() delete p,r;
  1. 删除属性remove 命令

remove命令是用来删除节点或者关系的属性

  1. 综合例子:小猪佩奇一家
  • 猪爷爷、猪奶奶
    • 猪爸爸、猪妈妈
      • 乔治、佩奇
  • 猪外公、猪外婆
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
// 创建基础节点
CREATE (:pig{name:"猪爷爷", age:12}),(:pig{name:"猪奶奶", age:9})

// 基于现有节点创建关系
MATCH(a:pig{name:"猪爷爷", age:12}) MATCH(b:pig{name:"猪奶奶", age:9}) CREATE (a) -[r:夫妻]->(b) RETURN r;

// 创建关系加节点
CREATE (:pig{name:"猪爸爸", age:5})-[:夫妻]->(:pig{name:"猪妈妈", age:4})

// 创建佩奇,乔治以及关系
CREATE (:pig{name:"佩奇", age:2}) -[:姐弟]->(:pig{name:"乔治", age:1})

//创建猪爷爷,猪爸爸关系
MATCH(c:pig{name:"猪爸爸",age:5}) MATCH(d:pig{name:"猪爷爷",age:12}) CREATE (d) -[r:父子]->(c) RETURN r;

//创建猪爸爸与佩奇关系
MATCH(c:pig{name:"猪爸爸",age:5}) MATCH(d:pig{name:"佩奇",age:2}) CREATE (c) -[r:父女]->(d) RETURN r;

//创建猪爷爷与佩奇关系
MATCH(c:pig{name:"猪爷爷",age:12}) MATCH(d:pig{name:"佩奇",age:2}) CREATE (c) -[r:孙女]->(d) RETURN r;

//创建猪奶奶与佩奇关系
MATCH(c:pig{name:"猪奶奶",age:9}) MATCH(d:pig{name:"佩奇",age:2}) CREATE (c) -[r:孙女]->(d) RETURN r;

//创建猪奶奶与猪爸爸关系
MATCH(c:pig{name:"猪奶奶",age:9}) MATCH(d:pig{name:"猪爸爸",age:5}) CREATE (c) -[r:母子]->(d) RETURN r;

//修改属性
MATCH (a:pig{name:"猪爸爸",age:5}) SET a.age=4;

//创建多标签节点
CREATE (a:die:pig{name:"猪祖父",age:15}) RETURN a.name;

//删除节点
MATCH (n:die) DELETE n;

Neo4j程序开发

  • java 嵌入式开发模式
    • neo4j 基于 java 语言开发的,在第一版发布之初是专门针对java 领域的,所以它能够与 java 开发天然结合, java 程序可以直接集成 neo4j 库至应用当中

java 嵌入式开发模式

  • 各语言驱动包开发模式
    • 毕竟 neo4j 是一门数据库,其使用范围 肯定不能局限于java 应用,为了满足其他语言的调用,Neo4j 引入了驱动开发模式

各语言驱动包开发模式

  • Copyrights © 2024-2025 brocademaple
  • 访问人数: | 浏览次数:

      请我喝杯咖啡吧~

      支付宝
      微信