2023/2/24 图数据库Neo4j的理解与应用

news/2024/3/28 18:15:12/文章来源:https://blog.csdn.net/zs18753479279/article/details/129200445

1 什么是图数据库(graph database)

十大应用案例:https://go.neo4j.com/rs/710-RRC-335/images/Neo4j-Top-Use-Cases-ZH.pdf
“大数据”每年都在增长,但如今的企业领导者不仅需要管理更大规模的数据,还迫切需要从现有数据中得出深刻见解。企业需要摈弃仅仅收集数据点的做法,开始着手建立数据之间的关联关系。数据点之间的关系甚至比单个点本身更重要。讽刺的是,传统的关系数据库管理系统(RDBMS)并不擅长处理数据之间的关系。那些表状数据模式和呆板的结构难以添加新连接或不同类型连接。为了利用这些数据关系,需要一种能将关系信息存储为一等实体的新型数据库技术,这种技术就是图数据库

图数据库不仅能有效存储数据点之间的关系,而且非常灵活,适合添加新的关系类型,并使数据模型适应新的业务需求。

随着社交、电商、金融、零售、物联网等行业的快速发展,现实社会织起了一张庞大而复杂的关系网,传统数据库很难处理关系运算。大数据行业需要处理的数据之间的关系随数据量呈几何级数增长,急需一种支持海量复杂数据关系运算的数据库,图数据库应运而生。

社交网络图谱:
在社交网络中,公司、员工、技能的信息,这些都是节点,它们之间的关系都是边,在这里面图数据库可以做一些非常复杂的公司之间关系的查询。比如说公司到员工、员工到其他公司,从中找类似的公司、相似的公司,都可以在这个系统内完成。
在这里插入图片描述
企业关系图谱:

图数据库可以对各种企业进行信息图谱的建立,包括最基本的工商信息:何时注册、谁注册、注册资本、在何处办公、经营范围、高管架构。围绕企业的经营范围,继续细化去查询企业究竟有哪些产品或服务,例如通过企业名称查询到企业的自媒体,从而给予其更多关注和了解。另外,企业的产品和服务数据的关联,查看该企业有没有令人信服的自主知识产权和相关资质来支撑业务的开展。

企业在日常经营中,与客户、合作伙伴、渠道方、投资者都会打交道,这也决定了企业对社会各个领域都广有涉猎,呈现面错综复杂,因此可以通过企业数据图谱来查询,层层挖掘信息。基于图数据的企业信息查询可以真正了解企业的方方面面,而不再是传统单一的工商信息查询。

在这里插入图片描述
在数据关系中,图数据库在查询速度方面非常高效,即使对于高深度和高复杂的查询也是如此。在关系型数据库和图数据库(Neo4j)之间进行了实验:在一个社交网络里找到深度为5的朋友的朋友,他们的数据集包括100万人,每人约有50个朋友:
在这里插入图片描述

图数据库并不是前端展示用的数据库,它不是用来画图的。相反,它是用来存储数据用的,以图的节点和边的方式来存储数据。而前端展现需要用一些前端展示工具,例如D3、ECharts等来实现。

图数据库并非指存储图片的数据库,而是以图数据结构存储和查询数据。图数据库是基于图论实现的一种NoSQL数据库,其数据存储结构和数据查询方式都是以图论为基础的,图数据库主要用于存储更多的连接数据。

图论〔Graph Theory〕是数学的一个分支。它以图为研究对象,图论中的图是由若干给定的点连接两点的线所构成的图形,这种图形通常用来描述某些事物之间的某种特定关系,用代表事物,用连接两点的线表示相应两个事物间具有关系。

在这里插入图片描述
在一个图中主要包含两种数据类型:Nodes(节点)和Relationships(关系)。他们各自内部又包含key-value形式的属性,然后节点之间通过关系相连,形成了关系型的网状结构。

Neo4j是由Java实现的开源NoSql图数据库,是图数据库中较为流行的一款。它提供了完整的数据库特性,包括ACID事务的支持、集群支持、备份与故障转移等(部分功能例如集群支持只有在neo4j企业版中才有,社区版不支持)。

