Knowledge Graph |(1)图数据库Neo4j简介与入门

简介: Knowledge Graph |(1)图数据库Neo4j简介与入门

基本概念

图数据库(Grahp Database)是基于图论实现的一种新型NoSQL数据库,它的存储结构和数据的查询方式都是以图论为基础的,图论中图的基本元素为节点和边,在图数据库中对应的就是节点和关系。


在图数据中,数据与数据之间的关系通过节点和关系构成一个图结构并在此结构上实现数据库的所有特性,具有传统数据库的所有功能。


与传统的关系数据库相同,图数据库的核心也是构建在一个引擎之上的,就是图计算引擎,图计算引擎是能够组织存储大型图数据集并且实现了全局图计算算法的一种数据库核心构建。


目前较为流行的图计算引擎有两种:单机图计算引擎和分布式图计算引擎


单机图计算引擎的典型代表是Cassovary,Cassovary是一个用scala编写的基于java虚拟机的图计算引擎,在twitter上Cassovary用来为其提供基于图的功能。


分布式图计算引擎的典型代表是pegasus和giraph,pegasus是一个运行在hadoop云计算平台之上的分布式图计算引擎,最初他是为了google的网页数据处理而设计出来的。


图数据库与关系数据库的对比

关系数据库的弊端

关系数据库自上世纪80年代以来一直是数据库领域发展的动力,并持续到今天。他们两高度结构化的数据存在在一张二维表中,并且数据组织的特性严格,在关系型数据库中,通过外键约束来实现两表或多个表之间某些记录的相互引用关系,外键约束是关系数据库中实现两表之间相互引用必不可少的策略。但这种关系匹配的操作,会消耗大量系统的资源,如果使用多对多的关系,则必须通过增加中间表来建立一对一的联系,这相同的增加了操作成本。


图数据模型的优势

在图数据库中,关系是最重要的元素,通过关系我们能够将节点相互关联起来,用来构造一个负责的模型。图数据库模型中的每个节点都直接包含一个关系列表,关系列表中存放此节点与其他节点的关系记录,这些关系记录按类型和方向组织起来,并且还可以在上保存附加属性,将关系预先保存到关系列表中的这种能力是Neo4j能够提供比关系数据库高几个量级的性能,特别是对于复杂连接的查询,neo4j能够实现毫秒级的响应。


neo4j的体系结构

neo4j最初的设计动机是为了更好的描述实体之间的联系,现实生活中,每个实体都与周围的其他实体有着千丝万缕的关系,这些关系中存在着大量的潜在信息,但是传统的关系型数据库更加注重刻画实体内部的属性,实体与实体之间的关系往往需要通过外键来实现,因此,在查询一个实体的关系时需要join操作,特别是深层次的关系查询需要大量的join操作,而join操作通常又非常的耗时,特别是深层次的关系查询时需要大量的join操作,而join操作通常又非常的耗时,所以为了应对海量数据查询深层关系时的性能问题、以及运算负责性,neo4j应运而生。


image.png

免索引邻接

neo4j有一个重要的特点,就是用来保证关系查询的速度,即免索引邻接属性,数据库中的每个节点都会维护与它相邻节点的引用。因此每个节点都相当于与它相邻节点的微索引,这比使用全局索引的代价小很多,这就意味着查询时间和图的整体规模无关,只与它附近节点的数量成正比。在关系数据库中使用全局索引引接各个节点,这些索引对每个遍历都会增加一个中间层,因此会导致非常大的计算成本,而免索引邻接为图数据库提供了快速、高效的图遍历能力。


neo4j底层存储结构

免索引邻接是图数据实现高效遍历的关键,那么免索引邻接的实现机制就是neo4j底层存储结构设计的关键。能够支持高效的、本地化的图存储以及支持任意图算法的快速遍历,是使用图数据库的重要原因。


从宏观角度讲,neo4j只存在两种数据类型:


(1)节点:节点类似于ER图中的实体,每一个实体可以有零个或多个属性,这些属性以key-value对的形式存在,属性没有特殊类别的要求,同时每个节点还具有相应的标签,用来区分不同类型的节点。

