【问题标题】:Gremlin: getting json response in Java with gremlin-driverGremlin:使用 gremlin-driver 在 Java 中获取 json 响应
【发布时间】:2021-01-04 22:21:36
【问题描述】:

我有以下疑问:

  g
    .V("user-11")
    .repeat(bothE().subgraph("subGraph").outV())
    .times(2)
    .cap("subGraph")
    .next()

当我使用gremlin-python 运行它时,我收到以下响应:

{'@type': 'tinker:graph',
 '@value': {'vertices': [v[device-3], v[device-1], v[user-11], v[card-1]],
  'edges': [e[68bad734-db2b-bffc-3e17-a0813d2670cc][user-11-uses_device->device-1],
   e[14bad735-2b70-860f-705f-4c0b769a7849][user-11-uses_device->device-3],
   e[f0bb3b6d-d161-ec60-5e6d-068272297f24][user-11-uses_card->card-1]]}}

这是查询获得的子图的Graphson表示。

我想使用 Javagremlin-driver 获得相同的响应,但我不知道如何做。

我最好的尝试是:

ObjectMapper mapper = GraphSONMapper.build().version(GraphSONVersion.V3_0).create().createMapper();
Object a = graphTraversalSource
                .V(nodeId)
                .repeat(bothE().subgraph("subGraph").outV())
                .times(2)
                .cap("subGraph")
                .next();
return mapper.writeValueAsString(a);

但这给了我以下错误:

io.netty.handler.codec.DecoderException: org.apache.tinkerpop.gremlin.driver.ser.SerializationException: org.apache.tinkerpop.shaded.kryo.KryoException: Encountered unregistered class ID: 65536

我正在使用 AWS Neptune,但我怀疑这会有所不同,因为我通过 gremlin-python 收到了我想要的答案。

感谢您提供的任何帮助!谢谢

【问题讨论】:

  • 由于 Python 没有本地 TinkerGraph 实现,它返回一个包含子图表示的 dict。由于 Java 确实具有本机 TinkerGraph 实现,因此您的查询返回的对象将是一个实际的 TinkerGraph 对象。
  • 您没有关注the Neptune recommendation 使用更高效的GraphBinary 序列化是否有特定原因?

标签: java gremlin amazon-neptune gremlinpython


【解决方案1】:

如 cmets 中所述

  1. 使用 Java 时,您得到的将是实际的 TinkerGraph
  2. 建议使用 GraphBinary 或 GraphSONV3D0 序列化程序。

陀螺仪较旧,如果您没有指定其他序列化程序之一,可能会导致您看到的错误。

请注意,即使您使用其他序列化程序之一,要将图形反序列化为 JSON,您也需要使用特定的 TinkerGraph 序列化程序(请参阅此答案末尾的示例)。否则你只会得到{} 的返回。

但是,对于 Java Gremlin 客户端,您可能根本不需要生成 JSON ....

假设您有一个实际的 TinkerGraph,您可以针对内存中的子图运行真正的 Gremlin 查询 - 只需为其创建一个新的遍历源。如果您愿意,您还可以使用graph.io 类将图形写入文件。 TinkerGraph 将包括属性以及边和顶点。

您也可以使用诸如

之类的语句直接访问 TinkerGraph 对象

a.verticesa.edges

通过一个具体的例子,如果你有一个表单的查询

TinkerGraph tg = (TinkerGraph)g.V().bothE().subgraph("sg").cap("sg").next();

那你就可以了

GraphTraversalSource g2 = tg.traversal();

Long cv = g2.V().count().next();
Long ce = g2.E().count().next();

或者您可以直接使用以下形式的语句访问 TinkerGraph 数据结构:

Vertex v = tg.vertices[<some-id>]

或者

List properties = tg.vertices[<some-id>].properties()

这实际上意味着在使用子图时,您可以在 Java 客户端中使用更多功能。

如果您仍然觉得需要 JSON 版本的子图,IO 参考是一个方便的书签:https://tinkerpop.apache.org/docs/3.4.9/dev/io/#_io_reference

已编辑:-为了节省您大量阅读文档的时间,此代码会将 TinkerGraph 打印为 JSON

mapper = GraphSONMapper.build().
            addRegistry(TinkerIoRegistryV3d0.instance()).
            version(GraphSONVersion.V3_0).create().createMapper();

mapper.writeValueAsString(tg) 

【讨论】:

  • 这解决了我的问题!出色而清晰的回应,谢谢!
猜你喜欢
  • 2016-08-11
  • 1970-01-01
  • 2017-09-20
  • 1970-01-01
  • 1970-01-01
  • 2021-11-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多