在我看来,图数据库最大的优势是体现在对数据关系的检索上。如果数据之间的关系很复杂,数据存在了多张表中,还有一些中间表的存在的话,传统数据库想要查询一些数据得通过各种联表操作才做得到,sql会写得很复杂,不利于维护,同时性能也不高。图数据库仅仅通过简单的一句cypher语句便可实现查询功能(cypher语句是Neo4j的执行语句,类似于关系型数据库中的SQL),同时执行速度也会快很多(书中所说是能够实现毫秒级响应,但通过我实测其实并没有这么夸张。Neo4j是将数据存在内存中的,对硬件有一定要求。所以数据越来越多的情况下,同时也有事务的因素,查询速度也会变慢)。

图数据库也支持查询一些复杂的关系。例如某节点周围一级的关系节点有哪些,二级的关系又有哪些。拿社交网络来举例,假如我现在要实现一个查询某人可能认识的人有哪些的功能。那么这个功能翻译成cypher就是: 查询这个人A的周围一圈认识的人的集合B中,所有B周围一圈人中和A没有交集的人。 这个用cypher语句是能写出来的,同时也不会太复杂。

对比关系型数据库:
在关系型数据库中,Person和Department表之间用外键表示关系:
在这里插入图片描述
在图数据库中,节点和关系取代表,外键和join:
在这里插入图片描述
在图数据库中,无论何时运行类似JOIN的操作,数据库都会使用此列表并直接访问连接的节点,而无需进行昂贵的搜索和匹配计算。

分类数据模型优势劣势举例
图数据库节点和关系组成的图利用图结构相关算可能需要对整个图做计算,不利于图数据的分布存储Neo4J

2 什么是neo4j

Neo4j是一个高性能的NOSQL图数据库,它将结构化数据存储在网络上(从数学角度叫做图)而不是表中。

它是一个嵌入式的、基于磁盘的、具备完全的事务特性的Java持久化引擎,但是它将结构化数据存储在网络(从数学角度叫做图)上而不是表中。

Neo4j也可以被看作是一个高性能的图引擎,该引擎具有成熟数据库的所有特性。程序员工作在一个面向对象的、灵活的图网络结构下,而不是严格、静态的表中。但是他们可以享受到具备完全的事务特性、企业级的数据库的所有好处。

Neo4j因其嵌入式、高性能、轻量级等优势,越来越受到关注。采用属性图模型(Property graph model),极大的完善和丰富图数据模型;专属查询语言 Cypher。官网: https://neo4j.com/

Neo4j的特点:
SQL就像简单的查询语言Neo4j CQL;它遵循属性图数据模型;它通过使用Apache Lucence支持索引;它支持UNIQUE约束;它包含一个用于执行CQL命令的UI:Neo4j数据浏览器;它支持完整的ACID(原子性,一致性,隔离性和持久性)规则;它采用原生图形库与本地GPE(图形处理引擎);它支持查询的数据导出到JSON和XLS格式;它提供了REST API,可以被任何编程语言(如Java,Spring,Scala等)访问;它提供了可以通过任何UI MVC框架(如Node JS)访问的Java脚本;它支持两种Java API:Cypher API和Native Java API来开发Java应用程序。

Neo4j的优点:

  • 高度可扩展性:Neo4j具有高度可扩展性。它提供了一个简单,强大和灵活的数据模型,可以根据应用程序和用途进行更改。它提供:
更高的垂直缩放比例。
大规模改进了操作特性。
更高的并发性。
简化的调整。
  • 无模式: Neo4j与其他NoSQL数据库—样无模式。
  • 高可用性: Neo4j通过事务保证为大型企业实时应用程序提供高可用性。
  • 实时数据分析: Neo4j提供基于实时数据的结果。
  • 易于表示: Neo4j提供了一种非常简单的方法来表示连接【关系】的和半结构化的数据【节点】。
  • 快速执行: Neo4j速度很快,因为连接的数据非常容易检索和浏览。
  • 轻松检索: Neo4j不仅可以帮助您表示,而且可以比较容易地更快地检索与(遍历/导航)其他数据库中的连接数据。
  • 密码查询语言;:Neo4提供了CQL(密码查询语言)一种声明性查询语言,使用ASCIi语法将图形直观地表示出来。该语言的命令非常易于学习并且易于阅读。
  • 无联接:Neo4不需要复杂的联接即可检索已连接/相关的数据,因为无需联接或索引即可轻松检索其相邻节点或关系详细信息,因为它是一个图数据库并且所有节点都已连接。