(2)关系:关系也类似ER图中的关系,一个关系有起始节点和终止节点,另外,关系也能够有自己的属性和标签。


在深入学习图形数据库之前,首先理解属性图的基本概念。一个属性图是由顶点(Vertex),边(Edge),标签(Lable),关系类型和属性(Property)组成的有向图。顶点也称作节点(Node),边也称作关系(Relationship);在图形中,节点和关系是最重要的实体,所有的节点是独立存在的,为节点设置标签,那么拥有相同标签的节点属于一个分组,一个集合;关系通过关系类型来分组,类型相同的关系属于同一个集合。关系是有向的,关系的两端是起始节点和结束节点,通过有向的箭头来标识方向,节点之间的双向关系通过两个方向相反的关系来标识。节点可有零个,一个或多个标签,但是关系必须设置关系类型,并且只能设置一个关系类型。Neo4j图形数据库的查询语言是Cypher,用于操作属性图,是图形语言中事实上的标准。


一、图形数据库的基本概念

Neo4j创建的图(Graph)基于属性图模型,在该模型中,每个实体都有ID(Identity)唯一标识,每个节点由标签(Lable)分组,每个关系都有一个唯一的类型,属性图模型的基本概念有:


实体(Entity)是指节点(Node)和关系(Relationship);路径(Path)是指由起始节点和终止节点之间的实体(节点和关系)构成的有序组合;

每个实体都有一个唯一的ID;

每个实体都有零个,一个或多个属性,一个实体的属性键是唯一的;

每个节点都有零个,一个或多个标签,属于一个或多个分组;

每个关系都只有一个类型,用于连接两个节点;

标记(Token)是非空的字符串,用于标识标签(Lable),关系类型(Relationship Type),或属性键(Property Key);

标签:用于标记节点的分组,多个节点可以有相同的标签,一个节点可以有多个Lable,Lable用于对节点进行分组;

关系类型:用于标记关系的类型,多个关系可以有相同的关系类型;

属性键:用于唯一标识一个属性;

属性(Property)是一个键值对(Key/Value Pair),每个节点或关系可以有一个或多个属性;属性值可以是标量类型,或这标量类型的列表(数组);


二、图形示例

在下面的图形中,存在三个节点和两个关系共5个实体;Person和Movie是Lable,ACTED_ID和DIRECTED是关系类型,name,title,roles等是节点和关系的属性。

image.png

实体包括节点和关系,节点有标签和属性,关系是有向的,链接两个节点,具有属性和关系类型。

1,实体

在示例图形中,包含三个节点,分别是:

image.png

包含两个关系,分别是:

  • 两个关系类型:ACTED_IN和DIRECTED,
  • 两个关系:连接name属性为Tom Hank节点和Movie节点的关系,连接name属性为Forrest Gump的节点和Movie节点的关系。

其中一个关系如下图:

image.png

2,标签(Lable)

在图形结构中,标签用于对节点进行分组,相当于节点的类型,拥有相同标签的节点属于同一个分组。一个节点可以拥有零个,一个或多个标签,因此,一个节点可以属于多个分组。对分组进行查询,能够缩小查询的节点范围,提高查询的性能。


在示例图形中,有两个标签Person和Movie,两个节点是Person,一个节点是Movie,标签有点像节点的类型,但是,每个节点可以有多个标签。

image.png

3,属性(Property)

属性是一个键值对(Key/Value),用于为节点或关系提供信息。一般情况下,每个节点都由name属性,用于命名节点。


在示例图形中,Person节点有两个属性name和born,Movie节点有两个属性:title和released,


关系类型ACTED_IN有一个属性:roles,该属性值是一个数组,而关系类型为DIRECTED的关系没有属性

image.png

三、遍历(Traversal)

遍历一个图形,是指沿着关系及其方向,访问图形的节点。关系是有向的,连接两个节点,从起始节点沿着关系,一步一步导航(navigate)到结束节点的过程叫做遍历,遍历经过的节点和关系的有序组合称作路径(Path)。


