Neo4j图数据库

Neo4j

官网:https://neo4j.com/

数据库简介

在这里插入图片描述

关系型数据库

传统关系型数据库:由二维表构成,将高度结构化的数据存在具有某些类型信息的二维表中并严格遵循三范式。

关系型数据库为了维护数据的一致性付出了巨大的代价,读写性能比较差。在面对高并发读写性能非常差,面对海量数据的时候效率非常低。

在这里插入图片描述

NoSQL数据库

用来处理关系型数据库难以解决的一系列问题。

NoSQL数据库分为Graph,Document,Column Family以及Key-Value Store等四种。

在这里插入图片描述

相比于图数据库,其他NoSQL数据库不处理关系
–	没有数据结构建模或存储数据关系
–	没有查询结构支持数据关系
–	在应用中连接数据需要”JOIN逻辑”
–	对事务没有ACID支持

图数据库

在这里插入图片描述

图数据库是NoSQL数据库的一种。是基于数学里的图论的思想和算而实现的高效处理复杂关系网络的新型数据库系统。适合于关系性强的数据。例如社交网络,推荐系统等。

由节点和关系组成的图,利用图结构的相关算法。不利于数据分布存储

常见图数据库

目前市场上主流图数据库: Neo4j、Arangob、Orientdb、Allegrograph、Ontotext Graphdb、Graph Story、Titan、Stardog、Graphbase、Dgraph、Oracle Space And Graph、Hypergraphdb、Blazegraph、Aster、Sparksee、Velocitygraph、Sqrrl Enterprise、Ibm System G Native Store、Graph Engine、Thingspan、Bitsy、Apache Giraph、Flockdb、Infogrid、Grapholytic,Weaver等

在这里插入图片描述

图数据库存储模型

属性图:

在这里插入图片描述

包含节点和关系
节点可以有属性,可以有一个或多个标签
关系有名字和方向,并总是有1个开始节点和结束节点
关系也可以有属性

超图

在这里插入图片描述

三元组

主谓宾结构
由 起始节点-关系-终止节点 构成
["张三","拥有10%","房A"],
["张三","拥有20%","房B"],
["张三","拥有70%","房C"],
["李四","拥有90%","房A"],
["李四","拥有80%","房B"],
["李四","拥有30%","房B"]
关系型数据库的弊端
建模难性能低查询难扩展难
不复杂就不能建模和存储数据和关系随着关系数量和层次的增加,数据库尺寸的增加性能降低对于关系查询,需要 JOIN 操作,查询复杂性成倍增加增加新类型的数据和关系 需要重新设计模式
Join操作:关系型数据库通过外键约束来实现两个或多个表中某些数据的关系。当需要检索两个数据之间的关系,将通过外键来扫描另一张表的匹配的键,这样每次的关联都要进行表中记录数的指数级别的操作。需要消耗大量的系统资源。
图数据库的优势

在这里插入图片描述

图数据库中 "关系" 是最重要的元素。通过关系能够将节点相互连接起来构建复杂模型。
图数据库模型中每个节点都包含一个"关系列表",来存放此节点与其他节点的关系记录。当访问关系时,则会之间应用此列表来进行访问。无需进行记录搜索和匹配。
将节点和关系预先保存在关系列表中的这种方式在访问关系时将比关系型数据库有高几个数量级的性能。

Neo4j简介

Neo4j是一个流行的开源的图形数据库

Neo4j基于Java实现,兼容ACID特性,也支持其他编程语言,如R和Python。

Neo4j优势

在这里插入图片描述

Neo4j关键产品特征

在这里插入图片描述

Neo4j存储结构

宏观存储结构

从宏观角度讲,Neo4j中仅由两种数据类型:节点关系

其以列表的方式进行存储

在这里插入图片描述

节点:内置ID,属性为name

╒════════════════╕
│"Node"          │
╞════════════════╡
│{"name":"中药组合物"}│
├────────────────┤
│{"name":"颗粒剂"}  │
├────────────────┤
│{"name":"胶囊剂"}  │
├────────────────┤
│{"name":"熏香"}   │
├────────────────┤
│{"name":"舒护液"}  │
└────────────────┘

关系:有内置ID及关系的属性,并有起始节点和终止节点的信息

