图数据库 | 24、如何进行正确性验证?

图数据库计算和查询结果的正确性,这个重要性当然是不言而喻的!

老夫之前也写文章讲过,今天再手书一篇,旨在向大家系统地介绍一下图数据库查询与计算到底如何进行正确性验证!!!

图数据库中的操作分为以下2类:

· 面向元数据的操作:即面向顶点、边或它们之上的属性字段的操作,具体可以分为增、删、改、查4类。

·  面向高维数据的操作:这也是本书关注的重点,例如面向全图或子图数据的查询结果返回多个顶点、边组合而成的高维数据结构,可能是多顶点的集合、点边构成的路径、子图(子网)甚至是全图遍历结果。

面向高维数据的查询有以下3类:

· K邻查询:即返回某顶点的全部K度(跳)邻居顶点集合。K邻查询可以有很多变种,包括按照某个特定方向、点边属性字段进行过滤。还有全图K邻查询,也被视作一种高计算复杂度的图算法。

· 路径查询:常见的有最短路径、模板路径、环路路径、组网查询、自动展开查询等。

· 图算法:图算法在本质上是面向元数据、K邻、路径等查询方式的组合。

无论以何种方式进行高维查询,图数据库中的操作无外乎遵循如下3种遍历模式:

· 广度优先:如K邻查询、最短路径等。·深度优先:如环路查询、组网查询、模板路径查询、图嵌入随机游走等。

· 深度优先与广度优先兼而有之:以最短路径方式遍历的模板路径或组网查询、带方向或条件过滤的模板K邻查询、定制化的图算法等。

注意:
面向元数据的图数据库操作和关系型数据库有相似的地方,正确性验证方法在此就不再赘述了。本文老夫着重介绍图数据库特有的高维数据查询正确性验证。

我们以图数据库基准性能评测中常用的Twitter-2010数据集为例来说明如何进行图查询的正确性验证。

Twitter数据集(其中顶点数量为4200万,边数量为14.7亿,原始数据占24.6GB)的下载链接为:http://an.kaist.ac.kr/traces/WWW2010.html。

在开始验证前,以Twitter数据集为例,了解一下图数据模型的特征。

(1)有向图

由顶点(人)和边(关注关系)组成,其中关注关系为有向边。

Twitter源数据中有两列,对应每一行是由Tab键分隔的两个数字,例如12与13,代表两个用户的ID,表示两者间的有向的关注关系:12关注13。在图数据建模中应该构建为两条边,一条表示从12到13的正向边,另一条则是从13到12的反向边,缺一不可。后面的验证细节中很多正确性的问题都与此相关——没有构建反向边,查询结果不可避免会出错。

(2)简单图与多边图

如果一对顶点间存在超过(含)2条边,则其为多边图,否则为简单图。

在简单图中任意顶点间最多只有1条边,因此简单图也称作“单边图”​。

Twitter数据实际上是一种特殊的多边图,当两个用户互相关注对方时,他们之间可以形成两条边。在金融场景中,如果用户账户为顶点,转账交易为边,那么两个账户之间可以存在多笔转账关系,即多条边。

很多系统只能支持简单的单边图,这样就会带来很多图上查询与计算的结果错误的问题。

(3)点、边属性

Twitter数据本身除了隐含的边的方向可以作为一种特殊的边属性外,并不存在其他点边属性。这个特征区别于金融行业中的交易流水图——无论是顶点还是边都可能存在多个属性,可以被用来对实体或关系进行精准的查询过滤、筛选、排序、聚合运算、下钻、归因分析等。不支持点边属性过滤的图数据库可以认为功能没有实现闭环,也不具备商业化价值。

我们以K邻查询为例来验证图数据库查询结果的正确性!!

首先,我们要明确K邻查询的定义,事实上K-Hop查询有两种含义,分别是:第K度(跳)邻居、从第1跳到第K跳的全部邻居。

