(2.8)ICDE 2023|Wind-Bell Index:面向图数据库的超快速边查询

ICDE 2023|Wind-Bell Index:面向图数据库的超快速边查询

为了高效存储和处理图,存图数据库得到了快速发展。然而,大多数图数据库采用的基础数据结构都是邻接表,虽然在稀疏图中可以发挥不错的效果,但存在一些关键问题:(1)大部分图都是呈幂律分布,在此分布下,邻接表的表现很差(2)无法通过顶点和终点查询到边。本次为大家带来数据库领域顶级会议ICDE2023的论文《Wind-Bell Index: Towards Ultra-Fast Edge Query for Graph Databases》。

背景

近些年,图数据库因其可以存储和处理图类型的数据得到了快速发展。考虑到实际中稀疏图的普遍性,大多数图数据库所采用的数据结构都是邻接表。然而邻接表不能通过给定的起点和终点直接查询到一条边,而是要在相同起点下的链表下逐个查询,产生很大的时间开销。而且,边的偏斜分布对查询有着至关重要的影响,且大多数图的点的度数都是呈现幂律分布,即度数大的点只占少数,大部分点的度数都是很小的。这导致采用邻接表的图数据库在查询起点为度数大的点时所耗费的时间长,度数小的点所耗费的时间短,但是度数大的点一般会被更频繁的访问,所以就导致平均查询时间较长。针对此问题,先前的研究与改进大多集中于某一特定问题上,如挖掘相似性,切分子图,找最短路等。

该论文提出了一种存图的新数据结构Wind-Bell,实现了边的快速查询以及不错的空间成本。该论文的主要贡献如下:

  1. 设计了可以加速边查询速度的数据结构Wind-Bell,相比于初始的Neo4j的JAVA API方法快了几百倍
  2. 通过数学证明了其算法的复杂度,在理论上证明了效率与可行性
  3. 将该数据结构在图数据库Neo4j上实现,并提供了边查询的新接口

数据结构

定义

可将该数据结构形象地想象为风铃,它由两部分组成,一部分是顶棚矩阵,另一部分是悬挂链表。

顶棚矩阵

顶棚矩阵是一个邻接矩阵,计为A,矩阵的每个元素是一个一个的桶(用来存边),即A[i][j],每当要向wind-bell里存边的时候,它存储位置的行由起点决定,列由终点决定。用N个哈希函数对起点和终点进行计算,可以得到将边映射到N行N列的矩阵,即顶棚矩阵上,由此就是有N2

个桶来存储这些数据。

每个桶记录两个变量,一个是计数器CNT,用来计数当前桶内有多少个元素,另一个是指针PTR,用来指向悬挂链表的第一个元素。

悬挂链表

链表中的每个元素至少记录5个变量,分别为该边的起点、终点,指向上一条以及下一条边的指针,以及一个指向具有相同起点和终点的边的指针。由定义可以看出该链表为一个双向链表,且考虑到了重边的存在。当某一起点到指定终点具有多条边时,其会在悬挂链表中的某一元素处再次形成一个链表,以此来处理重边的情况。在这5个变量基础上,每个元素结点可额外记录其它信息如边的权值、名字等。采用双向链表可以更好地为图数据库提供灵活的操作。

插入

对于每条新插入的边,在插入前通过查询函数检查是否已经存在,如果存在的话,将该边更新为已存在元素;不然,就需要向wind-bell里插入新元素。

首先用N个哈希函数计算出N2

个候选桶,将该边放入其中一个桶中,并更新被选中的桶的CNT。

可以灵活地调整N,如果强调数据存储平衡,可以使用更大的N来保证每次插入元素时可以选择插入元素最少的桶;如果希望有更快的查询速度,可以使用较小的N来减少每次查询时所需要遍历的桶的数量。


示例(见图一)

设置N=2。当要插入边<18.6>时(图中绿色部分),首先用2个哈希函数对其顶点和终点进行计算,得到4个候选桶(这个新边可以放入其中的任何一个桶中),接下来遍历这些桶,选择具有最小计数CNT的桶来放入这条新边,更新这个桶的CNT,并使其PTR更新,指向为新插入的这条边。

查询

为了查询指定起点与终点的边,首先使用N个哈希函数计算出可能存在该边的N2

个候选桶,接着遍历这些桶判断该边是否存在,如果是的话就返回该元素,不然则返回空指针。

示例(见图一)

假设要查询边<20,21>(图中橙色部分),我们首先对其起点和终点分别使用哈希函数进行计算,得到了4个候选桶,接着遍历这些桶,来检查边<20,21>是否存在其中。

