Neo4j数据库简介

本文涉及的产品
云原生数据库 PolarDB MySQL 版,Serverless 5000PCU 100GB
简介: 作为世界先进的图数据库,Neo4j成为了时下许多互联网公司的首选。Neo4j是基于java开发的开源图数据库,也是一种NoSQL数据库。Neo4j在保证对数据关系的良好刻画的同时,还支持传统关系型数据的ACID特性,并且在存储效率,集群支持以及失效备援等等方面都有着不错的表现。近来因为实验室的项目的关系,对Neo4j有了一定的了解。同时,我也对其设计思想和架构都产生了很大的兴趣,所以写

作为世界先进的图数据库,Neo4j成为了时下许多互联网公司的首选。Neo4j是基于java开发的开源图数据库,也是一种NoSQL数据库。Neo4j在保证对数据关系的良好刻画的同时,还支持传统关系型数据的ACID特性,并且在存储效率,集群支持以及失效备援等等方面都有着不错的表现。近来因为实验室的项目的关系,对Neo4j有了一定的了解。同时,我也对其设计思想和架构都产生了很大的兴趣,所以写下这篇博客,帮助大家更好地了解这一数据库,也分享一下以及的认识。

设计理念

Neo4j的设计动机是为了更好地同时也更高效地描述实体之间的关系。在现实生活中,每一个实体都于周围的其他实体有着千丝万缕的关系,这些关系里面所存储的信息甚至要大于身体本身的属性。然后传统的关系型数据库更注重刻画实体内部的属性,实体与实体之间的关系通常都是利用外键来实现。所以在求解关系的时候通常需要join操作,而join操作通常又是耗时的。互联网尤其是移动互联网的爆发式增长本来就使得传统关系型数据库不堪重负,再加上诸如社交网络等应用对于关系的高需求,可以说关系型数据库已经是毫无优势。而图数据库作为重点描述数据之间关系的数据库应运而生,成为了NoSQL中非常重要的一部分。而Neo4j正是图数据库中最为优秀的之一

Neo4j数据库只有两种类型的数据:

  • 节点Node:节点类似于E-R图种的实体(entity),每个实体可以有0到多个属性,这些属性以key-value对的形式存在,并且对属性没有类别要求,也无需提前定义。另外,还允许给每个节点打上标签,以区别不同类型的节点。
  • 关系Relationship: 关系类似于E-R图种的关系(relationship),一个关系有一个起始节点和一个终止节点构成。另外和node一样,关系也可以有多个属性已经标签

其具体的结构如下图:Neo4j的数据结构而一个实际的图数据库例子就如下图所示的这样:

正是基于这样的设计理念,Neo4j有了以下这些特性:

  • 关系在创建的时候就已经实现了,因而在查询关系的时候是一个O(1)的操作
  • 所有的关系在Neo4j中都是同等重要的
  • 提供了图的深度优先搜索、广度优先搜索、最短路径、简单路径已经Dijkstra等等算法

Neo4j的存储结构

现在让我们来看看数据在Neo4j中是如何存储的,首先是节点Node的格式: Node:in_use(byte)+next_rel_id(int)+next_prop_id(int),每一位的具体意义如下:

  • in_use:1表示该节点被使用,0表示被删除
  • next_rel_id(int):该节点下一个关系id
  • next_prop_id(int):该节点下一个属性的id

Relation格式: in_use+first_node+second_node+rel_type+first_prev_rel_id+first_next_rel_id+second_prev_rel_id+second_next_rel_id+next_prop_id

  • in_use,next_prop_id:同上
  • first_node:当前关系的起始节点
  • second_node:当前关系的终止节点
  • rel_type:关系类型
  • first_prev_rel_id & first_next_rel_id:起始节点的前一个和后一个关系id
  • second_prev_rel_id & second_next_rel_id:终止节点的前一个和后一个关系id

相信看了存数结构之后,大家知道为什么Neo4j在查询节点关系的时候会如此之快了,因为每一个节点有哪些关系都是直接存在该节点的定义域内的,直接访问就行了,根本不需要再去查找另外一张表。

下面举一个图的遍历的例子:

  • 从节点1开始,宽度优先遍历,其存储结构为:01 00000002 ffffffff
  • 其下一个关系id是2,访问关系2:01 00000001 00000004  00000000   ffffffff 00000001   ffffffff ffffffff    ffffffff 得出node 1 -> node 4,同时下个关系是1
  • 关系1: 01 00000001 00000003  00000000   00000002 00000000   00000003 ffffffff    ffffffff node1 -> node 3,node3 有其他关系,所以将node3存入队列,同时访问关系0
  • 关系0:01 00000001 00000002  00000000   00000001 ffffffff   ffffffff ffffffff    ffffffff node1 -> node2,访问完成node1的所有关系,从队列中退出node3
  • 用于上文相同的方法访问node3
  • 最后结果如下:
(1)–[KNOWS,2]–>(4)
(1)–[KNOWS,1]–>(3)
(1)–[KNOWS,0]–>(2)
(1)–[KNOWS,1]–>(3)–[KNOWS,5]–>(7)
(1)–[KNOWS,1]–>(3)–[KNOWS,4]–>(6)
(1)–[KNOWS,1]–>(3)–[KNOWS,3]–>(5)

Neo4j与关系型数据库的区别

其实通过上述的讲解,相信大家都对neo4j与RDBMS(Relational Database Management System)的区别有了一定的认识,现在再用下面的表格来重新整理一下:

