图数据库使用及业务场景

一. 前言

来学习下图数据以及图数据库

二. 图数据库的简单原理

2.1 图数据

我认为图数据结构就是点线面的关系,图大致分为以下概念 :

  • 节点 : 图中的基本元素,可以用来表示现实世界中的一个**实体 **
  •  : 节点之间连接的线,用来描述实体之间的关系 边可以有方向,有起始节点到终止节点边可以包含属性
  • 属性 :节点和边都可以包含属性,属性存储有关实体的信息
  • 权重 :权重指边上的一个值,用来标识成本,强度等等概念 (最短路径,最低消耗等)
  • 路径 :一个节点到另外一个节点的路程表示路径,一个路径可以包含多个节点多个边
分类
  • 按照图的方向性可以分为 :有向图,无向图
  • 按照边是否带权重可以分为 :有权图,无权图
  • 按照边的多少可以分为 : 稠密图,稀疏图
  • 按照特定类型包括 : 邻接矩阵、邻接表、关联矩阵

2.2 图数据案例

  • Neo4j: Neo4j是最受欢迎的图数据库之一,采用图结构来存储数据,并提供高效的图查询和遍历功能。Neo4j支持Cypher查询语言,适用于各种图数据分析任务
  • OrientDB : 一个多模型数据库,支持图数据库、文档数据库和对象数据库
  • Dgraph : 一个分布式图数据库,支持属性图和图数据库功能

好了,图的基本概念是清楚了,用法我们基于 Neo4j 来看

三. 图数据库 Neo4j

2.1 创建图数据库 Neo4j

可惜找了几个云服务商都没能薅羊毛,没看到可以免费领取的图数据库,所以只能自己安装下 Neo4j 了,简单点还是基于 Docker :

准备 docker-compose.yml
version: '3'
services:
  neo4j:
    image: neo4j:latest
    container_name: neo4j
    ports:
      - "7474:7474"
      - "7687:7687"
    environment:
      NEO4J_AUTH: neo4j/test123456
安装运行
docker-compose up -d

> 访问地址
http://localhost:7474/

2.2 弄清楚 Neo4j 里面的一些知识点

  • 可以通过配置创建多个Neo4j 实例,但是这种创建属于物理层面,需要修改底层配置
  • 不同于关系型数据库和NoSQL , 一个 Neo4j 实例里面只有一个主图多个子图(Enterprise版本才有子图)
  • 标签和属性更像一种分类,而不是单纯的看成节点的字段
支持的索引
  • 节点索引 :基于节点的属性创建索引
  • 关系索引 :用于关系的查找操作,基于关系的属性创建索引
  • 全文索引 :在节点的文本属性上创建,执行全文搜索查询
  • 空间索引 :用于地理空间数据 ,支持范围搜索和最近搜索
  • 时间/属性/组合等自定义索引 :其他的索引类型
CREATE INDEX ON :Person(name)

2.3 Neo4j 使用流程

使用层面上我们首先创建一个人物画像/社交网络,用于后续的分析 :

S1 : 创建节点
  • 语法 : CREATE (node:Label {property: value})
  • node 是节点变量名,可以通过 return 返回这个变量,用于后续使用,本身无含义
  • property 表示节点的属性,键值对关系,可以有多个
  • label :节点标签,用来标识节点的类型
CREATE (n1:User {name:'会员A',level:'1'}) RETURN n1;
CREATE (n2:User {name:'会员B',level:'2'}) RETURN n2;
CREATE (n3:User {name:'会员C',level:'3'}) RETURN n3;
CREATE (n4:User {name:'会员D',level:'4'}) RETURN n4;
CREATE (n5:User {name:'会员E',level:'5'}) RETURN n5;


// 创建节点的时候创建关系
CREATE (a:User {name:'会员F'})-[r:FRIENDS]->(b:User {name:'会员D'})
S2 : 查询节点
  • 查询所有节点 :MATCH (n:User {}) RETURN n
  • 查询特定属性 :MATCH (n:User {name:'会员A'}) RETURN n

查询到的结果

S3 : 为节点创建关系
MATCH (startNode:Label1), (endNode:Label2)
CREATE (startNode)-[:RELATIONSHIP_TYPE]->(endNode)
  • MATCH 子句用于匹配起始节点(startNode)和结束节点(endNode),通常使用标签和属性来过滤节点
  • CREATE 子句用于创建关系,表示连接起始节点和结束节点
  • [:RELATIONSHIP_TYPE] 是关系的类型,可以替换为想要创建的关系类型
  • 箭头表示关系的方向,从起始节点指向结束节点
// 创建 User 节点间的关系 (关系为朋友)
MATCH (a:User {name:'会员A'}), 
      (b:User {name:'会员B'}) 
MERGE (a)-[:FRIENDS]->(b)