3 Neo4j数据模型 图论基础

图论〔Graph Theory〕是数学的一个分支。它以图为研究对象。图论中的图是由若干给定的连接两点的线所构成的图形,这种图形通常用来描述某些事物之间的某种特定关系,用点代表事物,用连接两点的线表示相应两个事物间具有这种关系

以属性【key,value】的形式将数据存储在节点和边中。在图中,我们可以用一个圆圈表示节点,用箭头表示节点之间的关系。简单的可能图是单个节点:
在这里插入图片描述

我们可以使用节点表示社交网络中的个人资料,向节点中添加一些属性:
在这里插入图片描述
在两个节点之间创建关系:
在这里插入图片描述
此处在两个配置文件之间创建关系名称“跟随”。 这意味着 Profile-I 遵循 Profile-II。

图的顶点表示相同类型的事物(分别是人、网页或交叉路口)。然而,图不局限于这样的同构数据,图更为强大的用途在于提供了单个数据存储区中保存完全不同类型对象的一致性方式。如Facebook维护一个含许多不同类型的顶点与边的大图:

  • 顶点包括人、地点、事件、签到和用户的评论
  • 边表示哪些人是彼此的朋友,签到发生在哪些位置, 谁评论了哪个帖子, 谁参与了哪个事件

在这里插入图片描述
它可能来自社交网络或某族谱数据库。 案例是两个人,分别来自爱达荷州的Lucy和来自法国波恩的Alain,它们结婚了,目前住在伦敦。

有多种不同但相关的方法可构建和查询图中的数据。本节将讨论属性图模型和三元存储模型。

4 属性图模型

在这里插入图片描述

在属性图模型中,每个顶点包括:

  • 唯一标识符
  • 出边的集合
  • 入边的集合
  • 属性的集合(键-值对)

每个边包括:

  • 唯一标识符
  • 边开始的顶点
  • 边结束的顶点
  • 描述两个顶点间关系类型的标签
  • 属性的集合 (键-值对)

可将图存储结构由两个关系表组成,一个用顶点, 另一个用边:
在这里插入图片描述
此模式使用PostgreSQL JSON存储每个顶点或边的属性。为每个边存储头部和尾部顶点,若想要顶点的入边或出边集合 ,可分别通过head_vertex 或tail_vertex来查edges表。

图模型重点:

  • 任何顶点都能连接到其他任一顶点,没有模式限制哪种事物可或不可关联
  • 给定某顶点,可高效得到它的所有入、出边,从而遍历图,即沿着这些顶点链条一直向前或向后(这就是为何图2-2中在tail_vertex和
    head_vertex列上都建立索引的原因)
  • 通过对不同类型的关系使用不同标签,可在单个图中存储多种不同类型的信息,同时仍保持整洁的数据模型。

5 Neo4j的构建元素

在这里插入图片描述
节点(Node)是图数据库中的一个基本元素,用来表示一个实体记录,就像关系数据库中的一条记录一样。在Neo4j中节点可以包含多个属性(Property)和多个标签(Label)。

  • 1、节点是主要的数据元素节点,通过关系连接到其他节点,节点可以具有一个或多个属性
  • 2、节点有一个或多个标签,用于描述其在图表中的作用

属性(Property)是用于描述节点和关系的键值对。其中Key是一个字符串,值可以通过使用任何Neo4j数据类型来表示。

  • 1、键是字符串,属性可以被索引和约束
  • 2、可以在多个属性创建复合索引

