首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将DefaultGraphTraversal (从gremlin查询)序列化为GraphSON v3 json输出

将DefaultGraphTraversal (从gremlin查询)序列化为GraphSON v3 json输出
EN

Stack Overflow用户
提问于 2019-08-22 15:34:37
回答 1查看 823关注 0票数 1

我正在使用GremlinGroovyScriptEngine来验证gremlin查询( REST中的POSTed)。返回DefaultGraphTraversal对象的结果。我正在尝试将它序列化为类似于

代码语言:javascript
复制
"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

代码语言:javascript
复制
mapper = graph.io(GraphSONIo.build(GraphSONVersion.V3_0)).mapper.version(GraphSONVersion.V3_0).create.createMapper

而这个..。

代码语言:javascript
复制
GraphSONMapper.build().
  addRegistry(com.lambdazen.bitsy.BitsyIoRegistryV3d0.instance()).
  version(GraphSONVersion.V3_0).create().createMapper()

以及上面的其他变体。但是,它被反序列化为

代码语言:javascript
复制
{"@type":"g:List","@value":[]}

但是列表中的单个项没有正确地序列化。

编辑

代码示例: gremlinQuery例如。g.V('id_12345')

代码语言:javascript
复制
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);

这会导致

代码语言:javascript
复制
{"@type":"g:List","@value":[]}

我已经通过迭代结果和序列化来解决这个问题:

代码语言:javascript
复制
List<Object> resList = new ArrayList<>();
results.stream().forEach(list -> resList.add(list));
String data = mapper.writeValueAsString(resList);

这确实产生了正确的结果,但似乎我错过了一些至关重要的东西,才能在一步之内完成。

我在这里做错什么了?非常感谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-09-03 11:00:36

我无法重新创建这个问题(沿着3.4.x代码行):

代码语言:javascript
复制
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"}}]}}}]}

只有在“结果”本身是空列表的情况下,才会期望空结果,但您似乎表明情况并非如此,因为结果的迭代和其内容的序列化似乎工作得很好。我建议几个尝试调试的选项:

  1. 尝试使用Map将数据作为valueMap(true)返回,并查看那里发生了什么。如果它有效,那么"BitsyIoRegistry“可能有什么问题吗?
  2. 我会尝试在不包括“valueMap(true)”的情况下使用和不使用BitsyIoRegistry。
  3. 用TinkerGraph来尝试所有这些。

如果您可以用TinkerGraph重新创建这个问题,那么它很可能是TinkerPop的一个问题,需要在那里解决。如果它适用于TinkerGraph,那么我想这肯定是Bitsy的一个问题。奇怪的问题..。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57612832

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档