当 GraphQL 遇上图数据库,便有了更方便查询数据的方式

news2024/11/28 10:48:01

人之初,性本鸽。

大家好,我叫储惠龙(实名上网),你可以叫我小龙人,00 后一枚。目前从事后端开发工作。

今天给大家带来一个简单的为 NebulaGraph 提供 GraphQL 查询支持的 DEMO,为什么是简单的,因为本来想完成更多工作再给大家介绍的,但是上个月太忙加上下个月更忙,但是我又很想白嫖一下 Nebula 官方的奖品,所以就赶紧端上来了。

pic1|284x177

体验 NebulaGraphQL

先上项目地址:https://github.com/Dragonchu/NebulaGraphQL

GraphQL 是什么

先简单介绍一下 GraphQL,https://graphql.cn/ 详细的信息官方介绍得都很清晰。说一下我的理解,GraphQL 并不是对标 Cypher 这种查询语言,而是对标 REST 的一种 API 设计风格

所以,严格意义上,不是说使用 GraphQL 查询图数据库,而是使用一种 GraphQL 风格的 API 查询图数据库,或者说是将 Cypher 封装了一样。这个本质工作和大家做应用开发时,基于 NebulaGraph 写一些通过的 REST 接口是一样的。

API 查询示例

本文的测试数据集使用的 NebulaGraph 官方的 basketballplayer 数据集https://docs.nebula-graph.io/2.0/basketballplayer-2.X.ngql

举个例子,如果我想“根据科比的名字得到科比的全部信息”,可能会使用下面这样的 nGQL 语句:

LOOKUP ON player WHERE player.name == "Kobe Bryant" YIELD id(vertex) as vertexId | FETCH PROP ON player $-.vertexId YIELD properties(vertex);

虽然说 nGQL 已经很方便阅读了,但是如果让一个完全 0 基础的萌新来看也是看不懂的,并且这个语句的返回值是不明确的,至少没有办法从查询看到结果。而返回值的解析一直也是很多人的痛苦

那么,来看看使用 GraphQL 查询同一场景会是什么情况。

查询语句会是:

{
	players(name:"Kobe Bryant"){
		name
		age
	}
}

返回结果是:

{
	players=[{name=Kobe Bryant, age=40}]
}

看看这优雅的查询和返回结果,想必我不多说,大家也都看得懂。这真的是

pic2|220x230

其实上面说了那么多,就是官方对 GraphQL 的总结:描述你的数据、请求你所要的数据、得到可预测的结果

上述的查询在 NebulaGraphQL 中已经实现了,同时还支持通过 VertexID 查询数据(好吧,我也就实现了这两种)。

NebulaGraphQL 简单入门

NebulaGraphQL 是一个 Java 库,旨在应用层提供使用 GraphQL 语法查询 NebulaGraph 图数据库中数据的能力。

在项目中使用 NebulaGraphQL 非常简单,因为 NebulaGraphQL 本身只想做一个简单的工具库,未来如果想直接集成到 MVC 框架可能会再起一个 NebulaGraphQL-Spring 之类的项目(画大饼中……)。所以 NebulaGraphQL 的使用和 nebula-java 是几乎完全一致的。

使用示例:

//创建一个config
GraphqlSessionPoolConfig graphqlSessionPoolConfig = new GraphqlSessionPoolConfig(
                Lists.newArrayList(graphdAddress),
                Lists.newArrayList(metadAddress),
                spaceName, username, password);
//创建一个连接池
GraphqlSessionPool pool = new GraphqlSessionPool(graphqlSessionPoolConfig);
//执行语句
ExecutionResult executionResult = pool.execute("{players(age:32){name\nage}}");
//获取结果
System.out.println(executionResult.getData().toString());

其实 GraphSessionPool 内部就是使用的 nebula-java 的 SessionPool,所有配置都和使用官方提供的连接池一致,唯一的区别是需要额外提供 metad 的连接地址。这是因为 NebulaGraphQL 是通过 metad 来自动构建 Schema 的,NebulaGraphQL 会在创建连接池时自动创建 Schema。

NebulaGraphQL 的实现