╒════════════════════════════════════════════════════════════╕
│"Relationship"                                              │
╞════════════════════════════════════════════════════════════╡
│[{"name":"中药组合物"},{"rel":"下位词"},{"name":"治疗癌症的中药组合物"}]      │
├────────────────────────────────────────────────────────────┤
│[{"name":"中药组合物"},{"rel":"下位词"},{"name":"稳定血糖和治疗糖尿病的中药组合物"}]│
├────────────────────────────────────────────────────────────┤
│[{"name":"中药组合物"},{"rel":"下位词"},{"name":"治疗甲状腺的中药组合物"}]     │
├────────────────────────────────────────────────────────────┤
│[{"name":"中药组合物"},{"rel":"下位词"},{"name":"治疗脑卒中的中药组合物"}]     │
├────────────────────────────────────────────────────────────┤
│[{"name":"中药组合物"},{"rel":"下位词"},{"name":"治疗跌打损伤的中药组合物"}]    │
└────────────────────────────────────────────────────────────┘

底层存储结构

存储文件(.db文件)

采用定长存储:实体固定9字节,关系33字节。ID则可以推理出存储位置 如(ID*9)

节点

在这里插入图片描述

如果我们想查找一个ID为100的节点,那么可以快速的查询到存储文件中的第900字节。基于这种查询方式其成本为O(1)。

关系

在这里插入图片描述

在通过关系进行查询时,关系型数据库会通过join等方式来进行表的关联操作,这种方式的效率是非常低的。而在Neo4j中通过关系ID可以得知来确定存储位置并获取起始节点和终止节点的所有信息

属性、索引、关系类型 等的存储文件

都是固定长度的存储记录,可通过id来快速计算出存储位置

关系类型 9字节
属性 33字节
属性索引 9字节

免索引邻接

数据库中的每个节点都会维护与它相邻节点的引用,在通过ID推理出一个实体或关系的信息后,可以根据其记录的下一个节点或关系的信息来根据ID推理存储位置

在这里插入图片描述

查询遍历方式

在这里插入图片描述

通过固定大小的存储记录和指针ID,跟随指针即可实现高速遍历 和 基于免索引邻接和对属性等索引的构建,这是Neo4j的对关系数据的高效遍历的秘密。

Neo4j的存储优化

Neo4j支持压缩和内联存储属性值

内联存储属性值:将短字符串属性直接内联到属性存储文件中,将大量减少IO操作

Neo4j也采用了缓存策略,基于页面置换算法。

Neo4j实操

Neo4j安装步骤(Linux)

#安装JDK
curl -O http://dist.neo4j.org/neo4j-community-3.4.5-unix.tar.gz
#官网下载离线包、应用yum源、docker镜像等 均可

tar -zxvf neo4j-community-3.4.5-unix.tar.gz -C ../module/

#添加环境变量NEO4J_HOME

Neo4j目录结构

bin  #脚本和其他可执行文件
conf #服务器配置
data #用于存储核心数据库文件
lib  #依赖的jar包管理
plugins #插件管理
logs #日志文件
import #加载CSV文件的位置
run #运行时记录的信息

数据库启动/停止/查看状态

#bin目录
#启动
bash neo4j start 
#查看查看状态
bash neo4j status
#停止
bash neo4j stop

#neo4j-admin 数据库管理相关

修改配置文件

conf/neo4j.conf

# 1.注释第22行load csv时的路径,在前面加个#,可从任意路径读取文件
# dbms.directories.import=import
# 2.修改54行,去掉改行的#,可以远程通过ip访问neo4j数据库
dbms.connectors.default_listen_address=0.0.0.0
# 3.修改227行,去掉#,允许从远程url来load csv 
dbms.security.allow_csv_import_from_file_urls=true
# 4.修改254行,设置neo4j可读可写
dbms.read_only=false


# 修改35行和36行,设置JVM初始堆内存和JVM最大堆内存
# 生产环境给的JVM最大堆内存越大越好,但是要小于机器的物理内存
dbms.memory.heap.initial_size=5g
dbms.memory.heap.max_size=10g

# 修改46行,可以认为这个是缓存,如果机器配置高,这个越大越好
dbms.memory.pagecache.size=10g


# 默认 bolt端口是7687,http端口是7474,https关口是7473,不修改下面3项也可以
# 修改71行,去掉#,设置http端口为7687,端口可以自定义,只要不和其他端口冲突就行
dbms.connector.bolt.listen_address=:7687

# 修改75行,去掉#,设置http端口为7474,端口可以自定义,只要不和其他端口冲突就行
dbms.connector.http.listen_address=:7474

