NebulaResultSetBoot

Nebula查询结果的封装对象ResultSet比较复杂,原因是需要保存数据类型。而JSON的一大缺点就是无法保存数据类型,当然这是它简洁的代价。 在实际生产过程中一些应用场景对数据类型并没有太多要求,典型的例子是可视化。很多小伙伴都有将valuewrapper转为自定义json对象的需求,或者是将官方的图模型映射到自己的领域模型的需求。我这里提供一个我写的框架抛砖引玉。 代码地址:https://github.com/Dragonchu/NebulaResultSetBoot https://github.com/Dragonchu/NebulaResultSetBoot 核心代码很简单,就这不断的判断value wrapper的数据类型,然后递归进行解析。 这里讲一下我个人对于nebula ResulSet模型的理解吧,Nebula的点是由id加tag列表组成,而每个tag对象里是tagName和一个属性Map,有很多人建模的时候只用单tag其实是没发挥这种模型的潜力的。 public class Vertex { private final String id; private final List<Tag> tags; } public class Tag { private final String name; private final Map<String, Object> properties; } 边的模型比较简单,起点,终点,属性,rank,edgeType。 public class Edge { private final String src; private final String dst; private final String name; private final Long ranking; private final Map<String, Object> properties; } 路径的模型有一个段(segment)的概念,每个segment是一个三元组,<起点,终点,边>,对于独立的点,起点和终点是相同的。而路径是一个段列表。 public class Segment { private final Vertex src; private final Vertex dst; private final Edge edge; } public class Path { private final List<Segment> segments; } 这样再去看ResultSet会比较明朗一些。

May 12, 2023 · 1 min

使用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