NebulaGraphQL 主要是基于 graphql-java实现的。而使用 graphql-java,大家可以根据自己的项目定义自己的 GraphQL 的 Schema。不过,NebulaGraphQL 想尽可能地提供一些通用功能,并且一定是根据 NebulaGraph 的 Schema 自动构建的。

在创建 GraphqlSessionPool 时,NebulaGraphQL 通过连接 NebulaGraphQL 的 metad 将 NebulaGraph 中的元数据信息构造成 GraphQL 的 Schema 信息。这一部分是关键难题。目前,我仅仅做了如下的变换:

  1. 对于 NebulaGraph 中所有的 Tag,都会构造一个对应的 GraphQL 的可查询对象。
  2. 每一个 Tag 都会有一个同名的根据 ID 获取信息的查询。举例来说,对于 player 这个 tag,会生成一个查询 player,这个查询的参数是 vertexID,会根据 vertexID 获取到信息。
  3. 每一个 Tag 都会有一个在名称后加 -s 的查询。举例来说,对于 player 这个 tag,会生成一个查询 players,这个查询的参数是任意的属性。如果 player 上有 age,name,country 这些属性,在查询参数中可以传入这三种属性的任意组合,NebulaGraphQL 查询时会将这些参数进行“与” AND 语义的构造,再获取相关顶点。对于用户没有指定的参数,默认为 null(这是一个已知的问题,如果目的就是查 null 会有问题)。

测试数据集上自动生成的 GraphQL 的 Schema 示例:

type Query {
 player(
 "Vertex ID"
 ID: ID
): player
players(age: Int = null, name: String = null): [player]!
team(
"Vertex ID"
ID: ID
): team
 teams(name: String = null): [team]!
}
type player {
age: Int
name: String
}
type team {
name: String
}

简单讲解一下,Query 是 GraphQL 的查询入口,其中的 player, players, team, teams 都是自动生成的查询,可以当作查询语句。

player 是根据 VertexID 查询并返回一个 player,player 后面没有 ! 标识符,说明可能查询结果为空。players 查询有两个参数,对应着 player 这个 tag 的两个属性 age 和 name,这两个参数的类型都从 NebulaGraph 中的数据类型映射到了 GraphQL 的数据类型,默认值都为 null,返回值是一个列表。列表后的 !,说明一定返回一个列表,但是其中的 player 后没有 ! 标识符,指的是可能返回一个空列表。

使用 players 查询,参数可以指定 age 或者 name,或者 age 和 name 一起指定。

下面的 player 和 team 两个 type 就表示了这两个对象有什么属性,可以在查询时指定返回的属性,NebulaGraphQL 在返回结果时就只会提供查询需要的属性。

每一个 GraphQL 的查询会有一个绑定的 DataFetcher 对象,该对象中实现的就是如何将 GraphQL 语法映射成 nGQL 语句,并执行插叙返回结果。而返回结果会映射到自定义对象上,这里使用了我另一个小工具NebulaResultBoot 将执行结果映射到自定的对象上后,我们就可以在未来实现应用层的缓存,当然这里也有一个潜在的问题:每一次查询都要求获取到每一个点边的所有属性,这部分未来需要考虑优化。

当然,NebulaGraphQL 的目标不只是简单将 nGQL 映射到 GraphQL 这么简单,因为 GraphQL 除了查询简单这个很明朗的特点,还可以更轻松的支持权限管理,以及通过 DataLoader 机制在应用层实现一层缓存。不过,我这边目前也没有研究的很透彻,如果有大佬愿意加入一起实现那就最好不过了。

为了方便大家贡献(主要是我懒),NebulaGraphQL 的开发测试已经完成了一部分的容器化了,将代码库克隆到本地后,本地只需要有 Docker,然后在仓库根目录下运行

docker-compose -f docker-compose.dev.yml up --build

就可以看到在自动跑测试了,会在本地启动 NebulaGraph 集群并自动插入测试的数据,后续会继续优化这方面的流程。

小结