在示例图形中,查找Tom Hanks参演的电影,遍历的过程是:从Tom Hanks节点开始,沿着ACTED_IN关系,寻找标签为Movie的目标节点。


遍历的路径如图:

image.png

四、图形数据库的模式

Neo4j的模式(Schema)通常是指索引,约束和统计,通过创建模式,Neo4j能够获得查询性能的提升和建模的便利;Neo4j数据库的模式可选的,也可以是无模式的。


1,索引

图形数据库也能创建索引,用于提高图形数据库的查询性能。和关系型数据库一样,索引是图形数据的一个冗余副本,通过额外的存储空间和牺牲数据写操作的性能,来提高数据搜索的性能,避免创建不必要的索引,这样能够减少数据更新的性能损失。


Neo4j在图形节点的一个或多个属性上创建索引,在索引创建完成之后,当图形数据更新时,Neo4j负责索引的自动更新,索引的数据是实时同步的;在查询被索引的属性时,Neo4j自动应用索引,以获得查询性能的提升。


例如,使用Cypher创建索引:


CREATE INDEX ON :Person(firstname)

CREATE INDEX ON :Person(firstname, surname)

2,约束

在图形数据库中,能够创建四种类型的约束:


节点属性值唯一约束(Unique node property):如果节点具有指定的标签和指定的属性,那么这些节点的属性值是唯一的

节点属性存在约束(Node property existence):创建的节点必须存在标签和指定的属性

关系属性存在约束(Relationship property existence):创建的关系存在类型和指定的属性

节点键约束(Node Key):在指定的标签中的节点中,指定的属性必须存在,并且属性值的组合是唯一的

例如,使用Cypher创建约束:


CREATE CONSTRAINT ON (book:Book) ASSERT book.isbn IS UNIQUE;

CREATE CONSTRAINT ON (book:Book) ASSERT exists(book.isbn);

CREATE CONSTRAINT ON ()-[like:LIKED]-() ASSERT exists(like.day);

CREATE CONSTRAINT ON (n:Person) ASSERT (n.firstname, n.surname) IS NODE KEY;

3,统计信息

当使用Cypher查询图形数据库时,Cypher脚本被编译成一个执行计划,执行该执行计划获得查询结果。为了生成一个性能优化的执行计划,Neo4j需要收集统计信息以对查询进行优化。当统计信息变化到一定的赋值时,Neo4j需要重新生成执行计划,以保证Cypher查询是性能优化的,Neo4j存储的统计信息包括:


The number of nodes with a certain label.

Selectivity per index.

The number of relationships by type.

The number of relationships by type, ending or starting from a node with a specific label.

默认情况下,Neo4j自动更新统计信息,但是,统计信息的更新不是实时的,更新统计信息可能是一个非常耗时的操作,因此,Neo4j在后台运行,并且只有当变化的数据达到一定的阈值时,才会更新统计信息。


Neo4j keeps the statistics up to date in two different ways. For label counts for example, the number is updated whenever you set or remove a label from a node. For indexes, Neo4j needs to scan the full index to produce the selectivity number. Since this is potentially a very time-consuming operation, these numbers are collected in the background when enough data on the index has been changed.


Neo4j把执行计划被缓存起来,在统计信息变化之前,执行计划不会被重新生成。通过配置选项,Neo4j能够控制执行计划的重新生成:


dbms.index_sampling.background_enabled:是否在后台统计索引信息,由于Cypher查询的执行计划是根据统计信息生成的,及时更新索引的统计数据对生成性能优化的执行计划非常重要;

dbms.index_sampling.update_percentage:在更新索引的统计信息之前,索引中有多大比例的数据被更新;

cypher.statistics_divergence_threshold:当统计信息变化时,Neo4j不会立即更新Cypher查询的执行计划;只有当统计信息变化到一定的程度时,Neo4j才会重新生成执行计划。