// ↑↑↑↑ 解释
- 这里的 a 和 b 都是节点别名,用于创建关系时使用
- User 标识的是节点类型,查询这一类节点
- name 才是匹配节点的关联关系,这里是 name ,也可以是 id 等更加具体的属性

S4 : 关系查询

PS : 这里的 sn ,en 都是别名,表示是 startNode 、 endNode ,篇幅有限

- 查询特定的关系的关系 :MATCH ()-[relation:FRIENDS]->() RETURN relation
- 查询有特定关系的节点 :MATCH (n)-[:FRIENDS]-() RETURN n
- 查询特定节点和关系   :MATCH (n:User)-[:FRIENDS]-(friend:User) RETURN n, friend

// 复杂查询
- 复杂语句 :MATCH (sn)-[relation]-(en) WHERE sn.name = '会员A' AND en.name = '会员B' RETURN relation
- 特定关系 :MATCH (sn)-[rl:FRIENDS]->(en) WHERE sn.name = '会员A' RETURN rl, en
- 查询属性 :MATCH ()-[relation:FRIENDS]->() RETURN relation.propertyName
- 查询数量 :MATCH (sn)-[rl]->(en) WHERE sn.name = '会员A' RETURN COUNT(rl)
- 查询路径 :MATCH path = (sn)-[rl*]->(en) WHERE sn.name = '会员A' AND en.name = '会员C' RETURN path

以上基础就完成了,后续就进行相关的业务扩展了

S5 : 创建更多类型的节点
CREATE (n1:address {name:'武汉'}) RETURN n1;
CREATE (n2:address {name:'上海'}) RETURN n2;
CREATE (n3:address {name:'北京'}) RETURN n3;
CREATE (n4:address {name:'深圳'}) RETURN n4;
CREATE (n5:address {name:'杭州'}) RETURN n5;
S6 : 创建复杂的关系图
// 地址关联
MATCH (a:User {name:'会员A'}), (b:address {name:'武汉'}) MERGE (a)-[:ADDRESS]->(b);
MATCH (a:User {name:'会员B'}), (b:address {name:'武汉'}) MERGE (a)-[:ADDRESS]->(b);
MATCH (a:User {name:'会员C'}), (b:address {name:'武汉'}) MERGE (a)-[:ADDRESS]->(b);
MATCH (a:User {name:'会员D'}), (b:address {name:'上海'}) MERGE (a)-[:ADDRESS]->(b);
MATCH (a:User {name:'会员E'}), (b:address {name:'北京'}) MERGE (a)-[:ADDRESS]->(b);
MATCH (a:User {name:'会员A'}), (b:address {name:'深圳'}) MERGE (a)-[:FRIENDS]->(b);
MATCH (a:User {name:'会员A'}), (b:address {name:'杭州'}) MERGE (a)-[:FRIENDS]->(b);

// 朋友关联 : 
MATCH (a:User {name:'会员B'}), (b:User {name:'会员E'}) MERGE (a)-[:FRIENDS]->(b);
S7 : 最终效果
// 查询所有节点和节点间的关系 :
MATCH (n) RETURN n

// 查询所有有关系的节点
MATCH (a)--() RETURN a


// 查询所有对外有关系的节点,以及关系类型
MATCH (a)-[r]->() RETURN a.name, type(r)

S8 : 基于图的业务价值
// 查询与武汉节点关联的节点
MATCH (a:address {name: '武汉'})-[r]-(b) RETURN b
MATCH (a:address {name: '武汉'})-[r]-(b) RETURN a,b
- PS : 这里 return 可以返回多个,展示的效果是不同的


// 查询朋友的朋友
MATCH (a:User {name:'会员A'})-[r1:FRIENDS]-()-[r2:FRIENDS]-(friend_of_a_friend) RETURN friend_of_a_friend.name AS fofName
S9 : 补充语法
// 修改节点属性
MATCH (a:User {name:'会员A'}) SET a.city="武汉"

// 删除节点属性
MATCH (a:User {name:'会员A'}) REMOVE a.city

// 删除节点
MATCH (a:User {name:'会员G'}) DELETE a

// 删除关系
MATCH (a:User {name: '会员G'})-[r:FRIENDS]-(b:User {name: '会员D'}) DELETE r

// 删除节点及关系
MATCH (alice:User {name: '会员G'}) DETACH DELETE alice

三. 性能对比

性能比较主要集中在特定的场景,图数据库因为其特殊的形式,在深度遍历等方面的效率是远大于关系型数据库的,取自Neo4j 官方的博文 : @ http://neo4j.com/news/how-mu…

在 一百万数据 里面抽取 1000 个样本进行计算,查询朋友的朋友,按照不同的深度进行查询。