其中第K跳邻居指的是全部距离原点最短路径距离为K的邻居数量。这两种含义的区别仅仅在于到底K-Hop的邻居是只包含当前步幅(跳、层)的邻居,还是包含前面所有层的邻居。无论是哪种定义,有两个要点直接影响“正确性”​:

· K邻查询的正确实现方式默认应基于广度优先搜索。

· 结果集去重:即第K层的邻居集合中不会有重复的顶点,也不会有在其他层出现的邻居(已知的多款图数据库系统都存在数据结果没有去重的错误)​。

有的图数据库(或图计算引擎)会用深度优先搜索(DFS)方式,通过穷举全部可能的深度为K跳的路径来试图找到全部路径和最终能抵达的终点。但是,DFS方式实现K邻查询有2个致命的缺点:

·效率低下:在体量稍大的图中,不可能遍历完全,例如Twitter数据集中常见的有超过百万邻居的顶点,如果以深度遍历,复杂度是天文数字级的(百万的11次方以上)​;

·结果大概率错误:即便是可以通过DFS完成遍历,也没有对结果进行分层,即无法判断某个邻居到底是位于第1跳还是第N跳。

我们先从验证1度(1跳)邻居开始,以Twitter数据集的顶点27960125为例。在源数据集中,如图1所示,返回了8行(对应图数据库中的8条边)​,但是它的1度邻居到底是几个呢?

图1:Twitter源数据中顶点关联的边


正确答案是7个,注意图1中顶点27960125的一个邻居27498091出现了2次,它们之间存在两条相互的关系(对应源数据集中的2行)​。但是作为去重后的1度邻居集合,只有7个。

在图2中,我们以无向图(即双向边遍历)的方式对顶点27960125进行1度邻居查询,得到全部邻居顶点为7个。

图2:在命令行工具中验证顶点的邻居结果集:嬴图-CLI)


为了更精准地验证结果正确性,对K邻查询还可以按照边的方向来进行过滤,例如只查询顶点2796015的出边、入边或双向边(默认是查询双向边关联的全部邻居)​。图3展示了如何通过图查询语言来完成相应的工作。注意,该顶点有6条出边对应的1跳邻居、2条入边对应的1跳邻居,其中有1个邻居27498091是重叠的。

图3::从嬴图-CLI命令行工具操作K邻——3种遍历模式


如果参考美国图数据库厂家Tigergraph在Github网站上公开的性能测试结果数据文件,其K邻查询的结果存在明显的错误,例如图7-14中顶点27960125的1-Hop结果仅返回6个邻居。

图4:Tigergraph的性能评测结果中的数据(Github.com)

Tigergraph的查询结果错误有3个可能,并且具有典型性。

·构图错误:只存储了单向边,没有存储反向边,无法进行反向边遍历;

·查询方式错误:只进行了单向查询,没有进行双向遍历查询;

·图查询代码实现错误:即没有对结果进行有效的去重,这个在多跳K-Hop查询中再继续分析。

其中,构图错误代表数据建模错误,这意味着业务逻辑不能在数据建模层面被准确反映。例如在反欺诈、反洗钱场景中,账户A收到了一笔来自账户B的转账,但是却因为没有存储一条从A至B的反向边而无法追踪该笔交易,这显然是不能容忍的。

查询方式和查询代码逻辑错误同样也会对结果造成严重影响——每一跳查询双向边,在多跳情况下查询复杂度指数级高于单向边查询,这也意味着Tigergraph如果正确地实现图数据建模、存储与查询,其性能会指数级降低,并且存储空间的占用也会成倍增加(存储正向和反向边的数据结构要比仅存储单向边复杂2倍以上)​,数据加载时间也会成倍增加。

如果我们继续追溯顶点27960125的2-Hop结果集,就会发现结果的错误更加隐蔽,例如Tigergraph的2-Hop实际上仅仅返回了沿出边遍历的第2度邻居结果(图5)​,并且没有对结果去重。其第2度邻居数1128中含有重复的顶点,按照只进行出边查询得到的去重结果应该是1127——但是2-Hop的正确结果应该是533108(图6)​,这两者间有473倍的差异,即47300%的误差!在2-Hop的结果中,就可以看到Tigergraph的查询结果同时存在以上所述的3种错误——构图错误、查询方式错误、结果未去重错误。