关系(Relationship)同样是图数据库的基本元素。当数据库中已经存在节点后,需要将节点连接起来构成图。关系就是用来连接两个节点,关系也称为图论的边(Edge) ,其始端和末端都必须是节点,关系不能指向空也不能从空发起。关系和节点一样可以包含多个属性,但关系只能有一个类型(Type) 。

  • 1、连接两个节点关系是有方向性的,节点可以有多个甚至递归的关系
  • 2、关系可以有一个或多个属性
  • 3、基于方向性,Neo4j关系被分为两种主要类型:单向关系双向关系

标签(Label)将一个公共名称【标签名】与一组节点或关系相关联, 节点或关系可以包含一个或多个标签。 我们 可以为现有节点或关系创建新标签, 我们可以从现有节点或关系中删除标签。

  • 标签用于将节点分组
  • 一个节点可以具有多个标签
  • 对标签进行索引以加速在图中查找节点
  • 本机标签索引针对速度进行了优化

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_73616.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

8000+字,就说一个字Volatile

简介 volatile是Java提供的一种轻量级的同步机制。Java 语言包含两种内在的同步机制:同步块(或方法)和 volatile 变量,相比于synchronized(synchronized通常称为重量级锁),volatile更轻量级&…

【大数据】记一次hadoop集群missing block问题排查和数据恢复

问题描述 集群环境总共有2个NN节点,3个JN节点,40个DN节点,基于hadoop-3.3.1的版本。集群采用的双副本,未使用ec纠删码。 问题如下: bin/hdfs fsck -list-corruptfileblocks / The list of corrupt files under path…

汽车零部件行业mes系统具体功能介绍

众所周知,汽车零部件的组装是汽车制造的关键环节,而汽车零部件江湖变革以精益为终极目标。即汽车零部件制造企业转型升级向精益生产和精益管理方向前进,而车间信息化管理是精益化生产的基础。 汽车零部件行业现状 随着全球汽车产业不断升级…

蓝牙标签操作指南

一、APP安装指南 1.APP权限问题 电子标签APP安装之后,会提示一些权限的申请,点击允许。否则某些会影响APP的正常运行。安装后,搜索不到蓝牙标签,可以关闭App,重新打开。 2.手机功能 运行APP时候,需要打开…

Linux基本介绍与常用操作指令

参考链接: Linux面试必备20个常用命令_无 羡ღ的博客-CSDN博客_linux常用命令 1. Linux简介 Linux是一个支持多用户、多任务、多线程和多CPU的操作系统,特点是免费、稳定、高效, 一般运行在大型服务器上。 1.1 常用目录简介 /:根目…

【华为OD机试模拟题】用 C++ 实现 - 数组的中心位置(2023.Q1)

最近更新的博客 华为OD机试 - 入栈出栈(C++) | 附带编码思路 【2023】 华为OD机试 - 箱子之形摆放(C++) | 附带编码思路 【2023】 华为OD机试 - 简易内存池 2(C++) | 附带编码思路 【2023】 华为OD机试 - 第 N 个排列(C++) | 附带编码思路 【2023】 华为OD机试 - 考古…

MES系统需求误区,一文告诉你需求分析有哪些

在企业的实际应用中,对MES系统需求的分析常常会出现六个错误。 要求广泛,目标不明确由于对MES系统的概念和企业的实际运作不了解,导致企业在提出MES系统的要求时,常常会笼统而不明确,有时会混淆目标和需要。比如&#…

一篇五分生信临床模型预测文章代码复现——FIgure 9.列线图构建,ROC分析,DCA分析 (五)

之前讲过临床模型预测的专栏,但那只是基础版本,下面我们以自噬相关基因为例子,模仿一篇五分文章,将图和代码复现出来,学会本专栏课程,可以具备发一篇五分左右文章的水平: 本专栏目录如下: Figure 1:差异表达基因及预后基因筛选(图片仅供参考) Figure 2. 生存分析,…

复现SCI文章:配对连线、散点箱线图

