使用GraphQL语法查询NebulaGraph中的数据

人之初,性本鸽。 大家好,我叫储惠龙(实名上网),你可以叫我小龙人,00后一枚。目前从事后端开发工作。 今天给大家带来一个简单的为NebulaGraph提供GraphQL查询支持的DEMO,为什么是简单的,因为本来想完成更多工作再给大家介绍的,但是上个月太忙加上下个月更忙,但是我又很想白嫖一下Nebula官方的奖品,所以就赶紧端上来了。 先上项目地址:https://github.com/Dragonchu/NebulaGraphQL 先简单介绍一下GraphQL,https://graphql.cn/ 详细的信息官方介绍的都很清晰。说一下我的理解,GraphQL并不是对标Cypher这种查询语言,而是对标REST的一种API设计风格。所以严格意义上,不是说使用GraphQL查询图数据库,而是使用一种GraphQL风格的API查询图数据库,或者说是将Cypher封装了一样,这个本质工作和大家做应用开发时,基于Nebula写一些通过的REST接口是一样的。 举个例子(本文的测试数据集使用的官方的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}] } 看看这优雅的查询和返回结果,想必我不多说,大家也都看得懂。这真的是 这其实就是官方对GraphQL的总结: 描述你的数据、请求你所要的数据、得到可预测的结果。 上述的查询在NebulaGraphQL中已经实现了,同时还支持通过VertexID查询数据(好吧,我也就实现了这两种)。 在项目中使用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....

May 3, 2023 · 1 min