Gremlin 如何序列化rest服务的Tinkerpop顶点/边列表?[嵌入式JanusGraph]

Gremlin 如何序列化rest服务的Tinkerpop顶点/边列表?[嵌入式JanusGraph],gremlin,janusgraph,gremlin-server,Gremlin,Janusgraph,Gremlin Server,使用嵌入式JanusGraph,我创建了一个REST服务,它返回顶点和边的列表,但我希望返回json,就像gremlin服务器一样 我尝试使用MessageSerializer,但无法将二进制格式强制转换为json @RequestMapping("/search") public String search(@RequestBody SearchOptions options) throws JsonProcessingException, SerializationException {

使用嵌入式JanusGraph,我创建了一个REST服务,它返回顶点和边的列表,但我希望返回json,就像gremlin服务器一样

我尝试使用MessageSerializer,但无法将二进制格式强制转换为json

@RequestMapping("/search")
public String search(@RequestBody SearchOptions options) throws JsonProcessingException, SerializationException {
    List<Object> data = new ArrayList<>();
    Builder responseBuilder = getResponseBuilder(data);

    List<Vertex> nodes;
    List<Object> edges;

    if (Strings.isNullOrEmpty(options.getText()) || Strings.isNullOrEmpty(options.getField())) {
        nodes = g.V().limit(options.getLimit()).toList();
        edges = g.V().limit(options.getLimit()).aggregate("node").outE().as("edge").inV().where(P.within("node"))
                .select("edge").toList();
    } else {
        nodes = g.V().has(options.getField(), options.getText()).toList();
        edges = g.V().has(options.getField(), options.getText()).aggregate("node").outE().as("edge").inV()
                .where(P.within("node")).select("edge").toList();
    }
    data.add(nodes);
    data.add(edges);

    ResponseMessage response = responseBuilder.create();
    ByteBufAllocator allocator = new PooledByteBufAllocator();
    ByteBuf byteBuffer = ser.serializeResponseAsBinary(response, allocator);
    byte[] bytes = byteBuffer.array();
    String str = new String(bytes);
    return str;
}   

@Bean
public MessageSerializer messageSerializer() {
    GryoMapper.Builder kryo = GryoMapper.build().addRegistry(JanusGraphIoRegistry.getInstance());
    MessageSerializer serializer = new GryoMessageSerializerV1d0(kryo);
    return serializer;
}
我这样定义ObjectMapper-

ObjectMapper mapper = GraphSONMapper.build().version(GraphSONVersion.V2_0).create().createMapper();
仅供参考-这是创建ObjectMapper的正确方法


我认为您应该使用所需的任何配置从GraphSONMapper实例创建Jackson ObjectMapper,然后将结果传递到:

gremlin> mapper = GraphSONMapper.build().version(GraphSONVersion.V2_0).create().createMapper()
==>org.apache.tinkerpop.shaded.jackson.databind.ObjectMapper@4ca8dbfa
gremlin> mapper.class
==>class org.apache.tinkerpop.shaded.jackson.databind.ObjectMapper
gremlin> vertices = g.V().toList()
==>v[1]
==>v[2]
==>v[3]
==>v[4]
==>v[5]
==>v[6]
gremlin> mapper.writeValueAsString(vertices)
==>[{"@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"}}]}}},{"@type":"g:Vertex","@value":{"id":{"@type":"g:Int32","@value":2},"label":"person","properties":{"name":[{"@type":"g:VertexProperty","@value":{"id":{"@type":"g:Int64","@value":2},"value":"vadas","label":"name"}}],"age":[{"@type":"g:VertexProperty","@value":{"id":{"@type":"g:Int64","@value":3},"value":{"@type":"g:Int32","@value":27},"label":"age"}}]}}},{"@type":"g:Vertex","@value":{"id":{"@type":"g:Int32","@value":3},"label":"software","properties":{"name":[{"@type":"g:VertexProperty","@value":{"id":{"@type":"g:Int64","@value":4},"value":"lop","label":"name"}}],"lang":[{"@type":"g:VertexProperty","@value":{"id":{"@type":"g:Int64","@value":5},"value":"java","label":"lang"}}]}}},{"@type":"g:Vertex","@value":{"id":{"@type":"g:Int32","@value":4},"label":"person","properties":{"name":[{"@type":"g:VertexProperty","@value":{"id":{"@type":"g:Int64","@value":6},"value":"josh","label":"name"}}],"age":[{"@type":"g:VertexProperty","@value":{"id":{"@type":"g:Int64","@value":7},"value":{"@type":"g:Int32","@value":32},"label":"age"}}]}}},{"@type":"g:Vertex","@value":{"id":{"@type":"g:Int32","@value":5},"label":"software","properties":{"name":[{"@type":"g:VertexProperty","@value":{"id":{"@type":"g:Int64","@value":8},"value":"ripple","label":"name"}}],"lang":[{"@type":"g:VertexProperty","@value":{"id":{"@type":"g:Int64","@value":9},"value":"java","label":"lang"}}]}}},{"@type":"g:Vertex","@value":{"id":{"@type":"g:Int32","@value":6},"label":"person","properties":{"name":[{"@type":"g:VertexProperty","@value":{"id":{"@type":"g:Int64","@value":10},"value":"peter","label":"name"}}],"age":[{"@type":"g:VertexProperty","@value":{"id":{"@type":"g:Int64","@value":11},"value":{"@type":"g:Int32","@value":35},"label":"age"}}]}}}]