NebulaGraphQL 提供了更简单的查询语句,这个查询语句的构造应该是让前端直接提供的,GraphQL 的优势之一就是可以让前端选择自己需要的数据从而避免“接口地狱”,可能会有人认为这相当于让前端直接访问数据库了。是的,我觉得这个理解也确实没问题,这也是有人反对 GraphQL 的理由,不过这里就不继续讨论了。

但是使用 GraphQL 有一个潜在优势,也就是可以更轻松的将图数据库和关系型数据库整合在一起。当然如果只是使用图数据库的话,那使用 NebulaGraphQL 至少也能方便做一些简单的数据查询与测试。

pic3|225x225

对于 NebulaGraphQL 在实际生产中的价值目前我也没有体验过,因为纯属兴趣写着玩儿,如果大家有想法,欢迎在评论区交流。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

职业教育机构转线上时,选择平台要注意哪些方面?

职业教育是提升技能和知识的重要途径,有效的职业教育能够帮助培养和发展人才,相比较线下面授课程相比,在线直播的教学,可以节省较大成本,那么在选型直播平台时,要注意哪些方面呢? 1.需要实现高清…

记录一次使用__dirname和./引出的bug

JS项目中 保存本地生成的图片时使用的路径:__dirname“/waitToFinishTask.png"。 但是在获取这张图片的时候我使用的是“./waitToFinishTask.png”。 从而抛出异常:Error: ENOENT, No such file or directory ./waitToFinishTask.png 找了好久都不知道为什么会…

【无标题】windows下使用cmake编译c++

好久没有更新博客了 最近在做c相关的,编译起来确实很痛苦。 所以心血来潮,继续更新一下 主要还是一些跨平台的库,比如zlib、libpng、opencv、ffmpeg 编译工具使用mingw作为主要编译环境支持,使用msys进行编译。 一、下载mingw…

利用etcd实现分布式锁

python etcd3模块的lock使用 观察lock的加解锁影响 在python中已经自带了分布式锁的实现方式,下面我们尝试一下加锁与解锁的流程 在运行该demo同时也对lock对应的key进行watch,观察其变化,注意python-etcd3在实现分布式锁的时候&#xff0…

前端终止请求的三种方式(ajax、axios)

一、原生ajax终止请求 1、abort() ​ XMLHttpRequest.abort() 方法用于终止 XMLHttpRequest 对象的请求,该方法没有参数,也没有返回值。当调用该方法时,如果对应 XMLHttpRequest 对象的请求已经被发送并且正在处理中,则会中止该…

一个专科生的 Python 转行之路,虽然很难,但如今月薪1w,一切值得

一个专科生的 Python 转行之路,虽然很难,但如今月薪1w,一切值得 相信每个转 IT 的人, 大部分是兴趣驱动。然而我并不是, 只能说是不反感。一开始接触编程, 是一位同事,他会 java ,也会一点前端。 印象最深刻的一次&…

前端如何处理「并发」问题?

🐱 个人主页:不叫猫先生,公众号:前端舵手 🙋‍♂️ 作者简介:2022年度博客之星前端领域TOP 2,前端领域优质作者、阿里云专家博主,专注于前端各领域技术,共同学习共同进步…

Avalon 学习系列(四)—— 循环遍历

Avalon2 的 ms-for 绑定集齐了 ms-repeat, ms-each, ms-with 的所有功能&#xff0c; 更加好用&#xff0c; 性能也提升了很多。 Avalon 不需要 vue 或 react 那样使用 key 属性来提高性能&#xff0c;内部已经帮你搞定了。 循环数组 ms-for 循环数组示例&#xff1a; <…

运维圣经:勒索病毒应急响应指南

目录 勒索病毒简介 常见勒索病毒种类 WannaCry Globelmposter Crysis/ Dharma 攻击特点 应急响应方法指南 一. 隔离被感染的服务器/主机 二. 排查业务系统 三. 确定勒索病毒种类&#xff0c; 进行溯源分析 四. 恢复数据和业务 五. 清理加固 病毒清理及加固 感染文…

零基础也能懂的python办公自动化教程,从此上班摸鱼轻轻松松

前言 如今Python在自动化办公领域的表现越来越亮眼&#xff0c;受到了很多非IT的职场人士的推崇&#xff0c;也引得更多的人去了解、学习Python。但是很多初学者都会面临这么一个困惑&#xff1a;想把Python应用在工作中&#xff0c;却不知从何下手&#xff01;&#xff08;资…

