Gremlin:使用 gremlin-driver 在 Java 中获得 json 响应
Gremlin: getting json response in Java with gremlin-driver
我有以下查询:
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表示。
我想使用 Java 和 gremlin-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
.
收到了我想要的答案
感谢您提供的任何帮助!谢谢
如评论所述
- 当使用 Java 时,您得到的将是一个实际的 TinkerGraph
- 推荐使用 GraphBinary 或 GraphSONV3D0 序列化器。
Gyro 版本较旧,如果您没有指定其他序列化程序之一,可能会导致您看到的错误。
请注意,即使您使用其他序列化程序之一,要将图形反序列化为 JSON,您将需要使用特定的 TinkerGraph 序列化程序(请参阅此答案的末尾示例)。否则你只会得到 {}
返回。
但是,对于 Java Gremlin 客户端,您可能根本不需要生成 JSON ....
假设您有一个实际的 TinkerGraph 返回,您可以 运行 对内存中的子图进行真正的 Gremlin 查询 - 只需为其创建一个新的遍历源。如果您愿意,您还可以使用 graph.io
类 将图形写入文件。 TinkerGraph 将包括属性以及边和顶点。
您也可以使用
等语句直接访问 TinkerGraph 对象
a.vertices
和 a.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)
我有以下查询:
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表示。
我想使用 Java 和 gremlin-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
.
感谢您提供的任何帮助!谢谢
如评论所述
- 当使用 Java 时,您得到的将是一个实际的 TinkerGraph
- 推荐使用 GraphBinary 或 GraphSONV3D0 序列化器。
Gyro 版本较旧,如果您没有指定其他序列化程序之一,可能会导致您看到的错误。
请注意,即使您使用其他序列化程序之一,要将图形反序列化为 JSON,您将需要使用特定的 TinkerGraph 序列化程序(请参阅此答案的末尾示例)。否则你只会得到 {}
返回。
但是,对于 Java Gremlin 客户端,您可能根本不需要生成 JSON ....
假设您有一个实际的 TinkerGraph 返回,您可以 运行 对内存中的子图进行真正的 Gremlin 查询 - 只需为其创建一个新的遍历源。如果您愿意,您还可以使用 graph.io
类 将图形写入文件。 TinkerGraph 将包括属性以及边和顶点。
您也可以使用
等语句直接访问 TinkerGraph 对象a.vertices
和 a.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)