不幸的是,我用这个方法得到了一个错误。也许我需要注册一些东西?嗯,它可能不知道如何处理JanusGraph RelationIdentifier?我会尝试验证-打开ResponseMessage并将RelationIdentifier传递给ObjectMapper,然后查看是否会出现相同的错误,尽管我认为它看起来不那么复杂。我只需要为JanusGraph添加IO注册表。
private ObjectMapper mapper = GraphSONMapper.build()
        .addRegistry(JanusGraphIoRegistry.getInstance())
        .version(GraphSONVersion.V2_0).create().createMapper();
gremlin> mapper = GraphSONMapper.build().version(GraphSONVersion.V2_0).create().createMapper()
==>org.apache.tinkerpop.shaded.jackson.databind.ObjectMapper@4ca8dbfa
gremlin> mapper.class
==>class org.apache.tinkerpop.shaded.jackson.databind.ObjectMapper
gremlin> vertices = g.V().toList()
==>v[1]
==>v[2]
==>v[3]
==>v[4]
==>v[5]
==>v[6]
gremlin> mapper.writeValueAsString(vertices)
==>[{"@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"}}]}}},{"@type":"g:Vertex","@value":{"id":{"@type":"g:Int32","@value":2},"label":"person","properties":{"name":[{"@type":"g:VertexProperty","@value":{"id":{"@type":"g:Int64","@value":2},"value":"vadas","label":"name"}}],"age":[{"@type":"g:VertexProperty","@value":{"id":{"@type":"g:Int64","@value":3},"value":{"@type":"g:Int32","@value":27},"label":"age"}}]}}},{"@type":"g:Vertex","@value":{"id":{"@type":"g:Int32","@value":3},"label":"software","properties":{"name":[{"@type":"g:VertexProperty","@value":{"id":{"@type":"g:Int64","@value":4},"value":"lop","label":"name"}}],"lang":[{"@type":"g:VertexProperty","@value":{"id":{"@type":"g:Int64","@value":5},"value":"java","label":"lang"}}]}}},{"@type":"g:Vertex","@value":{"id":{"@type":"g:Int32","@value":4},"label":"person","properties":{"name":[{"@type":"g:VertexProperty","@value":{"id":{"@type":"g:Int64","@value":6},"value":"josh","label":"name"}}],"age":[{"@type":"g:VertexProperty","@value":{"id":{"@type":"g:Int64","@value":7},"value":{"@type":"g:Int32","@value":32},"label":"age"}}]}}},{"@type":"g:Vertex","@value":{"id":{"@type":"g:Int32","@value":5},"label":"software","properties":{"name":[{"@type":"g:VertexProperty","@value":{"id":{"@type":"g:Int64","@value":8},"value":"ripple","label":"name"}}],"lang":[{"@type":"g:VertexProperty","@value":{"id":{"@type":"g:Int64","@value":9},"value":"java","label":"lang"}}]}}},{"@type":"g:Vertex","@value":{"id":{"@type":"g:Int32","@value":6},"label":"person","properties":{"name":[{"@type":"g:VertexProperty","@value":{"id":{"@type":"g:Int64","@value":10},"value":"peter","label":"name"}}],"age":[{"@type":"g:VertexProperty","@value":{"id":{"@type":"g:Int64","@value":11},"value":{"@type":"g:Int32","@value":35},"label":"age"}}]}}}]