【音视频处理】音频编码AAC详解,低码率提高音质?

大家好&#xff0c;欢迎来到停止重构的频道。 本期我们介绍音频编码格式AAC。 AAC是音频最常用的编码格式之一&#xff0c;几乎所有的播放器都支持这个编码格式。 其他音频编码格式都是类似的&#xff0c;只是某些细节存在差别&#xff0c;如压缩算法、某些音频参数存在限制…

6个ChatGPT4的最佳用途

文章目录 ChatGPT 4’s Current Limitations ChatGPT 4 的当前限制1. Crafting Complex Prompts 制作复杂的提示2. Logic Problems 逻辑问题3. Verifying GPT 3.5 Text 验证 GPT 3.5 文本4. Complex Coding 复杂编码5.Nuanced Text Transformation 细微的文本转换6. Complex Kn…

100天精通Golang(基础入门篇)——第8天:Go语言程序的流程结构和条件语句

&#x1f337; 博主 libin9iOak带您 Go to Golang Language.✨ &#x1f984; 个人主页——libin9iOak的博客&#x1f390; &#x1f433; 《面试题大全》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33a; &#x1f30a; 《I…

【Unity入门】25.零基础实现游戏Demo--神鸟大战怪兽

【Unity入门】零基础实现游戏Demo--神鸟大战怪兽 大家好&#xff0c;我是Lampard~~ 欢迎来到Unity入门系列博客&#xff0c;所学知识来自B站阿发老师~感谢 (一) 前言 经过了两个月的学习&#xff0c;我们也顺利的完成了入门课程&#xff0c;最后就用一个Demo作为我们的结课句…

动态规划算法(子序列专题1)

动态规划算法专辑之子序列问题&#xff08;1&#xff09; 本专栏将从状态定义、状态转移方程、初始化、填表顺序、返回值这五大细节来详细讲述动态规划的算法的解题思路及代码实现 一、什么是子序列 子数列&#xff0c;又称子序列&#xff0c;在数学中&#xff0c;某个序列的…

工时表:如何跟踪团队进度?

工时表可以记录考勤&#xff0c;但你知道它还能帮助你管理项目和监控团队绩效吗&#xff1f;在本文中&#xff0c;了解如何将在线时间跟踪与你的日常工作流程相结合&#xff0c;以调整你的团队并提高灵活性。 在线时间追踪与手动 传统上&#xff0c;工时表在每天或每周开始时…

基于Java企业办公自动化系统设计实现(源码+lw+部署文档+讲解等)

博主介绍&#xff1a; ✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战 ✌ &#x1f345; 文末获取源码联系 &#x1f345; &#x1f447;&#x1f3fb; 精…

【干货分享】安卓加固原理分享

之前写过几篇ios加固的文章&#xff0c;感兴趣可以看一下。最近攒了一下收集的一些资料&#xff0c;打算简单写一下安卓加固相关的内容。今天先简单写一篇安卓加固原理的分享。 App会面临的风险 我们首先了解一下为什么需要加固&#xff0c;尤其是安卓APP&#xff0c;下面是A…

【网络攻击】面对网络攻击,我们该如何防范?

网络攻击手段的种类繁多&#xff0c;其中主要攻击手段的有钓鱼网站、恶意软件社交媒体欺诈等。在这篇文章中&#xff0c;我们将探讨这些攻击方式&#xff0c;并提供几种有效的防范方法。 一、钓鱼网站 钓鱼网站是一种欺诈行为&#xff0c;攻击者以虚假的方式获取用户的个人信息…

FPC的发展及应用,软板行业未来将持续增长

FPC系列文章目录 1.什么是FPC 2.什么是R-FPC 3&#xff0c;FPC的基材 4.FPC基材压延铜和电解铜的区别 5&#xff0c;FPC的辅材 6&#xff0c;FPC常见的四种类型 7&#xff0c;FPC的生产流程简介 8&#xff0c;R-FPC的生产流程简介 9&#xff0c;FPC的发展及应用 提示&…