最新要闻
- 6月14日北向资金最新动向(附十大成交股)_全球今头条
- iQOO Neo8 Pro顶配版明天首销:1TB UFS 4.0规格 3699价位独此一款
- 《神鬼寓言4》女主角外观遭玩家吐槽:这是在比丑!-全球快资讯
- 国产新能源深蓝SL03路口起火烧毁 厂商:系发动机护板卷入麦秆自燃引起
- 【全球快播报】Win11企业版默认启用SMB签名导致Bug:微软发布解决方案
- 每日看点!用上宁德时代麒麟电池!新款哪吒S曝光:能跑1075km
- 焦点速看:认知型通用大模型“360智脑”升级4.0,国内首发“文生视频”多模态功能
- 4连板联明股份:股价短期内涨幅明显高于上证指数及行业板块指数,但公司基本面未发生重大变化
- 多种矿物质元素 依能天然苏打水15瓶到手34.91元
- 世界快资讯:天气炎热 亚洲象开启“避暑模式”!网友:真羡慕了
- 超越《塞尔达传说:王国之泪》:《暗黑破坏神4》登顶英国周销量榜-新资讯
- 国产AI天花板!讯飞星火iOS内测版上线:已覆盖PC、手机等主流系统 短讯
- 微资讯!地表67℃!火焰山进入炙烤模式:景区为游客增配防暑药品
- 因为余华的一封信,莫言要去东澳岛读书了
- 科创浪潮奔涌大湾区
- PDF问世30周年 每年6月15日成“PDF日”
手机
iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
- 警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- 男子被关545天申国赔:获赔18万多 驳回精神抚慰金
- 3天内26名本土感染者,辽宁确诊人数已超安徽
- 广西柳州一男子因纠纷杀害三人后自首
- 洱海坠机4名机组人员被批准为烈士 数千干部群众悼念
家电
当 GraphQL 遇上图数据库,便有了更方便查询数据的方式 当前短讯
人之初,性本鸽。
大家好,我叫储惠龙(实名上网),你可以叫我小龙人,00 后一枚。目前从事后端开发工作。
今天给大家带来一个简单的为 NebulaGraph 提供 GraphQL 查询支持的 DEMO,为什么是简单的,因为本来想完成更多工作再给大家介绍的,但是上个月太忙加上下个月更忙,但是我又很想白嫖一下 Nebula 官方的奖品,所以就赶紧端上来了。
(相关资料图)
体验 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"){nameage}}
返回结果是:
{players=[{name=Kobe Bryant, age=40}]}
看看这优雅的查询和返回结果,想必我不多说,大家也都看得懂。这真的是
其实上面说了那么多,就是官方对 GraphQL 的总结:描述你的数据、请求你所要的数据、得到可预测的结果。
上述的查询在 NebulaGraphQL 中已经实现了,同时还支持通过 VertexID 查询数据(好吧,我也就实现了这两种)。
NebulaGraphQL 简单入门
NebulaGraphQL 是一个 Java 库,旨在应用层提供使用 GraphQL 语法查询 NebulaGraph 图数据库中数据的能力。
在项目中使用 NebulaGraphQL 非常简单,因为 NebulaGraphQL 本身只想做一个简单的工具库,未来如果想直接集成到 MVC 框架可能会再起一个 NebulaGraphQL-Spring 之类的项目(画大饼中……)。所以 NebulaGraphQL 的使用和 nebula-java 是几乎完全一致的。
使用示例:
//创建一个configGraphqlSessionPoolConfig 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 信息。这一部分是关键难题。目前,我仅仅做了如下的变换:
- 对于 NebulaGraph 中所有的 Tag,都会构造一个对应的 GraphQL 的可查询对象。
- 每一个 Tag 都会有一个同名的根据 ID 获取信息的查询。举例来说,对于 player 这个 tag,会生成一个查询 player,这个查询的参数是 vertexID,会根据 vertexID 获取到信息。
- 每一个 Tag 都会有一个在名称后加
-s
的查询。举例来说,对于 player 这个 tag,会生成一个查询 players,这个查询的参数是任意的属性。如果 player 上有 age,name,country 这些属性,在查询参数中可以传入这三种属性的任意组合,NebulaGraphQL 查询时会将这些参数进行“与”AND
语义的构造,再获取相关顶点。对于用户没有指定的参数,默认为 null(这是一个已知的问题,如果目的就是查 null 会有问题)。
测试数据集上自动生成的 GraphQL 的 Schema 示例:
type Query { player( "Vertex ID" ID: ID): playerplayers(age: Int = null, name: String = null): [player]!team("Vertex ID"ID: ID): team teams(name: String = null): [team]!}type player {age: Intname: 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 至少也能方便做一些简单的数据查询与测试。
对于 NebulaGraphQL 在实际生产中的价值目前我也没有体验过,因为纯属兴趣写着玩儿,如果大家有想法,欢迎在评论区交流。
关键词:
当 GraphQL 遇上图数据库,便有了更方便查询数据的方式 当前短讯
6月14日北向资金最新动向(附十大成交股)_全球今头条
iQOO Neo8 Pro顶配版明天首销:1TB UFS 4.0规格 3699价位独此一款
《神鬼寓言4》女主角外观遭玩家吐槽:这是在比丑!-全球快资讯
国产新能源深蓝SL03路口起火烧毁 厂商:系发动机护板卷入麦秆自燃引起
【全球快播报】Win11企业版默认启用SMB签名导致Bug:微软发布解决方案
每日看点!用上宁德时代麒麟电池!新款哪吒S曝光:能跑1075km
[SDOI2008] 递归数列
【全球播资讯】ssh免密登录、服务器安全
烷基计数
风口上的AIGC,技术岗动不动年薪百万,甚至重金难求? 天天新消息
MegEngine 使用小技巧:如何做 MegCC 的模型性能评测
焦点速看:认知型通用大模型“360智脑”升级4.0,国内首发“文生视频”多模态功能
4连板联明股份:股价短期内涨幅明显高于上证指数及行业板块指数,但公司基本面未发生重大变化
多种矿物质元素 依能天然苏打水15瓶到手34.91元
世界快资讯:天气炎热 亚洲象开启“避暑模式”!网友:真羡慕了
超越《塞尔达传说:王国之泪》:《暗黑破坏神4》登顶英国周销量榜-新资讯
国产AI天花板!讯飞星火iOS内测版上线:已覆盖PC、手机等主流系统 短讯
微资讯!地表67℃!火焰山进入炙烤模式:景区为游客增配防暑药品
FTL没有映射,跟发工资没有钱有什么区别 要闻
【全球新要闻】奇妙敏捷之旅·青岛站,现场燃爆了!
联盟送福利:云上掘金,开启你收入的第二增长曲线 全球新视野
机器硬件监控,最简单的方案,没有之一
因为余华的一封信,莫言要去东澳岛读书了
恒生指数14日收跌0.58%结束五连涨
科创浪潮奔涌大湾区
PDF问世30周年 每年6月15日成“PDF日”
中国空间站美景请查收!央视解析全新构型:三舱三船
最高额外降温3℃:猫头鹰针对AMD AM5插槽CPU推出散热支架-热门
世界观天下!苹果蝉联2023年凯度BrandZ最具价值全球百强榜首:腾讯跻身十强
中国自研唯一入选项目!《王者荣耀亚运版本》发布:共计63个英雄
毕马威:力争在2030年将毕马威全球的直接和间接碳排放在2019年基础上减半 今日热议
世界时讯:SpringBoot中Redis的基础使用
利用 PHP 特性绕 WAF 测试 环球聚看点
linux-DNS域名解析
世界即时看!2种GaussDB(DWS)查看作业运行信息方式
收评:两市窄幅波动沪指微跌0.14% CPO概念股领涨 大消费主题反弹
热头条丨【新华500】新华500指数(989001)14日涨0.03%
世界今热点:层层梯田上红山荞麦播种忙 全产业链带动农民增收
【当前独家】AMD自杀式降价 讯景RX 7900 XT显卡到手5299元(首发7399)
男生说猫屎臭被头上扣饭?官方回应:已经处理
天天滚动:与K60 Ultra同台发!Redmi 2K新平板曝光:只要千元
外卖小哥从10多米高大桥跳水救人:见义勇为获奖3万、免费上大学
焦点热讯:中国第一条时速350铁路明日调图:动车组重联 运力翻倍
2023内蒙古师范大学附属中学英才计划招生简章
618大促|解析平台、商家和消费者必须面对的三大风险
【技术积累】Python中的NumPy库【二】|天天滚动
全球快资讯丨Springboot定时任务集成shedLock锁
今日热搜:开放中国依然是外商投资高地
每日动态!晋升第一人口大国后 印度将成为全球第一大手机市场:多谢苹果
不是录播!梅西即将在淘宝开启首次直播
华为又背锅?理想粉丝暗指华为发动舆论攻击:李想出面澄清
亚运会倒计时101天!杭州开通“亚运号”定制专列
国内最畅销SUV排名出炉:特斯拉Model Y反超比亚迪宋Plus拿下第一
天天快看点丨大文件上传功能在标签服务的简单应用和代码实现
Aurelia教程_编程入门自学教程_菜鸟教程-免费教程分享
让电池新规为电动自行车加把“安全锁” 全球热点评
全球动态:21℃室温超导成果被美院士宣称复现!南大教授:有3点质疑
全球报道:吉利高管评理想学华为:华为是时代的产物 但时代变了
全球今日报丨Vision Pro商标被华为注册!专家:苹果要么求华为和解 要么中国市场改名
王鸿薇反击林飞帆退选还推责任 毫无担当 每日视点
快看:0-500公里仅需20.16秒!布加迪火流星正式亮相勒芒赛场
锐龙7 7800X3D搭配A620主板实测:游戏性能依旧胜过i9-13900KS
能打过理想L7?丰田新款汉兰达上市:26.88万起-新资讯
焦点热讯:Nothing Phone (2) 定档7月11日:比亚迪代工
世界热讯:无惧A卡狠降价!英伟达RTX 4060国内上市时间曝光:2399元秒抢光?
理想汽车在重庆成立销售新公司,注册资本1000万|世界观天下
【世界速看料】读发布!设计与部署稳定的分布式系统(第2版)笔记02_停飞的代码异常
每日消息!经典webshell流量特征
华洋赛车北交所IPO成功过会:产品进入美国等50余个国家和地区 参与多项标准起草
全球规模最大!京东亚洲一号第100亿件智能包裹下线
短睡眠者可能“天赋异禀”:每天只需睡四五个小时
东莞暴雨 外卖小哥摔倒人车被水冲走:市民合力营救
最新快讯!特斯拉换电池价格曝光:最贵24.6万元一块 能买一辆奥迪
特斯拉Model Y在上海一大学完全拆解 沉浸教学“三电”原理
环球热点评!word文档如何打千分号 千分号在word上怎么打
数位 DP
【全球时快讯】深度学习应用篇-元学习[13]:元学习概念、学习期、工作原理、模型分类等
直播app源码技术之直播间内消息发送与接收的实现-世界今日讯
真实案例:Feign 切换 okhttp 无法生效,被老大骂的有点慌!
美国CPI进入下行趋势 黄金期货继续维持震荡 全球快看点
李想:很多友商那仨瓜俩枣的销量有啥可干的|天天速讯
男子熬夜喝冰镇饮料被送进ICU 医生从血里抽出一袋油脂:超标200倍 全球看点
环球讯息:西安现最牛司机 车尾标语3月撞7次!奔驰大G、奥迪都被撞过
世界新消息丨美国发布临时禁令:微软收购动视暴雪再次受阻
天津两处居民楼爆炸,致3死多伤!嫌疑人被抓获,作案工具是_环球新资讯
Canvas_绘制线段、圆形、文本、图像、视频、处理图像数据
【项目管理解决方案】上海道宁与Synami帮助您统一所有项目级别的信息,并使所有人轻松访问
Zabbix“专家坐诊”第195期问答汇总_当前看点
XenServer 7 GUI 虚拟机(VM)上的屏幕分辨率怎么提高? 环球简讯
入侵无线App盗用户资料 40岁男子被捕|观察
天天时讯:有无眉毛哪个更好看?哪吒CEO:“去掉眉毛”的哪吒GT将上市
携程梁建章建议:生三胎每月给五六千 给到18岁为止 速讯
15英寸MacBook Air首销破发!渠道价比官网便宜1000多|全球速看
新能源重卡 为何终将颠覆燃油重卡?
华为开发者大会2023早鸟票开售 498元起-全球最资讯
速讯:注意!绿心环线多路段将进行抓拍
MySQL性能分析及工具使用_今日热讯
演唱会买到“柱子票”,可以有更好的解决办法 全球要闻
PCIe 6.0还没用上:PCIe 7.0这就来了!x16速度高达512GB/s-世界滚动