
NebulaGraph 的 Java 数据解析实践与指导
本文目录
- 愉快、干净的 Java 交互环境
- 通过调用 execute 方法获得不太容易懂的 ResultSet 对象
- 直接返回 JSON 的 executeJson 方法
- 结论
如何快速、即时、符合直觉地去处理 Nebula Java Client 中的数据解析?读这一篇就够了。
图数据库 NebulaGrpah 的论坛和微信群里,有不少用户问及了 Java 客户端数据解析的问题。在本文教你一种简单的方式同返回结果交互,快速、即时地拿到解析数据。
愉快、干净的 Java 交互环境
本文最为关键步骤之一,便是用几行代码,准备一个干净的交互式 NebulaGraph Java REPL 环境。
多亏了 Java-REPL,我们可以很方便地(像 iPython 那样)去实时交互地调试、分析 NebulaGraph Java 客户端。
下面,开始实操。
先用 Docker 镜像准备环境:
在执行完上面的 java -jar ../javarepl/javarepl.jar 之后,我们就进入了交互式的 Java Shell(REPL)。我们不用再做编译、执行、print 这样的慢反馈来调试和研究我们的代码了,是不是很方便?
首先我们在 java> 提示符下,这些来把必须的类路径和导入:
我们可以从这 Java 环境连接到 NebulaGraph。在下面的例子中,我用了自己的 graphd 的 IP 和端口作为例子:
通过调用 execute 方法获得不太容易懂的 ResultSet 对象
刚接触 NebulaGraph Java 客户端的大家一定对这个 ResultSet 对象有些愁。别担心,借助我们的环境,十分钟把它搞通。这里我们执行一个简单的返回 vertex 顶点的结果看看:
我们可以参考 ResultSet 的代码:https://github.dev/vesoft-inc/nebula-java/blob/master/client/src/main/java/com/vesoft/nebula/client/graph/data/ResultSet.java
其实可以先不看,跟着教程往下走。一般来说,查询结果都是二维表,ResultSet 针对行和列提供了常见的处理方法。通常,我们会获取每一行结果,再解析它,而关键的问题是每一个值要怎么处理。
回到本次 query 语句,它其实是在返回一个 vertex 顶点:
通过上边的几个方法,我们其实能够获得这个顶点的值:
然而,这个 com.vesoft.nebula.Value 的值的类提供的方法特别原始,这也是让大家犯愁数据解析的原因。所以,在这个教程中最重要的一个带走的经验(除了利用 REPL 之外)就是:非必要不要去取这个原始的类,我们应该去取得 ValueWrapper 封装之后的值!!!
注意:其实我们有更轻松地方法,就是用 executeJson 直接获得 JSON string。别担心,会在后面提到,不过这个方法要 2.6 之后才支持。
那么问题来了,如何使用 ValueWrapper 封装呢?其实答案已经在上面了,大家可以回去看看,resp.rowValues(0) ValueWrapper 的可迭代对象!
所以,正确打开方式是迭它!迭它!迭它!其实这个就是代码库里的 GraphClientExample 的一部分例子了,我们把它迭代取出来,放到 wrappedValueList 里慢慢把玩:
上边这些很丑的 if 就是关键了,我们知道 query 的返回值可能是多种类型的,他们分为:
- 图语义的:点、边、路径
- 数据类型:String,日期,列表,集合…等等
这里的关键是,我们要使用 ValueWrapper 为我们准备好 asXxx 方法。如果这个值是一个顶点,么这个 Xxx 就是 Node,同理如果是边的话,这个 Xxx 就是 Relationship。
所以,我给大家看看咱们这个返回点结果的情况下的 asNode() 方法:
顺便说一下,借助于 Java 的反射 reflection,我们可以在这个交互程序里做类似于 Python 里 dir() 的事情:实时地去获取一个类支持的方法。像这样,省去了查代码的时间。
这样:
看到这里,大家应该体会到封装了 ValueWrapper 的好处了吧?它提供了方便的符合直觉的方法,对于 Node 类型来说,它提供了 tagNames()、properties()、labels() 等等非常好用的方法:
我们这里只展示了顶点数据类型的处理、解析方式(RETURN n),像其他的数据类型比如边(edge)、路径(path)或者地理数据、时间数据,用这种方式(看有什么方法,再交互地去试试方法怎么用)也是一样的,对吧?
直接返回 JSON 的 executeJson 方法
最后,好消息是:从 v2.6 开始,NebulaGraph 可以直接返回 JSON 的 String 了,我们上面的纠结也都不是必要的了:
我相信大家肯定比我更擅长处理 JSON 的结果了哈~~
结论
- 如果你有条件(v2.6 及其以上版本)用 JSON,情况会很容易,甚至你都不太需要本文的方法,不过本文可能会让你的交互环境更容易;
- 如果你不得不和 ResultSet 打交道,记得用 ValueWrapper。因为我们可以用asNode(),asRelationship() 和asPath(),封装之后的值比原始的值可爱太多了!
- 通过 REPL 工具,结合 Java 的 reflection 加上源代码本身,分析数据的处理将变得异常顺滑。
文章转载自公众号: NebulaGraph
