图形数据库Neo4j基本了解
在深入学习图形数据库之前,首先理解属性图的基本概念。一个属性图是由顶点(Vertex),边(Edge),标签(Lable),关系类型和属性(Property)组成的有向图。顶点也称作节点(Node),边也称作关系(Relationship);在图形中,节点和关系是最重要的实体,所有的节点是独立存在的,为节点设置标签,那么拥有相同标签的节点属于一个分组,一个集合;关系通过关系类型来分组,类型相同的关系属于同一个集合。关系是有向的,关系的两端是起始节点和结束节点,通过有向的箭头来标识方向,节点之间的双向关系通过两个方向相反的关系来标识。节点可有零个,一个或多个标签,但是关系必须设置关系类型,并且只能设置一个关系类型。Neo4j图形数据库的查询语言是Cypher,用于操作属性图,是图形语言中事实上的标准。
一,图形数据库的基本概念
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
转载于:https://www.cnblogs.com/jstarseven/p/9546576.html
图形数据库Neo4j基本了解相关推荐
- 图形数据库neo4j视频教程
2019独角兽企业重金招聘Python工程师标准>>> Neo4j是一个高性能的,NOSQL图形数据库,它将结构化数据存储在网络上而不是表中.它是一个嵌入式的.基于磁盘的.具备完全的 ...
- 图形数据库Neo4J简介
最近我在用图形数据库来完成对一个初创项目的支持.在使用过程中觉得这种图形数据库实际上挺有意思的.因此在这里给大家做一个简单的介绍. NoSQL数据库相信大家都听说过.它们常常可以用来处理传统的关系型数 ...
- NOSQL图形数据库 - Neo4j
Neo4j入门指南 1.简介 2.特点 3.安装 4.基础操作 5.Java集成 5.1 内嵌数据库集成方式 5.2 服务器集成方式 5.3 Spring集成方式 参考文档 1.简介 Neo4j是一个 ...
- php 可视化neo4j,开源图形数据库Neo4j使用 php开发
先看看它的示例数据 打开 Neo4j Browser :play movie graph 写代码,然后点play执行 Cypher, the graph query language.Neo4j提供了 ...
- 图形数据库Neo4j
前言 图表数据库是当今巨大的宏观业务趋势之一:在高度连接的数据中利用复杂和动态的关系,产生洞察力和竞争优势.无论我们想要了解客户之间的关系,电话或数据中心网络中的元素,娱乐生产商和消费者,还是基因和蛋 ...
- 初识图形数据库--neo4j
图形数据库是NoSQL数据库的一种类型,它应用图形理论存储实体之间的关系信息.图形数据库是一种非关系型数据库,它应用 图形理论存储实体之间的关系信息. Neo4J基于文件系统的一种图形数据库,用于处理 ...
- Windows下安装图形数据库Neo4j说明(4.3.2压缩包方式)
文章目录 前言 一.下载安装包 二.安装Neo4j 1.安装包文件解压 2.配置系统环境变量 3. 启动Neo4j 4. 将Neo4j安装到Windows服务 5. Neo4j常用命令 三.安装常见问 ...
- 通过Spring Data Neo4J操作您的图形数据库
在前面的一篇文章<图形数据库Neo4J简介>中,我们已经对其内部所使用的各种机制进行了简单地介绍.而在我们尝试对Neo4J进行大版本升级时,我发现网络上并没有任何成型的样例代码以及简介,而 ...
- 图形数据库、NOSQL和Neo4j
简介 在众多不同的数据模型里,关系数据模型自80年代就处于统治地位,而且有不少实现,如Oracle.MySQL和MSSQL,它们也被称为关系数据库管理系统(RDBMS).然而,最近随着关系数据库使用案 ...
最新文章
- TensorFlow练习27: 验证码生成器-从文本生成图像
- 《企业云桌面实施》-小技巧-04-VMWare Workstation-虚拟机强行关机开机
- 【机器学习基础】太棒了!这里有385篇自然语言处理和机器学习领域的综述总结...
- MySQL高级 - 应用优化
- Angular应用页面里appId的生成逻辑和位置
- 100多本python书,免费电子版下载
- 创建工程师文化的3个步骤 | IDCF
- 无法打开用户默认数据库,登录失败,用户‘sa’登录失败,错误:4064的解决方法...
- k_means算法+python实现
- 由SELECT ... FROM ... FOR UPDATE想到的
- 数组中每个元素都出现了两次,但是其中一个元素只出现了一次,求出此元素
- Git:取消合并方式
- 产品功能树图_新版PFMEA培训之第三步功能分析,理清结构,梳理思路
- 哆啦A梦的神奇口袋 - 这全是宝藏
- Evenly Separated Strings
- .net 微信表情应用
- 视觉十四讲 第三讲 深蓝学院习题分析
- java 除法运算,向上与向下取整和四舍五入
- 国际直线对撞机计划陷入僵局
- USB Type C数据线接线方式、工作原理
热门文章
- restTemplate http请求报错:no suitable HttpMessageConverter found for response type and content type
- 2022-2028年中国顺丁橡胶行业发展模式分析及市场分析预测报告
- HA: Dhanush靶机渗透测试
- matplotlib交互模式
- LeetCode简单题之检查两个字符串数组是否相等
- EyeQ进展The Evolution of EyeQ
- 基于ARMv8的固件系统体系结构
- CVPR2019论文看点:自学习Anchor原理
- android 快速点击开启某功能(不如快速点击打开开发者模式)
- 吴裕雄--天生自然 JAVASCRIPT开发学习:DOM EventListener