优化

为了实现更好的存储平衡,论文提出了一种优化策略并提供了调整操作。

N2

个桶中CNT最大的桶满足下面两个条件时,该桶将会被在插入过程中被调整

  1. 该桶的长度超过指定阈值
  2. 该桶与这N2

    个桶中的最短桶的CNT比值超过指定阈值

在执行调整时操作时,将该桶内的最后一个元素,即最早放入的元素移出,并对其重新进行插入操作。为了更快、更便捷地执行这一操作,每个桶需要额外维护一个指针,指向桶内的最后一个元素,从而可以直接找到最早放入桶内的元素,并对其重新执行插入操作。添加队尾指针将额外增加顶棚矩阵一半的空间开销,但是顶棚矩阵的空间开销只占wind-bell整个空间开销中很小的一部分。而且,调整操作的时间复杂度是常数,不会影响整个操作的时间复杂度。换句话说,这是以一个很小的空间代价节约很多的时间开销。

示例

定义N2=4,

每个桶最长长度阈值为10,阈值比为2。假设要插入边<79,19>,首先需要依据起点和终点计算出4个候选桶,然后选择其中CNT最小的桶放入该边。操作完成后,检查最长桶是否满足调整条件,发现其满足调整的两个条件,于是将其最早放入的元素<20,19>,通过队尾指针调用其重新执行插入操作。

时间复杂度证明

假设一共有m个结点,S条边,结点的出度与入度分别标记为Xi

Yi

,结点的入度和出度独立同分布于X

。定义顶棚矩阵的大小为K*K(K<=m).假设有Gi

个起点Xi[1..Gi]

映射到i行,Hj

个终点Yj[1..Hj]

映射到j列(0<=Gi

, Hj

<=m).每次插入一个元素时,选择N行N列去找到N^2个候选桶,插入到其中CNT最小的桶里。为简便计算,在本节中,定义N=1。

显然,邻接表的单次插入开销为(下面一系列公式中,E代表取均值,D代表取方差)

想要证明对于wind-bell,满足当X分布满足limm→+∞DXm=0

EX>μ>0

.时,有下式成立

为了证明这一理论,首先给出两个前提。

第一,注意到X分布可能随着结点的数量改变,不能直接使用任何现有的SLLN(强大数定理)。然而,注意到limm→+∞DXm=0

EX>μ>0

.因此可以使用切比雪夫不等式并得到:

换句话说,mE(X)

可以近似替代边的数量S。(实际上,入度和出度必然满足相加为边的数量,可以使用独立同分布的情况来简化证明)。

第二,观察到如果有limm→+∞Km=0

,那么有

基于上述两个前提,可以很容易地证明之前提到的结论。因为Xi

Yj

独立,所以其加和同样独立。因此有

KK=m

的条件下,可以证明wind-bell的存储访问时间总是低于邻接表。当K=m

时,有

定义x=EX2/EX2,(xm)

,令F(x)

=T1

/T2

;可以得到

因此认为F(x)

从1增加到m-1

,从m-1

减小到m

。所以

意味着wind-bell相比于邻接表有更好的查询效率。

进一步地,如果X

服从幂律分布

