开发者社区> 长征6号> 正文

Neo4j 第二篇:图形数据库

简介:
+关注继续查看

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

 

我的Neo4j系列的文章收录在:Neo4j

 

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

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

  • 实体(Entity)是指节点(Node)和关系(Relationship);
    • 每个实体都有一个唯一的ID;
    • 每个实体都有零个,一个或多个属性,一个实体的属性键是唯一的;
    • 每个节点都有零个,一个或多个标签,属于一个或多个分组;
    • 每个关系都只有一个类型,用于连接两个节点;
  • 路径(Path)是指由起始节点和终止节点之间的实体(节点和关系)构成的有序组合;
  • 标记(Token)是非空的字符串,用于标识标签(Lable),关系类型(Relationship Type),或属性键(Property Key);
    • 标签:用于标记节点的分组,多个节点可以有相同的标签,一个节点可以有多个Lable,Lable用于对节点进行分组;
    • 关系类型:用于标记关系的类型,多个关系可以有相同的关系类型;
    • 属性键:用于唯一标识一个属性;
  • 属性(Property)是一个键值对(Key/Value Pair),每个节点或关系可以有一个或多个属性;属性值可以是标量类型,或这标量类型的列表(数组);

二,图形示例

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

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

1,实体

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

包含两个关系,分别是:

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

其中一个关系如下图:

2,标签(Lable)

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

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

3,属性(Property)

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

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

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

三,遍历(Traversal)

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

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

遍历的路径如图:

 

四,图形数据库的模式

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才会重新生成执行计划。

 

参考文档:

Graph database concepts

Chapter 3. Cypher





本文转自悦光阴博客园博客,原文链接:http://www.cnblogs.com/ljhdo/p/5178225.html,如需转载请自行联系原作者

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
我的Neo4j探索之旅 - 初识Neo4j(一)
neo4j 这个东西在国内用的很少,目前能百度的资料也是很早之前的几篇了,我针对neo4j 3.5 的版本进行一次学习和记录,以及实际的工作需求我也遇到了,后续会开源一个剔除业务的开源项目,有兴趣的读者可以了解一下图数据库的中间件,还是蛮有意思的。
20 0
NEO4J的入门和一些简单的操作
> 持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第29天,[点击查看活动详情](https://juejin.cn/post/7147654075599978532 "https://juejin.cn/post/7147654075599978532") # 引言 今天我们继续学习NEO4J. # 创建 创建语句我们一般会使用create指令 我们首先在控制台上输入`neo4j.bat console`启动neo4j 然后打开你的浏览器,然后在浏览器地址栏中输入 `http://localhost:7687 - Neo4j Browser](http:
32 0
Neo4j学习笔记(二) 查询语言
Neo4j学习笔记(二) 查询语言
25 0
Neo4j 学习笔记(一) 初遇篇
Neo4j 学习笔记(一) 初遇篇
72 0
Neo4j图数据库的安装与基本增删改查
Neo4j图数据库的安装与基本增删改查
115 0
Python编程:py2neo操作neo4j图数据库
Python编程:py2neo操作neo4j图数据库
139 0
上手Neo4j (二)
上手Neo4j (二)
220 0
上手Neo4j (一)
上手Neo4j (一)
110 0
Neo4j导入Aminer论文数据
前面一篇介绍了Neo4j一些比较基础的用法。这一篇笔记主要记录下在导入一个大数据集Aminer中MAG论文数据所遇到的一些问题。 数据集介绍 首先关于论文数据集的描述可以在Aminer_Open_Academic中查看,这里简单介绍一下。 有两套数据,一个是Aminer Papers, 是清华大学整理发布的论文集,MAG Papers是微软学术发布的论文数据集。 我们这里选取了MAG的部分数据集来测试导入到Neo4j中。 MAG数据集一共有9个压缩包,其中每一个压缩包里面有20个txt文件,每个txt文件中每行代表一篇论文,用json表示,mid为论文唯一id,可以作为主键使用。除了论文的基
179 0
三篇文章了解TiDB技术内幕-说存储
三篇文章了解TiDB技术内幕-说存储
1782 0
+关注
长征6号
文章
问答
视频
文章排行榜
最热
最新
相关电子书
更多
简介Bytom架构
立即下载
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载