对于简单的好友的好友查询,Neo4j 比 MySQL 快 60%。对于朋友的朋友的朋友来说,Neo 的速度快了 180 倍。对于深度四查询,Neo4j 的速度快了 1,135 倍

四. 业务上怎么使用它更受益

在此期间比较浅显的读了一下 Neo4j 实战,大概可以从这几个方面来描述一下图数据库的优势 :

4.1 图数据库的使用场景

想看使用场景我们直接去官方看案例即可 :

我打交道比较多的就是社交和零散,主要看看这两块

社交关系

不知道大家有没有听过一个理论叫六度分隔理论,这个理论说的就是 : 世界上任意两个人之间的联系最多需要通过不超过六个中介,即通过六个人,就可以建立起联系

我们假设这个理论上成立的,我想知道我和一个陌生人之间可以是通过哪几个人进行关联的,首先从 MySQL 角度看 :

  • S1 : 构建一个人员信息表 , 为每个人员分配一个主键,标识现实中的实体
  • S2 : 构建一个关联信息表,构建这个人会和哪些人员进行关联
  • S3 : 走3个left join 或者逻辑中进行 for 循环+算法进行判断

很明显,这种方式占用资源很多,一不小心就会形成笛卡尔积,几何倍数

那么如果用图数据库,该怎么做?

// 展示会员A 朋友的朋友的朋友
MATCH (start:User {name: '会员A'})-[:FRIENDS*3]-(foaf:User) RETURN start, foaf
零售行业

最直接的包括最短路径算法,最优库存的实现 , 其次包括会员关系,精准有效都有些作用。

最短路径最直接的场景就是送外卖,哪些外卖分配更加合理。往更高级方向想就是物流。

总结

图数据库的使用是能解决很多复杂场景的问题的,但是这需要达到一定的量级。没达到量级使用关系型数据一样能满足。

但是整体来说,针对特定场景提高效率,优化业务,精准消费的效果还是很可观的。

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

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

相关文章

Linux 远程登录

Linux 远程登录 Linux 一般作为服务器使用,而服务器一般放在机房,你不可能在机房操作你的 Linux 服务器。 这时我们就需要远程登录到Linux服务器来管理维护系统。 Linux 系统中是通过 ssh 服务实现的远程登录功能,默认 ssh 服务端口号为 2…

Spring+MyBatis整合案例

提示:要有自学能力,会学习 文章目录 前言前期准备项目内容数据库创建应用程序配置po 包代码mapper 包代码service 包代码测试类代码添加事物处理功能 前言 提示:这里可以添加本文要记录的大概内容: 前期准备 第一步&#xff1a…

pytorch的CrossEntropyLoss交叉熵损失函数默认reduction是平均值

