Neo4j入门

一、介绍

Neo4j是一个开源的图形数据库管理系统,它基于Java语言开发。与传统的关系型数据库不同,Neo4j使用图形结构来存储和查询数据,这使得它在处理复杂关系时更加高效和灵活。

Neo4j的核心特性包括

1. 图形结构:Neo4j的数据模型是基于图的,每个节点表示一个实体,每个边表示两个实体之间的关系。这种结构使得Neo4j非常适合处理复杂的关系问题,例如社交网络、推荐系统等。

2. 快速查询:由于Neo4j采用基于路径的查询方式,因此它的查询速度非常快。相比之下,传统的关系型数据库需要遍历整个表才能找到所需的数据,这会导致性能问题。

3. 灵活性:Neo4j支持动态模式,这意味着它可以轻松地适应不断变化的数据模式。此外,Neo4j还支持ACID事务,确保数据的一致性和可靠性。

4. 可扩展性:Neo4j可以通过添加更多的节点和边来扩展其数据模型,这使得它非常适合处理大规模数据集。此外,Neo4j还支持集群部署,以提高可扩展性和容错能力。

总之,Neo4j是一个功能强大、灵活、高效的图形数据库管理系统,适用于处理各种复杂的关系问题。

Neo4j的优点和缺点

优点:

1. 高效的数据模型:Neo4j采用基于图的数据模型,可以更加高效地处理复杂的关系问题。相比之下,传统的关系型数据库需要遍历整个表才能找到所需的数据,这会导致性能问题。

2. 灵活的数据操作:Neo4j支持动态模式,可以轻松地适应不断变化的数据模式。此外,Neo4j还支持ACID事务,确保数据的一致性和可靠性。

3. 易于扩展:Neo4j可以通过添加更多的节点和边来扩展其数据模型,这使得它非常适合处理大规模数据集。此外,Neo4j还支持集群部署,以提高可扩展性和容错能力。

4. 可视化工具:Neo4j提供了一些可视化工具,如Cypher和Gremlin,可以帮助用户更加方便地管理和查询数据。

缺点:

1. 学习成本高:相对于传统的关系型数据库,Neo4j的学习成本较高,需要一定的学习曲线。

2. 不支持SQL:Neo4j不支持SQL语言,需要使用Cypher或Gremlin等专门的语言进行查询和管理。

对比MySQL数据库:

与MySQL数据库相比,Neo4j的优点在于它更加适合处理复杂的关系问题,具有更高的效率和灵活性。而MySQL则更加适合处理结构化数据,具有更好的扩展性和可靠性。因此,选择使用哪种数据库取决于具体的应用场景和需求。如果需要处理复杂的关系问题,建议使用Neo4j;如果需要处理结构化数据,建议使用MySQL。

二、安装

1)官网下载

官网下载中心:https://go.neo4j.com/download-thanks.html?edition=community&release=3.5.28&flavour=winzip

直接下载解压就可以,进入bin目录,黑框启动,如下

image-20230509224317540

打开http://localhost:7474,输入账号密码neo4jneo4j就成功启动啦

2)Docker镜像容器

1
2
3
docker pull neo4j:3.5.28-community

docker run -d -p 7474:7474 -p 7687:7687 --name neo4j -e "NE04J_AUTH=neo4j/123456" -v /usr/local/soft/neo4j/data:/data -v /usr/local/soft/neo4j/logs:/logs -v /usr/local/soft/neo4j/conf:/var/lib/neo4j/conf -v /usr/local/soft/neo4j/import:/var/lib/neo4j/import neo4j:3.5.28-community

这个就不演示了

三、CQL语句

官网:Clauses - Cypher Manual (neo4j.com)

1)create

创建没什么好说的,可以创建节点、关系

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// 创建一个单独的节点
create (n:person {name:'半月无霜'}) return n

// 创建多个独立的节点
create (n:person {name:'小明'}),(m:person {name:'小红'}) return n,m

// 创建多个节点,且节点之间有关系
create (n:person {name:'孙悟空'})-[r:关系 {label: '师弟'}]->(m:person {name:'猪八戒'}) return n,m

// 创建一个关系,作用于已有的节点
// 本质就是先查询出两个节点,再创建这两个节点的关系
match (n:person),(m:person)
where n.name = '小明' and m.name = '小红'
create (n)-[r:关系 {label: '同学'}]->(m)
return n.name, r.label, m.name

2)delete

删除节点,关系

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// 删除节点,先查询到,再删除
match (n:person {name: '半月无霜'}) delete n
// 也可以使用where进行查询
match (n:person) where n.name = '半月无霜' delete n

// 如果删除节点报错,可能是因为节点上有关系,要先删除关系,才能把节点删除
// 删除节点上的所有关系,并删除该节点
match (n:person)-[r:`关系`]-()
where n.name = '小明'
delete r,n

// 删除关系,但不删除节点
match ()-[r:`关系`]->()
where r.label = '师弟'
delete r

3)set、remove

  • set:节点上面有属性,我们可以对其进行更新

  • remove:节点上面有属性,我们可以对其进行移除

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
// 修改节点的属性
match (n:person {name: '小红'}) set n.name = '红孩儿'

// 修改关系的属性,比如说孙悟空的师父是猪八戒,这明显是错误的,我们要将其纠正
match (n:person {name: '孙悟空'})-[r:`关系`]->(m:person {name: '猪八戒'})
set r.label = '师弟'
return n,r,m

// 修改节点的label
match (n:person)
set n:`西游记`
remove n:person

// 删除节点的一个属性,并新增外号
match (n:`西游记` {name: '孙悟空'}),(m:`西游记` {name: '红孩儿'}),(l:`西游记` {name: '猪八戒'})
set n.nickname = '齐天大圣', m.nickname = '牛圣婴', l.nickname = '猪刚鬣'
remove n.name,m.name,l.name
return n

4)match

用于匹配查找,上面已经用到了许多,不再详细展开了

上面的一些操作,简单来说就是

  1. 先匹配找到节点或关系

  2. 再对其节点或关系进行操作

上面没提到的操作关键字

关键字 说明
return 返回结果
where 进行where条件匹配

下面再来看几组匹配的查询把

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
// 查询单独一个节点
match (n:`西游记`)
where n.nickname = '齐天大圣'
return n

// 如果查询其中的属性
match (n:`西游记`)
return n.nickname

// 查询有师弟关系的所有节点
match (n)-[r:`关系`]->(m)
where r.label = '师弟'
return n,r,m

// 查询节点有关系的所有其他节点和关系,*代表的是层级关系,不填则为与节点的直接关系
match p=(n:`西游记`)-[r*]->(m)
where n.nickname = '齐天大圣'
return p

四、最后

使用Neo4j学起来比以前的MySQL简单,但这仅仅是入门,后面估计还有很多坑没有踩呢。

我是半月,你我一同共勉!!!