# 修改79行,去掉#,设置https端口为7473,端口可以自定义,只要不和其他端口冲突就行
dbms.connector.https.listen_address=:7473

# 修改246行,允许使用neo4j-shell,类似于mysql 命令行之类的
dbms.shell.enabled=true

# 修改235行,去掉#,设置连接neo4j-shell的端口,一般都是localhost或者127.0.0.1,这样安全,其他地址的话,一般使用https就行
dbms.shell.host=127.0.0.1

# 修改250行,去掉#,设置neo4j-shell端口,端口可以自定义,只要不和其他端口冲突就行
dbms.shell.port=1337

Cypher

Cypher图查询语言

Cypher是Neo4j的图形查询语言,允许用户存储和检索图形数据库中的数据。类似关系数据库中的SQL,Cypher设计借鉴了基于SQL、Python语言惯用做法。

书写技巧:

实体用 ( ) 包裹,每个实体用 , 进行分隔,用 : 进行筛选
关系用 [ ] 包裹
属性用 { } 包裹,用 : 进行筛选
实体与关系用-> 、<- 、<-[...]->来表达

命名规范:
实体:小写 entity
标签:驼峰式 Label
关系:大写 RELATION

常用关键字

create 创建
create (n:Person{name:"张"});//创建单节点
create (:Person{name:"李"}),(:Person{name:"王"}),(:Person{name:"赵"});//创建多个节点
create (:Person{name:"李"})-[:FRIEND]->(:Person{name:"王"});//创建节点和关系

match 查询

return 返回值

match (n:Person{name:"李"}) return n;
match (n) return n limit 5;
match (n)-[]->() return n;//查看有下级关系的节点
match (n)-[r]->(n2) return r,n,n2 limit 5;//查看所有符合的节点和关系

merge 合并/创建
//merge可创建节点和关系,并会忽略已有的节点和关系 
//create创建时会重复创建
merge (n1:Person{name:"张"})-[r:FRIEND]->(n2:Person{name:"王"}) return n1,r,n2;
match (n1:Person{name:"赵"}),(n2:Person{name:"李"}) merge (n1)-[r:FRIEND]-(n2) return n1,r,n2;

where 过滤条件

and,or,not,xor

match (n:Person) where n.name="王" return n.id; 

set 设置属性
match (n:Person) where n.name="王" set n.name="王五" return n;

remove 移除属性
match (n:Person) where n.name="张" remove n.name return n;

delete 删除节点或关系
//先删除关系
match ()-[r:FRIEND]-() delete r;
match (n:Person{name:"张"}) delete n;
match (n) detach delete n; //清空数据库

排序
ORDER BY

合并结果
union 
union all

限制 limit 、 skip
limit
skip

索引

//创建索引。
CREATE INDEX ON :Person(name);
//创建唯一性约束,同时具有索引效果,类似关系型数据库中的主键。注意,这只能在数据库中还未插入数据时设置。
CREATE CONSTRAINT ON (a:Person) ASSERT a.name IS UNIQUE;

常用函数

//常用函数
//type() #获取关系类型
match (n:Person{name:"张"})-[r]->(n:Person{name:"王"}) return type(r),r
                                                                 
//distinct() #去重 
                                           
//count(),sum(),max(),min(),avg() #聚合
                                           
//shortestPath() #查询节点最短路径
match p=shortestPath((:Person {name:"张"})-[*]-(:Person {name:"王"})) return p
                                                
//断言函数:
node(),nodes()                                                     
all() //判断是否一个断言适用于列表中的所有元素
match (n) where all(x in nodes(n) where n.name="李"); 
any()  //判断是否一个断言至少适用于列表中的一个元素
none()
single()
exists() //可能经常使用
	MATCH (n) WHERE exists(n.name) return count(n)
//标量函数
toInt() //将字符串解析为整型
toFloat() //.....   浮点型
size() //列表长度
length() //路径/字符串长度
type() //返回字符串代表的关系类型。
coalesce() //返回表达式列表中的第一个非空的值
	return coalesce(["",null,1,2,3])
id() //返回节点id                                                         
head() //返回列表中第一个节点
last() //返回列表中最后一个节点
timestamp() //返回当前时间戳(毫秒)
	RETURN timestamp()
startNode() //
endNode() //
     MATCH ()-[r]-()  RETURN startNode(r),endNode(r)      