Neo4j RDBMS
允许对数据的简单且多样的管理 高度结构化的数据
数据添加和定义灵活,不受数据类型和数量的限制,无需提前定义 表格schema需预定义,修改和添加数据结构和类型复杂,对数据有严格的限制
常数时间的关系查询操作 关系查询操作耗时
提出全新的查询语言cypher,查询语句更加简单 查询语句更为复杂,尤其涉及到join或union操作时

最后再以下面两张图来展示一下两者在查询关系时的区别:RDBMSNeo4j

关于Neo4j具体的安装和使用,不是文章的重点,如果想要真正上手用Neo4j,可以到Neo4j官网上面有很多资料


相关实践学习
阿里云图数据库GDB入门与应用
图数据库(Graph Database,简称GDB)是一种支持Property Graph图模型、用于处理高度连接数据查询与存储的实时、可靠的在线数据库服务。它支持Apache TinkerPop Gremlin查询语言,可以帮您快速构建基于高度连接的数据集的应用程序。GDB非常适合社交网络、欺诈检测、推荐引擎、实时图谱、网络/IT运营这类高度互连数据集的场景。 GDB由阿里云自主研发,具备如下优势: 标准图查询语言:支持属性图,高度兼容Gremlin图查询语言。 高度优化的自研引擎:高度优化的自研图计算层和存储层,云盘多副本保障数据超高可靠,支持ACID事务。 服务高可用:支持高可用实例,节点故障迅速转移,保障业务连续性。 易运维:提供备份恢复、自动升级、监控告警、故障切换等丰富的运维功能,大幅降低运维成本。 产品主页:https://www.aliyun.com/product/gdb
相关文章
|
4月前
|
存储 机器学习/深度学习 人工智能
向量数据库简介和5个常用数据库介绍
随着数字时代将我们推进到一个以人工智能和机器学习为主导的时代,向量数据库已经成为存储、搜索和分析高维数据矢量的不可或缺的工具。本文将旨在全面介绍向量数据库,并介绍2023年可用的最佳向量数据库。
|
3月前
|
存储 NoSQL 数据库
知识图谱之图数据库如何选型:知识图谱存储与图数据库总结、主流图数据库对比(JanusGraph、HugeGraph、Neo4j、Dgraph、NebulaGraph、Tugrapg)
知识图谱之图数据库如何选型:知识图谱存储与图数据库总结、主流图数据库对比(JanusGraph、HugeGraph、Neo4j、Dgraph、NebulaGraph、Tugrapg)
知识图谱之图数据库如何选型:知识图谱存储与图数据库总结、主流图数据库对比(JanusGraph、HugeGraph、Neo4j、Dgraph、NebulaGraph、Tugrapg)
|
4天前
|
SQL 监控 druid
Druid数据库连接池简介及应用推广(老项目翻出来做下记录)
Druid数据库连接池简介及应用推广(老项目翻出来做下记录)
|
5月前
|
SQL 关系型数据库 MySQL
07 Django模型 - ORM简介及MySQL数据库的使用
07 Django模型 - ORM简介及MySQL数据库的使用
35 0
|
1月前
|
SQL Oracle 关系型数据库
通用SQL数据库查询语句精华使用简介
通用SQL数据库查询语句精华使用简介
|
6月前
|
SQL 关系型数据库 数据库
关系数据库SQL语言简介
一、关系数据库SQL语言简介 SQL(Structured Query Language)是关系型数据库管理系统(RDBMS)中最常用的语言。它是一种标准化的语言,用于存储、操作和查询数据。SQL语言具有以下特点: 1. 数据操作语言(DML):用于对数据库中的数据进行增、删、改等操作,包括INSERT、UPDATE、DELETE等命令。 2. 数据定义语言(DDL):用于定义数据库的结构,包括表、字段、索引、视图等,包括CREATE、ALTER、DROP等命令。 3. 数据查询语言(DQL):用于查询数据库中的数据,包括SELECT、FROM、WHERE等命令。 4. 数据控制语言(DCL)
187 0
|
6月前
|
SQL 数据管理 数据库
关系数据库SQL语言简介
关系数据库SQL语言简介 一、SQL语言概述 SQL(Structured Query Language)是一种用于管理和操作关系数据库的语言。它是数据库管理系统(DBMS)的核心组成部分,用于定义、操作和查询数据库中的数据。SQL语言是一种标准化的语言,由美国国家标准局(ANSI)和国际标准化组织(ISO)制定和维护。 SQL语言具有简洁、易学、易用的特点,被广泛应用于各个领域的数据管理和应用开发中。通过SQL语言,用户可以使用简单的语句来完成复杂的数据查询、更新、删除等操作,实现对数据库的全面管理和控制。 SQL语言主要包括以下几个方面的内容: 1. 数据定义语言(DDL):用于
58 0
|
3月前
|
SQL 关系型数据库 MySQL
MySQL数据库免费客户端简介
MySQL数据库免费客户端简介
36 0
|
3月前
|
存储 SQL NoSQL
【Redis】Redis-NoSQL数据库简介
【1月更文挑战第18天】【Redis】Redis-NoSQL数据库简介
|
4月前
|
数据挖掘 关系型数据库 MySQL
下一代实时数据库:Apache Doris 【一】简介
下一代实时数据库:Apache Doris 【一】简介
82 0
下一代实时数据库:Apache Doris 【一】简介