图5 :Tigergraph仅进行单向遍历的错误的2-Hop结果(Github)

图6:K-Hop查询的4种遍历查询方式(嬴图-CLI)


遗憾的是,类似的查询结果错误问题在今天的图数据库市场并不是个例,我们在Neo4j、ArangoDB等系统中也发现因底层算法实现或接口调用等问题而出现的错误。

更为遗憾的是,有多个厂家的“自研图数据库”实际上是对Neo4j社区版或ArangoDB的封装,姑且不论这么操作是否涉嫌违规商用,暴力封装几乎注定了它们的查询结果也是错误的。例如Neo4j默认并不对K邻查询结果集进行去重,而一旦开启去重,它的运行效率会指数级下降;而ArangoDB有一种最短路径查询模式,只返回一条路径,这种模式本身就是对最短路径的错误理解与实现。

图数据库配套的可视化工具可以帮助我们更直观、便捷地查询结果的正确性。

上面介绍了图上的基础查询K邻查询的正确性验证方法,以及可能出现的错误情形。还有很多其他图操作同样也涉及结果错误的问题,但是都能通过一些基础的方法来验证。下面再举2个有代表性的例子:最短路径和图算法。

最短路径可以看作K邻查询的一个自然延展,区别在于它需要返回的结果有2个特征:

·高维结果:最短路径需要返回多条由顶点、边按遍历顺序组合而成的路径;

·全部路径:任意两个顶点间可能存在多条最短路径,如果是转账网络、反洗钱网络、归因分析等查询,只计算一条路径显然是无法反映全貌的。

以Twitter数据集中的顶点12、13之间的最短路径为例,它们之间存在两条最短路径(图7)​,其中一条由12指向13,另一条由13指向12(图8)​,这个在源数据中也可以通过grep操作得到快速验证。在更复杂(更深度)的查询中,可以用类似的逻辑,通过层层的抽丝剥茧来验证结果的正确性。

图7:最短路径结果示意(嬴图 - CLI)
图8:最短路径查询操作结果验证——3种遍历模式(嬴图 - CLI)


下面以杰卡德相似度算法为例来说明如何验证图算法的正确性。以图9为例,计算A、B两个顶点间的相似度,计算公式如下:

图9:小图集


在图9中,A、B节点的共同邻居数为2,全部邻居数为5,我们可以手工推算出这两个节点的杰卡德相似度为2/5=0.4。直接调用杰卡德相似度算法的结果也应该是0.4(40%)​。如果用图查询语言来白盒化实现,代码逻辑如图10所示。

图10:杰卡德相似度的图查询语言实现(嬴图-GQL查询语言)

在Twitter数据集中,任意两个顶点间的杰卡德相似度计算的复杂度和被查询顶点的1度邻居的个数直接相关,以顶点12、13为例,它们都是典型的有百万邻居的“超级节点”​,在这种情况下,手工验证结果的准确性并不现实。但是可以通过多组查询来校验结果是否正确,逻辑分为如下5步:

1)运行杰卡德相似度算法,如图11所示:

图11:直接运行杰卡德相似度算法

2)​(验证方法一)通过多句查询计算杰卡德相似度,如图12所示:

图12:杰卡德相似度算法——验证方法一

3)​(验证方法二)查询顶点12的1跳邻居个数(图13)​。

4)​(验证方法二)查询顶点13的1跳邻居个数(图13)​。

图13 :杰卡德相似度算法——验证方法二第1部分

5)​(验证方法二)查询顶点12到13之间的全部深度为2的路径(图14)​,这一结果就是两个顶点之间的全部共有邻居。