...                                                        
//集合函数
nodes() //作用path 返回所有节点
relationships() //作用path 返回所有关系
keys() //可以为节点和关系
labels() //参数为node 返回标签
	MATCH (a) WHERE a.name = "张" RETURN labels(a)
extract() //将列表中的每个元素映射/转化为新的元素 (map)
	return extract( ele IN ["张","李","王"] | ele+"刚")
filter() //过滤列表中的元素
	return filter(n in range(0,10) where n%2=0)
tail() //返回除去首元素之后的元素
	return tail(range(1,3))
range() //返回一个范围列表 两端闭合
    return range(1,10) //-> [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
reduce()
	return reduce(s=0,num in range(1,10) | s + num) //55                          
//字符串函数
replace()
substring()
left()
right()
ltrim()
rtrim()
trim()
lower()
upper()
split()
reverse()
toString()

Neo4j数据导入

在这里插入图片描述

Load CSV
//预览前10行 未真正导入
LOAD CSV WITH HEADERS FROM "file:///opt/module/neo4j-community-3.4.5/import/patent.csv" AS line With line return line  limit 10

//导入节点
LOAD CSV WITH HEADERS FROM "file:///opt/module/neo4j-community-3.4.5/import/patent.csv" AS line merge (p:Patent{name:line.h});
                                                                                   LOAD CSV WITH HEADERS FROM "file:///opt/module/neo4j-community-3.4.5/import/patent.csv" AS line merge (p:Patent{name:line.t});

//为属性建立索引                                                                     
CREATE INDEX ON :Patent(name);  

//导入关系
using periodic commit 100 LOAD CSV WITH HEADERS  FROM "file:///opt/module/neo4j-community-3.4.5/import/patent.csv" AS line match (n1:Patent{name:line.h}),(n2:Patent{name:line.t}) merge (n1)<-[r:RELATION{rel:line.r}]->(n2);

//with headers 指定表头
//as line 按行读取时,以line为行变量
//using periodic commit 100 事务提交 每100条提交一次任务 放在最前

neo4j-admin import

首先 设置CSV文件头格式

属性

数据类型可以是int,long,float,double,boolean,byte,short,char,string。
不指定默认string
直接命名 name

节点

必填字段:ID,LABEL
设置ID字段  name:ID
设置标签 例如    :LABEL 

关系

必填字段:TYPE,START_ID,END_ID
例如 关系类型,起始节点,终止节点,属性name
:TYPE,:START_ID,:END_ID,name

命令

#neo4j-admin 数据导入,速度快占用资源少,只适用于建库初次导入
#neo4j-admin import 命令
bash neo4j-admin import 
--database graph.db #指定数据库
--nodes /opt/module/neo4j-community-3.4.5/import/entity.csv  #导入节点文件
--ignore-duplicate-nodes=true #忽略重复节点
--ignore-missing-nodes=true #忽略不存在的节点
--relationships  /opt/module/neo4j-community-3.4.5/import/relationship.csv  #导入关系文件

#neo4j-admin import 数据导入
bash neo4j-admin import --database graph.db --nodes /opt/module/neo4j-community-3.4.5/import/entity.csv --ignore-duplicate-nodes=true --ignore-missing-nodes=true --relationships  /opt/module/neo4j-community-3.4.5/import/relationship.csv  

Neo4j数据库备份与还原

neo4j-admin dump
#首先停止数据库
#数据库备份
bash neo4j-admin dump --database graph.db --to /opt/module/neo4j-community-3.4.5/import/20210419.db
#备份文件为二进制文件,可压缩

neo4j-admin load
#数据库还原/迁移
bash neo4j-admin load --from /opt/module/neo4j-community-3.4.5/import/20210419.db --database=graph.db --force
#启动数据库

社区资源

Neo4j社区
Neo4j有一个很活跃的社区。
如果你想学到更多关于Neo4j的知识,从Neo4j.org开始,这是提供了很多深入学习Neo4j的选项的社区网站。
如果你遇到了比较神奇的问题,也可以上Stackoverflow看看大神的意见。或是到Neo4j Google Group来讨论图建模问题、Neo4j生态圈还有产品功能什么的。
如果你想看看Neo4j背后的更多公司及企业级功能、我们可以提供的支持包,你应该到NeoTechnology.com看看。
-下载 Neo4j并开发你的第一个Neo4j项目
-在Stack Overflow上问问题
-在Neo4j’s Google Group上讨论新点子
-瞅瞅Neo4j Documentation
-使用Neo4j Cypher Reference Card

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值