相关实践学习
阿里云图数据库GDB入门与应用
图数据库(Graph Database,简称GDB)是一种支持Property Graph图模型、用于处理高度连接数据查询与存储的实时、可靠的在线数据库服务。它支持Apache TinkerPop Gremlin查询语言,可以帮您快速构建基于高度连接的数据集的应用程序。GDB非常适合社交网络、欺诈检测、推荐引擎、实时图谱、网络/IT运营这类高度互连数据集的场景。 GDB由阿里云自主研发,具备如下优势: 标准图查询语言:支持属性图,高度兼容Gremlin图查询语言。 高度优化的自研引擎:高度优化的自研图计算层和存储层,云盘多副本保障数据超高可靠,支持ACID事务。 服务高可用:支持高可用实例,节点故障迅速转移,保障业务连续性。 易运维:提供备份恢复、自动升级、监控告警、故障切换等丰富的运维功能,大幅降低运维成本。 产品主页:https://www.aliyun.com/product/gdb
目录
相关文章
|
1月前
|
Java 数据库连接 测试技术
SpringBoot入门(4) - 添加内存数据库H2
SpringBoot入门(4) - 添加内存数据库H2
47 4
SpringBoot入门(4) - 添加内存数据库H2
|
4月前
|
存储 SQL 分布式数据库
OceanBase 入门:分布式数据库的基础概念
【8月更文第31天】在当今的大数据时代,随着业务规模的不断扩大,传统的单机数据库已经难以满足高并发、大数据量的应用需求。分布式数据库应运而生,成为解决这一问题的有效方案之一。本文将介绍一款由阿里巴巴集团自主研发的分布式数据库——OceanBase,并通过一些基础概念和实际代码示例来帮助读者理解其工作原理。
352 0
|
2月前
|
Java 数据库连接 测试技术
SpringBoot入门(4) - 添加内存数据库H2
SpringBoot入门(4) - 添加内存数据库H2
34 2
SpringBoot入门(4) - 添加内存数据库H2
|
1月前
|
Java 数据库连接 测试技术
SpringBoot入门(4) - 添加内存数据库H2
SpringBoot入门(4) - 添加内存数据库H2
66 13
|
28天前
|
Java 数据库连接 测试技术
SpringBoot入门(4) - 添加内存数据库H2
SpringBoot入门(4) - 添加内存数据库H2
39 4
|
2月前
|
存储 人工智能 Java
Neo4j从入门到精通:打造高效知识图谱数据库 | AI应用开发
在大数据和人工智能时代,知识图谱作为一种高效的数据表示和查询方式,逐渐受到广泛关注。本文从入门到精通,详细介绍知识图谱及其存储工具Neo4j,涵盖知识图谱的介绍、Neo4j的特点、安装步骤、使用方法(创建、查询)及Cypher查询语言的详细讲解。通过本文,读者将全面了解如何利用Neo4j处理复杂关系数据。【10月更文挑战第14天】
137 6
|
2月前
|
存储 NoSQL API
使用Py2neo进行Neo4j图数据库的增删改查操作
使用Py2neo进行Neo4j图数据库的增删改查操作
92 5
|
2月前
|
SQL 关系型数据库 分布式数据库
Citus 简介,将 Postgres 转换为分布式数据库
【10月更文挑战第4天】Citus 简介,将 Postgres 转换为分布式数据库
95 4
|
2月前
|
存储 关系型数据库 数据库
轻量级数据库的利器:Python 及其内置 SQLite 简介
轻量级数据库的利器:Python 及其内置 SQLite 简介
64 3
|
2月前
|
SQL 存储 数据管理
SQL数据库的使用指南:从入门到精通
随着信息技术的飞速发展,数据库已成为各类企业和组织不可或缺的一部分。作为最流行的数据库管理系统之一,SQL数据库广泛应用于各种场景,如数据存储、数据管理、数据分析等。本文将详细介绍SQL数据库的使用方法,帮助初学者快速入门,并帮助有经验的开发者深化理解。一、SQL数据库基础首先,我们需要理解SQL数
128 2