图14 杰卡德相似度算法——验证方法二第2部分

 6)​(验证方法二)用以上第5步的结果除以(第3步结果+第4步结果–第5步结果)=0.15362638。如果以上两种验证方法结果均一致,则图算法计算结果正确。

最后要说的是,本文等于非常详细地介绍了如何在图数据库上进行查询正确性验证的方法,希望可以为聪明的朋友们以开阔思路,以达到举一反三、去伪存真的效果!!! 好了,洋洋洒洒有一大篇,就此打住。88!

· END ·


(文/Ricky - HPC高性能计算与存储专家、大数据专家、数据库专家及学者)

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

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

相关文章

【二分查找 图论】P8794 [蓝桥杯 2022 国 A] 环境治理|普及

本文涉及的基础知识点 本博文代码打包下载 C二分查找 C图论 [蓝桥杯 2022 国 A] 环境治理 题目描述 LQ 国拥有 n n n 个城市,从 0 0 0 到 n − 1 n - 1 n−1 编号,这 n n n 个城市两两之间都有且仅有一条双向道路连接,这意味着任意两…

vue写一个登录页面

目录 一、安装ui库二、路由跳转三、页面 一、安装ui库 element plus库 Element Plus 是 Element UI 的升级版本,专为 Vue 3.x 设计。它继承了 Element UI 的优秀特性,同时针对 Vue 3 的新特性(如 Composition API、Teleport 等)进…

和鲸科技携手四川气象,以 AI 的力量赋能四川气象一体化平台建设

气象领域与农业、能源、交通、环境科学等国计民生关键领域紧密相连,发挥着不可替代的重要作用。人工智能技术的迅猛发展,为气象领域突破困境带来了新的契机。AI 技术能够深度挖掘气象大数据中蕴含的复杂信息,助力人类更精准地把握自然规律&am…

Ubuntu下QT安装和调试的常见问题(一)__could_not_dertermine_which_make

前言 Ubuntu下QT的安装会有一些奇怪的问题出现,并没有像Windows下Visual Studio的安装那么直接就可以使用那么方便,本文就“make”挂接的问题,给出一些小的感受。 1、问题的提出 很多问题的解答,AI无论是上文心一言,还…

C# httpclient 和 Flurl.Http 的测试

关于C#调用接口或Post,Flurl封装了httpclient, CSDN有哥们提供了一个公网的测试网站,可以测试Post调用,我写了2个函数,测试httpclient和Flurl使用Post: async 和 await 是成对使用的,为了接受web异步返回的数据,winfor…

多通道数据采集和信号生成的模块化仪器如何重构飞机电子可靠性测试体系?

