目录
一、数据模型基础
1.1 图论基础
图是一组节点和连接这些节点的关系,图形以属性的形式将数据存储在节点和关系中,属性是用于表示数据的键值对。
在图论中,我们可以表示用圆表示节点,节点之间的关系用一个箭头标记表示。
最简单的可能图是单个节点:
在两个节点之间创建关系:
1.2 属性图模型
属性图模型规则
- 表示节点,关系和属性中的数据
- 节点和关系都包含属性
- 关系连接节点
- 属性是键值对
- 节点用圆圈表示,关系用方向键表示。
- 关系具有方向:单向和双向。
- 每个关系包含"开始节点"或"从节点”和“到节点"或"结束节点”
在属性图数据模型中,关系应该是定向的。如果我们尝试创建没有方向的关系,那么它将抛出一个错误消息,“关系应该是方向性的"。
图数据库数据模型的主要构建块是:
- 节点
- 关系
- 属性
简单的属性图的例子:
这里我们使用圆圈表示节点。使用箭头表示关系, 关系是有方向性的。
我们可以用Properties (键值对)来表示Node的数据。
二、Neo4j的构建元素
Neo4j图数据库主要有以下构建元索:
- 节点
- 属性
- 关系
- 标签
- 数据浏览器
2.1 节点
节点(Node)是图数据库中的一个基本元索,用来表示一个实体记录,就像关系数据库中的一条记录一 样。
在Neo4j中节点可以包含多个属性(Property)和多个标签(Label)。
- 节点是主要的数据元索
- 节点通过关系连接到其他节点
- 节点可以具有一个或多个属性(即,存储为键/值对的属性)
- 节点有一个或多个标签,用于描述其在图表中的作用
2.2 属性
属性(Property)是用于描述图节点和关系的键值对。其中Key是一个字符串, 值可以通过使用任何Neo4j数据类型来表示
- 属性是命名值,其中名称(或键)是字符串
- 属性可以被索引和约束
- 可以从多个属性创建复合索引
2.3 关系
关系(Relationship) 同样是图数据库的基本元素。当数据库中已经存在节点后,需要将节点连接起来构成图。关系也称为图论的边(Edge) ,其始端和末端都必须是节点,关系不能指向空也不能从空发起。
关系和节点一样可以包含多个属性,但关系只能有一个类型(Type)。
- 关系连接两个节点
- 关系是方向性的
- 节点可以有多个甚至递归的关系
- 关系可以有一个或多个属性(即存储为键/值对的属性)
基于方向性,Neo4j关系被分为两种主要类型:
- 单向关系
- 双向关系
2.4 标签
标签(Label)将一个公共名称与一组节点或关系相关联,节点或关系可以包含一个或多个标签。我们可以为现有节点或关系创建新标签,我们可以从现有节点或关系中删除标签。
- 标签用于将节点分组
- 一个节点可以具有多个标签
- 对标签进行索引以加速在图中查找节点
- 本机标签索引针对速度进行了优化
2.5 Neo4j Browser
一旦我们安装Neo4j, 我们就可以访问Neo4j数据浏览器
htp://192.168.65.200:7474/0w5er/
三、环境搭建
3.1 安装neo4j
下载地址:neo4j.com/download-center/
下载时注意jdk版本。我下载了一个windows版本的。
使用说明:Thanks for Downloading Neo4j - Neo4j Graph Database Platform
运行截图:
运行后,可以在浏览器上查看数据库的相关信息(首次登陆会提示修改密码,我的密码改成了123456):
如果启动时失败或者闪退,见:把Neo4j安装为windows服务之后,无发启动服务是怎么回事? - Neo4j 图数据库中文社区
3.2 docker按钻过neo4j
- 7474 for HTTP.
- 7473 for HTTPS.
- 7687 for Bolt.
拉取镜像
docker pu11 neo4j:3.5.22-community
运行镜像
docker run -d -p 7474:7474 -p 7687:7687 --name neo4j \
-e "NEO4J_ AUTH=neo4j /123456" \
-V /usr/1oca1/soft/neo4j/data:/data \
-V /usr/1oca1/soft/neo4j/logs:/logs \
-V /usr/1oca1/soft/neo4j/conf:/var/1ib/neo4j/conf \
-V /usr/loca1/soft/neo4j/import:/var/1ib/neo4j/import \
neo4j:3.5.22-community
四、CQL使用
4.1 简介
Neo4j的Cypher语言是为处理图形数据而构建的,CQL代表Cypher查询语言。 像Oracle数据库具有查询语言SQL, Neo4j具有CQL作为查询语言。
- 它是Neo4j图形数据库的查询语言。
- 它是一种声明性模式匹配语言
- 它遵循SQL语法。
- 它的语法是非常简单且人性化、可读的格式。
(fox)<-[:knows]-(周瑜)-[:knows]->(诸葛)-[:knows]->(fox)
4.2 常用命令
官方手册:Clauses - Neo4j Cypher Manual
4.2.1 CREATE
create语句是创建模型语句用来创建数据模型
创建节点
#创建简单节点
create (n)
#创建多个节点
create (n),m)
#创建带标签和属性的节点并返回节点
create (n:person {name:'如来'})return n
创建关系
Neo4j图数据库遵循属性图模型来存储和管理其数据。根据属性图模型,关系应该是定向的。否则,Neo4j将抛出一 个错误消息。
基于方向性, Neo4关系被分为两种主要类型。
- 单向关系.
- 双向关系
#使用新节点创建关系
CREATE (n:person {name:'杨戬'})-[r:`师傅`]->
(m:person {name:'玉鼎真人'}) return type(r)
match (n:student {name:"小明"}), (m:student {name:"小红"})
create (n)-[r:同学]->(m) return n.name, type(r) , m.name
4.2.2 RETURN 返回
Neo4j CQL RETURN子句用于
- 检索节点的某些属性
- 检索节点的所有属性
- 检索节点和关联关系的某些属性
- 检索节点和关联关系的所有属性
MATCH (n:`西游`) RETURN id(n) ,n.name ,n.tail,n.relation
4.2.3 WHERE子句
像SQL一样, Neo4j CQL在CQL MATCH命令中提供了WHERE子句来过滤MATCH查询的结果。
MATCH (n:person) where n.name='孙悟空' or n.name='猪八戒'RETURN n
#创建关系
match (n:person), (m:person) where n.name='孙悟空' and m.name='猪八戒'
create (n)-[r:师弟]->(m) return n.name, type(r) ,m.name
4.2.4 DELETE删除
Neo4j使用CQL DELETE子句
- 删除节点。
- 删除节点及相关节点和关系。
#删除节点(前提:节点不存在关系)
MATCH (n:person{name:"白龙马"}) delete n
#删除关系
MATCH (n:person{name:"沙僧"})<-[r]-(m) delete r return type(r)
4.2.5 REMOVE 删除
有时基于客户端要求,我们需要向现有节点或关系添加或删除属性。我们使用Neo4j CQL REMOVE子句来删除节点或关系的现有属性。
- 删除节点或关系的标签
- 删除节点或关系的属性
#删除属性
MATCH (n:role {name:"fox"}) remove n.age
return n
#创建节点
CREATE (m:role:person {name:"fox666"})
#删除标签
match (m:role:person {name:"fox666"]}) remove m:person return m
REMOVE和DELETE区别:
- DELETE语句用于删除节点和关联关系
- REMOVE语句用于删除标签和属性
4.2.6 SET子句
有时,根据我们的客户端要求,我们需要向现有节点或关系添加新属性。要做到如下功能:
- 向现有节点或关系添加新属性
- 添加或更新属性值
MATCH (n:role {name:"fox"}) set n.age=32 return n
4.2.7 ORDER BY 排序
Neo4j CQL在MATCH命令中提供了"ORDER BY"句,对MATCH查询返回的结果进行排序。
我们可以按升序或降序对行进行排序。
默认情况下,它按升序对行进行排序。如果我们要按降序对它们进行排序, 我们需要使用DESC子句。
MATCH (n:`西游`) RETURN id(n), n.name order by id(n) desc
4.2.8 UNION子句
与SQL-样, Neo4j CQL有两个子句,将两个不同的结果合并成一组结果
UNION
- 它将两组结果中的公共行组合并返回到一组结果中。它不从两个节点返回重复的行。
- 限制:结果列类型和来自两组结果的名称必须匹配,这意味着列名称应该相同,列的数据类型应该相同。
UNION ALL
- 它结合并返回两个结果集的所有行成一个单一 的结果集。 它还返回由两个节点重复行。
- 限制: 结果列类型,并从两个结果集的名字必须匹配,这意味着列名称应该是相同的,列的数据类型应该是相同的。
4.2.9 LIMIT和SKIP子句
Neo4j CQL已提供LIMIT子句和SKIP来过滤或限制查询返回的行数。
LIMIT返回前几行,SKIP忽略前几行。
#前两行
MATCH (n: `西游`) RETURN n LIMIT 2
#忽略前两行
MATCH (n:person) RETURN n SKIP 2
4.2.10 NULL 值
Neo4j CQL将空值视为对节点或关系的属性的缺失值或未定义值。
当我们创建一个具有现有节点标签名称但未指定其属性值的节点时,它将创建一个具有NULL属性值的新节点。
match (n:`西游`) where n.1abe1 is nu11 return id(n) ,n.name ,n.tail,n.1abel
4.2.11 IN操作符
与SQL一样, Neo4j CQL提供了一个IN运算符,以便为CQL命令提供值的集合。
match (n: `西游`) where n.name in['孙悟空','唐僧']
return id(n) ,n.name ,n tail,n.label
4.2.12 INDEX 索引
Neo4j SQL支持节点或关系属性上的索引,以提高应用程序的性能。
我们可以为具有相同标签名称的所有共占的属性创建索引
我们可以在MATCH或WHERE或IN运算符上使用这些索引列来改进CQL Command的执行。
Neo4J索引操作
- Create Index创建索引
- Drop Index丢奔索引
#创建索引
create index on :`西游` (name)
#删除索引
drop index on :`西游` (name)
4.2.13 UNIQUE约束
在Neo4j数据库中,CQL CREATE命令始终创建新的节点或关系,这意味着即使您使用相同的值,它也会插入一个新行。根据我们对某些节点或关系的应用需求,我们必须避免这种重复。
像SQL一样,Neo4j数据库也支持对NODE或Relationship的属性的UNIQUE约束
UNIOUF约束的优点
- 避免重复记录。
- 强制执行数据完整性规则
#创建唯-约束
create constraint on (n:xiyou) assert n.name is unique
#删除唯-约束
drop constraint on (n:xiyou) assert n.name is unique
4.2.14 DISTINCE
这个函数的用法就像SQL中的distinct关键字,返回的是所有不同值。
match (n: `西游`) return distinct (n.name)
4.3 常用函数
4.3.2 字符串函数
与SQL一样, Neo4J CQL提供了-组String函数,用于在CQL查询中获取所需的结果。
MATCH (e) RETURN id(e), e.name, substring(e.name, 0, 2)
4.3.3 AGGREGATION聚合
和SQL一样, Neo4j CQL提供了一些在RETURN子句中使用的聚合函数。它类似于SQL中的GROUP BY句。
我们可以使用MATCH命令中的RETURN + 聚合函数来处理一组节点并返回一些聚合值。
MATCH (e) RETURN count(e)
4.3.4 关系函数
Neo4j CQL提供了一组关系函数, 以在获取开始节点,结束节点等细节时知道关系的细节。
match (a)-[r]->(b) return id(r),type(r)
五、neo4j-admin的使用
5.1 备份
对Neo4j数据进行备份、还原、迁移的操作时,要关闭neo4j
cd %NE04J_HOME%/bin
#关闭neo4j
neo4j stop
#备份
neo4j-admin dump --database=graph.db --to=/neo4j/backup/graph_backup.dump
5.2 还原
还原、迁移之前,要关闭neo4j服务。
#数据导入
neo4j-admin 1oad --from=/neo4j/backup/graph backup.dump --database=graph.db --force
#重启服务
neo4j start