今天我们要复现的是一篇SCI文章的配对连线箱线图,配对箱线图、或者说配对连线图我们之前有写过(ggplot做分组配对连线图、ggplot2|ggpubr配对箱线图绘制与配对检验、复现NC图表-配对小提琴的绘制(理解绘图函数内部底层机制)&#…

关于用windows开发遇到的各种乌龙事件之node版本管理---nvm install node之后 npm 找不到的问题

友情提醒,开发最好用nvm控制node版本 nrm 控制镜像源,能少掉很多头发开发过程中技术迭代更新的时候最要老命的就是 历史项目的node版本没有记录,导致开启旧项目的时候就会报错。尤其是npm 升级到8.x.x以后,各种版本不兼容。 真…

Homekit智能家居DIY一WIFI智能插座

WiFi智能插座对于新手接触智能家居产品更加友好,不需要额外购买网关设备 很多智能小配件也给我们得生活带来极大的便捷,智能插座就是其中之一,比如外出忘记关空调,可以拿起手机远程关闭。 简单说就是:插座可以连接wi…

VMware ESXi 7.0 Update 3k - 领先的裸机 Hypervisor (sysin Custom Image)

VMware ESXi 7.0 Update 3k - 领先的裸机 Hypervisor (sysin Custom Image) VMware ESXi 7.0 Update 3k Standard & All Custom Image for ESXi 7.0 U3k Install CD 请访问原文链接:https://sysin.org/blog/vmware-esxi-7-u3/,查看最新版。原创作品…

ChatGPT爆火:AI崛起,这些职场人的机遇到了?

ChatGPT最近真的被全球吃瓜群众玩坏了! 回答情感问题,编写代码,撰写slogan或脚本,甚至还被用于毕业生论文…… 这个连马斯克都由衷地称赞的ChatGPT,是一种全新的聊天机器人模型。上线2个月,就拥有了上亿活…

04--WXML

1、什么是WXML什么是Wxml呢?我们首先要介绍一下Html,Html的全称为HyperTextMarkup Language,翻译过来就是超文本标记语言,这种语言目前已经普遍用于前端开发,而wxml正是从html演变而来,它基于微信这个平台&…

SQL server设置用户只能访问特定数据库、访问特定表或视图

在实际业务场景我们可能需要开放单独用户给第三方使用,并且不想让第三方看到与业务不相关的表或视图,我们需要在数据库中设置一切权限来实现此功能: 1.设置用户只能查看数据库中特定的视图或表 1.创建用户名 选择默认数据库 服务器角色默认…

__stack_chk_fail问题分析

一、问题进程收到SIGABRT信号异常退出,异常调用栈显示__stack_chk_fail*** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** Build fingerprint: Pico/A7H10/PICOA7H10:10/5.5.0/smartcm.1676912090:userdebug/dev-keys Revision: 0 ABI: arm64 Times…

Web前端学习:一

编辑器的基础使用 编辑器推荐使用: HBuilderx(免费中文)(建议使用) Sublime(免费英文) Sublime中文设置方法,下载语言插件: 1、进入Sublime后,ShiftCtrlP…

wait/notify方法 等待唤醒机制

线程正在运行,调用这个线程的wait()方法,这个线程就会进入一个集合进行等待(这个集合的线程不会争抢cpu),此时线程的状态就是waiting 当有线程调用notify()方法的时候,就会从集合中挑选一个线程进入到排队队列里面 notifyAll就是…

【样式】轮播图样式 uview 版本 : “2.0.31“

![在这里插入图片描述](https://img-blog.csdnimg.cn/6cd568ce932b4ea7ae52f10365979680.png html <view class"addSwiperdiv"><image src"/static/66.png" mode"aspectFill" class"titleimg"></image><view c…

VC++ 解决dll库动态库加载失败问题(调用LoadLibrary加载失败)(附源码)

目录 1、动态加载dll库去调用库中的函数 1.1、调用系统dll库中未公开的接口 1.2、调用控件库中的注册接口向系统中注册该控件 2、LoadLibrary动态加载dll库失败的场景 2.1、自制安装包中遇到的LoadLibrary加载dll库失败问题 2.2、主程序底层模块调用LoadLibrary加载dll库…