飞机的核心电子系统包括发电与配电系统,飞机内部所有设备和系统之间的内部数据通信系统,以及用于外部通信的射频设备。其他所有航空电子元件都依赖这些关键总线进行电力传输或数据通信。在本文中,我们将了解模块化仪器(无论是PCIe…

Ollama部署本地大模型DeepSeek-R1-Distill-Llama-70B

文章目录 一、下模二、转模1. 下载转换工具2. 安装环境依赖3. llama.cpp1. 转换脚本依赖2. llama.cpp安装依赖包3. llama.cpp编译安装4. 格式转换 三、Ollama部署1. 安装启动Ollama2. 添加模型3. 测试运行 一、下模 #模型下载 from modelscope import snapshot_download model…

domain 网络安全 网络安全域

🍅 点击文末小卡片 ,免费获取网络安全全套资料,资料在手,涨薪更快 文章目录 1、域的概述 1.1、工作组与域1.2、域的特点1.3、域的组成1.4、域的部署概述1.5、活动目录1.6、组策略GPO 2、域的部署实验 2.1、建立局域网&#xf…

VSCode轻松调试运行.Net 8.0 Web API项目

1.背景 我一直都是用VS来开发.NetCore项目的,用的比较顺手,也习惯了。看其他技术文章有介绍VS Code更轻量,更方便。所以我专门花时间来使用VS Code,看看它是如何调试代码、如何运行.Net 8.0 WebAPI项目。这篇文章是一个记录的过程…

【fnOS飞牛云NAS本地部署DeepSeek-R1结合内网穿透远程访问告别服务器繁忙】

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

Python学习第十七天之PyTorch保姆级安装

PyTorch安装与部署 一、准备工作二、pytorch介绍三、CPU版本pytorch安装1. 创建虚拟环境2. 删除虚拟环境1. 通过环境名称删除2. 通过环境路径删除 3. 配置镜像源4. 安装pytorch1. 首先激活环境变量2. 进入pytorch官网,找到安装指令 5. 验证pytorch是否安装成功 四、…

内存管理+模板基础知识

在前面的博客中,我们已经基本学习完了类和对象有关知识,在这篇博客中,我们将要学习C/C内存管理与模板的一些基础知识。 目录 一、C/C内存管理 1.1 C/C内存分布 1.2 C内存管理方式 1.2.1 new/delete操作内置类型 1.2.2 new和delete操作自…

新建菜单项的创建之CmpGetValueListFromCache函数分析

第一部分: PCELL_DATA CmpGetValueListFromCache( IN PHHIVE Hive, IN PCACHED_CHILD_LIST ChildList, OUT BOOLEAN *IndexCached, OUT PHCELL_INDEX ValueListToRelease ) 0: kd> dv KeyControlBlock 0xe1…

《无畏契约》运行时提示“d3dcompiler_43.dll丢失”是什么原因?“找不到d3dcompiler_43.dll文件”如何解决?

--- 使用DLL修复工具(懒人专用) https://file-xfqdx-cdn.fanqiesoft.cn/package/XFQDXTool_21121_tg.exe 逐步说明: 步骤1:重新安装《无畏契约》 - 操作指南: - 打开“控制面板” → “程序和功能”。 - 在列表…

蓝牙接近开关模块感应开锁手机靠近解锁支持HID低功耗

ANS-BT101M是安朔科技推出的蓝牙接近开关模块,低功耗ble5.1,采用UART通信接口,实现手机自动无感连接,无需APP,人靠近车门自动开锁,支持苹果、安卓、鸿蒙系统,也可以通过手机手动开锁或上锁&…

Ubuntu 22.04 安装Nvidia驱动加速deepseek

一键安装22.04 nvidia 驱动 nvidia 官网下载驱动我的环境是NVIDIA RTX A5000nvidia 文档参考没有安装驱动之前确认自己的型号 lspci | grep -i vga (如数字2231) 参考docker 支持nvidia ,注释了需要的取消注释即可 42行-92行一定要重启服务器…

数据结构——双链表

1. 双向带头循环链表 1. 双链表的功能 1. 初始化 2. 销毁 3. 打印 4. 检查链表是否为空 5. 尾插 6. 尾删 7. 头插 8. 头删 9. 在目标节点之后插入数据 10. 删除目标节点 11. 查找 2. 双链表的定义 结构体需要包含三个成员,一个成员存储数据,一个成员存储…

微服务2025/2/15

微服务是一种软件架构风格,它是以专注于单一职责的很多小型项目为基础,组合出复杂的大型应用。 微服务是一种架构。 微服务是一种架构。 微服务是一种架构。 以前自己做项目最常用的架构是单体架构。单体项目不适合开发大型项目。 学习微服务技术来解…

Locust性能压测工具使用指南

Locust是一款用Python编写的开源性能测试工具,主要用于对网站或其他系统进行负载测试和性能测试,以下是关于它的详细介绍: 特点 高可扩展性:能够轻松模拟大量用户并发访问,通过简单增加节点,可以在短时间…

DaoCloud 亮相 2025 GDC丨开源赋能 AI 更多可能

2025 年 2 月 21 日至 23 日,上海徐汇西岸,2025 全球开发者先锋大会以 “模塑全球,无限可能” 的主题,围绕云计算、机器人、元宇宙等多元领域,探讨前沿技术创新、应用场景拓展和产业生态赋能,各类专业论坛、…