pytorch中使用nn.CrossEntropyLoss()创建出来的交叉熵损失函数计算损失默认是求平均值的,即多个样本输入后获取的是一个均值标量,而不是样本大小的向量。 net nn.Linear(4, 2) loss nn.CrossEntropyLoss() X torch.rand(10, 4) y torch.ones(10, dt…

[oeasy]python0082_[趣味拓展]控制序列_清屏_控制输出位置_2J

光标位置 回忆上次内容 上次了解了键盘演化的过程 ESC 从 组合键到 独立按键 ESC的作用 是 进入 控制序列配置 控制信息控制信息 \033[y;xH 设置光标位置\033[2J 清屏 这到底怎么控制???🤔谁来实现这些功能? 控制…

ensp与虚拟机搭建测试环境

1.虚拟机配置 ①首先确定VMnet8 IP地址,若要修改IP地址,保证在启动Ensp前操作 ②尽量保证NAT模式 2.ensp配置 (1)拓扑结构 (2)Cloud配置 ①首先点击 绑定信息 UDP → 增加 ②然后点击 绑定信息 VMware ... → 增加 ③最后在 端口映射设置上点击双向通…

[oeasy]python0081_[趣味拓展]ESC键进化历史_键盘演化过程_ANSI_控制序列_转义序列_CSI

光标位置 回忆上次内容 上次了解了 新的转义模式 \033 逃逸控制字符 escape 这个字符 让字符串 退出标准输出流进行控制信息的设置 可以设置 光标输出的位置 ASR33中的ALT MODE 是 今天的ESC键吗????🤔 查询文档…

Ajax入门

文章目录 axios体验axios-查询参数常用请求方法数据提交 axios错误处理 axios体验 引入axios库 使用axios语法 axios({url: 目标资源地址 }).then((result)>{// 对服务器返回的数据做后续处理 })完整实例 <!DOCTYPE html> <html lang"en"><head&g…

eclipse Java Code_Style Code_Templates

Preferences - Java - Code Style - Code Templates Eclipse [Java_Code_Style_Code_Templates_ZengWenFeng] 2023.08.07.xml 创建一个新的工程&#xff0c;不然有时候不生效&#xff0c;旧项目可能要重新导入eclipse 创建一个测试类试一试 所有的设置都生效了

在java中如何使用openOffice进行格式转换,word,excel,ppt,pdf互相转换

1.首先需要下载并安装openOffice,下载地址为&#xff1a; Apache OpenOffice download | SourceForge.net 2.安装后&#xff0c;可以测试下是否可用&#xff1b; 3.build.gradle中引入依赖&#xff1a; implementation group: com.artofsolving, name: jodconverter, version:…

使用 API Gateway Integrator 在 Quarkus 中实施适用于 AWS Lambda 的 OpenAPI

AWS API Gateway 集成使得使用符合 OpenAPI 标准的 Lambda Function 轻松实现 REST API。 关于开放API 它是一个 允许以标准方式描述 REST API 的规范。 OpenAPI规范 (OAS) 为 REST API 定义了与编程语言无关的标准接口描述。这使得人类和计算机都可以发现和理解服务的功能&am…

STM32 LoRa源码解读

目录结构&#xff1a; SX1278 |-- include | |-- fifo.h | |-- lora.h | |-- platform.h | |-- radio.h | |-- spi.h | |-- sx1276.h | |-- sx1276Fsk.h | |-- sx1276FskMisc.h | |-- sx1276Hal.h | |-- sx1276LoRa.h | -- sx1276LoRaMisc.h – src |-- fifo.c |-- lora.c |-- …

0140 数据链路层2

目录 3.数据链路层 3.6局域网 3.7广域网 3.8数据链路层设备 部分习题 3.数据链路层 3.6局域网 3.7广域网 3.8数据链路层设备 部分习题 1.如果使用5类UTP来设计一个覆盖范围为200m的10BASE-T以太网&#xff0c;需要采用的设备是&#xff08;&#xff09; A.放大器 …

idea导入新项目报异常:Error:java: Compilation failed: internal java compiler error

修改settings中项目对象Java编译配置恢复正常。 标记的两个地方配置修改和项目一样后&#xff0c;正常。

OpenSource - 分布式重试平台

文章目录 概述重试方案对比设计思想流量管理平台预览场景应用强通知场景发送MQ场景回调场景异步场景 概述 在当前广泛流行的分布式系统中&#xff0c;确保系统数据的一致性和正确性是一项重大挑战。为了解决分布式事务问题&#xff0c;涌现了许多理论和业务实践&#xff0c;其…

AJAX-笔记(持续更新中)

文章目录 Day1 Ajax入门1.AJAX概念和axios的使用2. 认识URL3.URL的查询参数4.常用的请求方法和数据提交5.HTTP协议-报文6.接口文档7.form-serialize插件8.案例用户登录 Day2 Ajax综合案bootstrap弹框图书管理图片上传更换背景个人信息设置 Day3 AJAX原理XMLHttpRequestPromise封…

Idea全局搜索(ctrl+shift+F),搜索不全问题

今天idea突然出现&#xff0c;全局搜索&#xff0c;命名html文件中有这个字符&#xff0c;但是全局搜索居然匹配内容是空。。。。而且全局搜索界面也设置好了 经查发现是缓存问题&#xff0c;于是&#xff1a; 清空缓存后发现全局搜索功能可正常使用...

[Microsoft][ODBC 驱动程序管理器] 未发现数据源名称并且未指定默认驱动程序

1.今天开发了一套服务程序&#xff0c;使用的是Odbc连接MySql数据库&#xff0c; 在我本机用VS打开程序时&#xff0c;访问一切正常&#xff0c;当发布出来装在电脑上&#xff0c;连接数据库时提示&#xff1a; [Microsoft][ODBC 驱动程序管理器] 未发现数据源名称并且未指定…

uniapp 微信小程序 上下滚动的公告通知(只取前3条)

效果图&#xff1a; <template><view class"notice" click"policyInformation"><view class"notice-icon"><image mode"aspectFit" class"img" src"/static/img/megaphone.png"></i…

计算机网络的定义和分类

计算机网络的定义和分类 计算机网络的定义 计算机网络的精确定义并未统一计算机网络最简单的定义是&#xff1a;一些互相连接的、自治的计算机的集合 互连:指计算机之间可以通过有线或无线的方式进行数据通信自治:是指独立的计算机&#xff0c;它有自己的硬件和软件&#xff…

【深度学习_TensorFlow】手写数字识别

写在前面 到这里为止&#xff0c;我们已经学习完张量的常用操作方法&#xff0c;已具备实现大部分神经网络技术的基础储备了。这一章节我们将开启神经网络的学习&#xff0c;然而并不需要像学习前面那样了解大量的张量操作&#xff0c;而是将重点转向理解概念知识&#xff0c;…