通过简单的数学技巧,可以得到更精确的理论结果(m→∞

也可以通过下图来说明在m=106

时,wind-bell比邻接表快200倍。

实验

实验设置

初始参数设置为N=2

,顶棚矩阵大小为100*100

,数据大小在106

量级,最大数据设置为1.3*106

采用CAIDA网络数据:CAIDA数据通过五元组识别每个IP轨迹流,源与目标IP地址,源与目标端口,协议。对每个13字节的五元组,用额外8个字节来记录时间戳。实验使用IP轨迹的源点与目标点作为图的起点和终点,自行使用随机函数(80%位于(0,10000),其余分布在(0,1000000))创造时间戳。

实验使用的CAIDA数据集包含1067013条边以及59304个不同的结点

计算平台

18核CPUs (36线程, Intel(R) Core i9-10980XE CPU @ 3.00 GHz)以及128GB DRAM 存储器

度量

比较平均查询时间(AQT)、平均插入时间(AIT),存储率(LR),平均链表长度(ALL),最长链表长度(LLL),平均内存使用(AMU)

实验结果

在时间上,Wind-bell在各种情况下都实现了查询的高速,比朴素Neo4j快了几百倍甚至10000倍。原因在于wind-bell避免了在数据库中找结点以及遍历大度数结点的长链表来确定是否存在边。而且,维护wind-bell存储率的平衡是卓越表现的另一个原因。

在空间上,优化后的wind-bell实现更好的存储率,并在各个度量上优于朴素wind-bell,这证明论文的优化方法有效。

五、总结

论文研究了图的存储结构,构造了图的一种查询速度极快的数据结构Wind-Bell,为邻接矩阵以及邻接表的组合形式,在边的查询速度以及空间开销上都有卓越的表现。

本文作者

贾轲

重庆大学2022级计算机科学与技术(卓越)专业在读,重庆大学START团队成员。

主要研究方向:数据处理、数据库系统

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

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

相关文章

09_Java集合

一、Java集合框架概述 一方面&#xff0c; 面向对象语言对事物的体现都是以对象的形式&#xff0c;为了方便对多个对象的操作&#xff0c;就要对对象进行存储。另一方面&#xff0c;使用Array存储对象方面具有一些弊端&#xff0c;而Java 集合就像一种容器&#xff0c;可以动态…

专业140+总分420+南京信息工程大学811信号与系统考研经验南信大电子信息与通信工程,真题,大纲,参考书

今年顺利被南信大电子信息录取&#xff0c;初试420&#xff0c;专业811信号与系统140&#xff08;Jenny老师辅导班上140很多&#xff0c;真是大佬云集&#xff09;&#xff0c;今年应该是南信大电子信息最卷的一年&#xff0c;复试线比往年提高了很多&#xff0c;录取平均分380…

【c++】STL之stack和queue详解

> 作者简介&#xff1a;დ旧言~&#xff0c;目前大二&#xff0c;现在学习Java&#xff0c;c&#xff0c;c&#xff0c;Python等 > 座右铭&#xff1a;松树千年终是朽&#xff0c;槿花一日自为荣。 > 目标&#xff1a;掌握stack和queue库&#xff0c;了解deque库 >…

网络原理(HTTP篇)

网络原理HTTP 前言HTTPHTTP的工作流程抓包工具抓取HTTP报文HTTP报文格式 请求报文具体细节首行URLURL的基本格式URL encode 方法 报头(header)HostContent-Length 和 Content-TypeUser-Agent&#xff08;UA&#xff09;RefererCookie&#xff08;重要&#xff09; 前言 如图&a…

JRT监听-PDF-Excel-Img

依赖全新设计&#xff0c;我们无需再顾虑历史兼容性的束缚&#xff1b;同时&#xff0c;基于多年来累积的深入需求理解&#xff0c;JRT监听机制巧妙地借助CMD命令模式&#xff0c;达成了监听的全面统一。无论是PDF、Excel还是图片文件&#xff0c;都不再需要特殊对待或额外区分…

【Java程序员面试专栏 Java领域】Java虚拟机 核心面试指引

关于Java 虚拟机部分的核心知识进行一网打尽,主要包括Java虚拟机的内存分区,执行流程等,通过一篇文章串联面试重点,并且帮助加强日常基础知识的理解,全局思维导图如下所示 JVM 程序执行流程 包括Java程序的完整执行流程,以及Javac编译,JIT即时编译 Java程序的完整执…

防火墙 iptables(二)-------------SNAT与DNAT

一、SNAT ①SNAT 应用环境: 局域网主机共享单个公网IP地址接入Internet (私有IP不能在Internet中正常路由) ②SNAT原理: 源地址转换&#xff0c;根据指定条件修改数据包的源IP地址&#xff0c;通常被叫做源映射 数据包从内网发送到公网时&#xff0c;SNAT会把数据包的源IP由…

pytorch中dataloader的prefetch_factor出错

今天跑huggingface的示例的时候&#xff0c;遇到了最让我头疼的问题&#xff0c;国内网上还没有对应的解释&#xff0c;我可能是第一人&#xff08;汗&#xff09;先看看报错&#xff1a; Traceback (most recent call last):File "F:\transformer\transformers\examples…

C++学习Day06之继承基本语法

目录 一、程序及输出1.1 没有继承1.2 使用继承 二、分析与总结 一、程序及输出 想象在移动端看资讯&#xff0c;顶部、底部、左侧和中间内容&#xff0c;左侧滑动栏有新闻、体育…&#xff0c;点击不同的新闻&#xff0c;中间内容呈现不同主题的文字叙述&#xff0c;在代码里该…

.ma1x0勒索病毒解密方法|勒索病毒解决|勒索病毒恢复|数据库修复

尊敬的读者&#xff1a; 数据安全问题备受关注。而勒索病毒是其中一种最为恶劣的威胁之一。其中&#xff0c;.ma1x0勒索病毒备受人们担忧&#xff0c;因其可将用户的数据文件加密&#xff0c;并要求支付赎金以解密文件。本文将介绍.ma1x0勒索病毒的特征、预防方法以及如何恢复…

⭐北邮复试刷题103. 二叉树的锯齿形层序遍历 (力扣每日一题)

103. 二叉树的锯齿形层序遍历 给你二叉树的根节点 root &#xff0c;返回其节点值的 锯齿形层序遍历 。&#xff08;即先从左往右&#xff0c;再从右往左进行下一层遍历&#xff0c;以此类推&#xff0c;层与层之间交替进行&#xff09;。 示例 1&#xff1a;输入&#xff1a…

SSM框架,spring-aop的学习

代理模式 二十三种设计模式中的一种&#xff0c;属于结构型模式。它的作用就是通过提供一个代理类&#xff0c;让我们在调用目标方法的时候&#xff0c;不再是直接对目标方法进行调用&#xff0c;而是通过代理类间接调用。让不属于目标方法核心逻辑的代码从目标方法中剥离出来…

数据库架构师之道:MySQL安装与系统整合指南

目录 MySQL数据库安装&#xff08;centos&#xff09; 版本选择 企业版 社区版 选哪个 MySQL特点 MySQL服务端-客户端 mysql下载选择 软件包解释 安装MySQL的方式 rpm包安装 yum方式安装 源码编译安装★ 具体的编译安装步骤★★ 环境准备 free -m命令 cat /pr…

输入捕获模式测频率PWM输入模式(PWMI)测占空比

一、概念介绍 输出比较&#xff1a; 比较电路输入的CNT、CCR大小关系 &#xff0c;在通道引脚输出高低电平 二、*频率知识、测量方法补充 * N/fc得到标准频率的时长&#xff0c;也就是待测频率的周期 测频法代码实现&#xff1a;修改对射式红外传感器计次&#xff08;上升沿…

IO进程线程day1作业

1、使用fgets统计给定文件行数 代码&#xff1a; #include<stdio.h> #include<string.h> #include<stdlib.h> int main(int argc, const char *argv[]) {if(argc ! 2){printf("inputs file error\n");printf("usage:./a.out filename\n&quo…

【plt.bar绘制条形图or柱状图】:从入门到精通,只需一篇文章!【Matplotlib可视化】

【&#x1f4ca;plt.bar绘制条形图】&#xff1a;从入门到精通&#xff0c;只需一篇文章&#xff01;【Matplotlib】 利用Matplotlib进行数据可视化示例 &#x1f335;文章目录&#x1f335; &#x1f50d; 一、初识plt.bar&#xff1a;条形图的基本概念&#x1f4a1; 二、plt.…

6.s081 学习实验记录(六)copy on write fork

文章目录 实现COW一、问题二、注意三、实现COW四、实验结果 实现COW 一、问题 准备&#xff1a;切换到 cow 分支 目前 xv6 的 fork 系统调用创建的子进程会赋值父进程所有的用户态内存&#xff0c;如果父进程比较大&#xff0c;那么这个复制过程会很耗时&#xff0c;而且一般…

java根据前端所要格式返回树形3级层级数据

一、业务分析&#xff0c;根据前端需求返回如下数据格式 二、后端设计数据类型VO /*** author TTc* version 1.0* date 2024/2/15 16:47*/ Data AllArgsConstructor NoArgsConstructor public class Catalog2Vo {/*** 一级父分类的 id*/private String catalog1Id;/*** 三级子…

ForkJoin 的使用以及原理

原理 Fork-Join 是一种并行计算模式&#xff0c;它通常用于解决递归式或者分治式的问题。其原理基于将一个大的任务划分成若干个小任务&#xff0c;然后并行地执行这些小任务&#xff0c;最后将它们的结果合并起来得到最终的结果。 具体来说&#xff0c;Fork-Join 模式包含两个…

RK3399平台开发系列讲解(USB篇)U盘等存储类设备

🚀返回专栏总目录 文章目录 一、什么是U盘等存储类设备二、U盘设备传输数据结构三、U盘识别需要打开的宏沉淀、分享、成长,让自己和他人都能有所收获!😄 📢介绍U盘等存储类设备。 一、什么是U盘等存储类设备 USB Mass Storage Device Class(USB MSC/UMS) USB大容量存…