将 DefaultGraphTraversal(来自 gremlin 查询)序列化为 GraphSON v3 json 输出
Serialize DefaultGraphTraversal (from gremlin query) to GraphSON v3 json output
我正在使用 GremlinGroovyScriptEngine 评估 gremlin 查询(从 REST api 发布)。结果 returns 一个 DefaultGraphTraversal 对象。我正在尝试将其序列化为类似于
的结构
"result": {
"data": {
"@type": "g:List",
"@value": [
{
"@type": "g:Vertex",
"@value": {
"id": "Identity~1234567",
"label": "Identity",
"properties": {
"object_identifier": [
{
"@type": "g:VertexProperty",
"@value": {
"id": {
"@type": "g:Int32",
"@value": -710449208
},
"value": "1234567",
"label": "object_identifier"
}
}
]
}
}
},
.... more results here
我试过像这样使用 ObjectMapper
mapper = graph.io(GraphSONIo.build(GraphSONVersion.V3_0)).mapper.version(GraphSONVersion.V3_0).create.createMapper
还有这个……
GraphSONMapper.build().
addRegistry(com.lambdazen.bitsy.BitsyIoRegistryV3d0.instance()).
version(GraphSONVersion.V3_0).create().createMapper()
以及上述的其他变体。
然而,它被反序列化为
{"@type":"g:List","@value":[]}
但列表中的个别项目没有正确序列化。
编辑
代码示例:
gremlinQuery 例如。 g.V('id_12345')
List<Object> results = ((DefaultGraphTraversal<Vertex, Object>) this.engineWrite.eval(gremlinQuery, this.bindingsWrite)).toList();
ObjectMapper mapper = writeGraph.io(GraphSONIo.build(GraphSONVersion.V3_0))
.mapper()
.version(GraphSONVersion.V3_0)
.create()
.createMapper();
mapper.writeValueAsString(results);
这导致
{"@type":"g:List","@value":[]}
我通过迭代结果并序列化来解决这个问题:
List<Object> resList = new ArrayList<>();
results.stream().forEach(list -> resList.add(list));
String data = mapper.writeValueAsString(resList);
确实产生了正确的结果,但似乎我缺少一些重要的东西才能一步完成。
我这里做错了什么??
非常感谢
我无法重现问题(沿着代码的 3.4.x 行):
gremlin> bindings = new javax.script.SimpleBindings()
gremlin> bindings.put('g', TinkerFactory.createModern().traversal())
gremlin> engine = new org.apache.tinkerpop.gremlin.groovy.jsr223.GremlinGroovyScriptEngine()
==>org.apache.tinkerpop.gremlin.groovy.jsr223.GremlinGroovyScriptEngine@7b676112
gremlin> results = engine.eval("g.V(1)", bindings).toList()
==>v[1]
gremlin> mapper = GraphSONMapper.build().version(GraphSONVersion.V3_0).create().createMapper()
==>org.apache.tinkerpop.shaded.jackson.databind.ObjectMapper@7f5b9db
gremlin> mapper.writeValueAsString(results)
==>{"@type":"g:List","@value":[{"@type":"g:Vertex","@value":{"id":{"@type":"g:Int32","@value":1},"label":"person","properties":{"name":[{"@type":"g:VertexProperty","@value":{"id":{"@type":"g:Int64","@value":0},"value":"marko","label":"name"}}],"age":[{"@type":"g:VertexProperty","@value":{"id":{"@type":"g:Int64","@value":1},"value":{"@type":"g:Int32","@value":29},"label":"age"}}]}}}]}
仅当 "result" 本身是一个空列表时才会出现空结果,但您似乎表明情况并非如此,因为结果的迭代和其内容的序列化似乎有效正好。我会建议一些尝试调试的选项:
- 尝试使用
valueMap(true)
将数据 return 作为 Map
,看看会发生什么。如果有效,那么 "BitsyIoRegistry"? 可能有问题
- 我会尝试使用和不使用
valueMap(true)
,但不包括 "BitsyIoRegistry"。
- 使用 TinkerGraph 尝试所有这些。
如果您可以用 TinkerGraph 重现问题,那么这很可能是 TinkerPop 的问题,需要在那里解决。如果它适用于 TinkerGraph,那么我认为它一定是 Bitsy 的问题。奇怪的问题....
我正在使用 GremlinGroovyScriptEngine 评估 gremlin 查询(从 REST api 发布)。结果 returns 一个 DefaultGraphTraversal 对象。我正在尝试将其序列化为类似于
的结构"result": {
"data": {
"@type": "g:List",
"@value": [
{
"@type": "g:Vertex",
"@value": {
"id": "Identity~1234567",
"label": "Identity",
"properties": {
"object_identifier": [
{
"@type": "g:VertexProperty",
"@value": {
"id": {
"@type": "g:Int32",
"@value": -710449208
},
"value": "1234567",
"label": "object_identifier"
}
}
]
}
}
},
.... more results here
我试过像这样使用 ObjectMapper
mapper = graph.io(GraphSONIo.build(GraphSONVersion.V3_0)).mapper.version(GraphSONVersion.V3_0).create.createMapper
还有这个……
GraphSONMapper.build().
addRegistry(com.lambdazen.bitsy.BitsyIoRegistryV3d0.instance()).
version(GraphSONVersion.V3_0).create().createMapper()
以及上述的其他变体。 然而,它被反序列化为
{"@type":"g:List","@value":[]}
但列表中的个别项目没有正确序列化。
编辑
代码示例: gremlinQuery 例如。 g.V('id_12345')
List<Object> results = ((DefaultGraphTraversal<Vertex, Object>) this.engineWrite.eval(gremlinQuery, this.bindingsWrite)).toList();
ObjectMapper mapper = writeGraph.io(GraphSONIo.build(GraphSONVersion.V3_0))
.mapper()
.version(GraphSONVersion.V3_0)
.create()
.createMapper();
mapper.writeValueAsString(results);
这导致
{"@type":"g:List","@value":[]}
我通过迭代结果并序列化来解决这个问题:
List<Object> resList = new ArrayList<>();
results.stream().forEach(list -> resList.add(list));
String data = mapper.writeValueAsString(resList);
确实产生了正确的结果,但似乎我缺少一些重要的东西才能一步完成。
我这里做错了什么?? 非常感谢
我无法重现问题(沿着代码的 3.4.x 行):
gremlin> bindings = new javax.script.SimpleBindings()
gremlin> bindings.put('g', TinkerFactory.createModern().traversal())
gremlin> engine = new org.apache.tinkerpop.gremlin.groovy.jsr223.GremlinGroovyScriptEngine()
==>org.apache.tinkerpop.gremlin.groovy.jsr223.GremlinGroovyScriptEngine@7b676112
gremlin> results = engine.eval("g.V(1)", bindings).toList()
==>v[1]
gremlin> mapper = GraphSONMapper.build().version(GraphSONVersion.V3_0).create().createMapper()
==>org.apache.tinkerpop.shaded.jackson.databind.ObjectMapper@7f5b9db
gremlin> mapper.writeValueAsString(results)
==>{"@type":"g:List","@value":[{"@type":"g:Vertex","@value":{"id":{"@type":"g:Int32","@value":1},"label":"person","properties":{"name":[{"@type":"g:VertexProperty","@value":{"id":{"@type":"g:Int64","@value":0},"value":"marko","label":"name"}}],"age":[{"@type":"g:VertexProperty","@value":{"id":{"@type":"g:Int64","@value":1},"value":{"@type":"g:Int32","@value":29},"label":"age"}}]}}}]}
仅当 "result" 本身是一个空列表时才会出现空结果,但您似乎表明情况并非如此,因为结果的迭代和其内容的序列化似乎有效正好。我会建议一些尝试调试的选项:
- 尝试使用
valueMap(true)
将数据 return 作为Map
,看看会发生什么。如果有效,那么 "BitsyIoRegistry"? 可能有问题
- 我会尝试使用和不使用
valueMap(true)
,但不包括 "BitsyIoRegistry"。 - 使用 TinkerGraph 尝试所有这些。
如果您可以用 TinkerGraph 重现问题,那么这很可能是 TinkerPop 的问题,需要在那里解决。如果它适用于 TinkerGraph,那么我认为它一定是 Bitsy 的问题。奇怪的问题....