图数据库Neo4j图形数据库

Neo4j系列-图形数据库结构(三)

2018-04-08  本文已影响2384人  wyatt_plus

1. 前言

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

2. 图形数据库的基本概念

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

3. 案例分析

结合官方movie的demo,查找“Tom Hanks”所参演过的电影

MATCH (tom:Person {name: "Tom Hanks"})-[:ACTED_IN]->(tomHanksMovies) RETURN tom,tomHanksMovies
Tom Hanks
我们简化完结构来进行分析,在下面的图形中,存在三个节点和两个关系共5个实体:PersonMovieLableACTED_IDDIRECTED是关系类型,name,title,roles等是节点和关系的属性。 结构图

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

3.1 实体

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

NodeEntity

包含两个关系,分别是:

其中一个关系如下图:

relationship

3.2 标签(Lable)

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

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

类型

3.3 属性(Property)

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

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

对象属性

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

relationship属性

4. 遍历(Traversal)

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

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

遍历的路径如图:

路径

5. 图形数据库的模式

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

5.1 索引

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

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

例如,使用Cypher创建索引:

CREATE INDEX ON :Person(firstname)
CREATE INDEX ON :Person(firstname, surname)

5.2 约束

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

例如,使用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;

5.3 统计信息

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

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

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

本文过多参考了:悦光阴系列文章

上一篇下一篇

猜你喜欢

热点阅读