首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么不能使用none()步骤反序列化gremlin.process.traversal.Bytecode?

为什么不能使用none()步骤反序列化gremlin.process.traversal.Bytecode?
EN

Stack Overflow用户
提问于 2021-06-29 18:39:22
回答 1查看 78关注 0票数 0

我尝试使用none()步骤对遍历查询进行反序列化,但似乎不支持这种反序列化

小炉匠版本是3.5.0

下面是一个失败的代码

代码语言:javascript
复制
 import org.apache.tinkerpop.gremlin.jsr223.JavaTranslator;
 import org.apache.tinkerpop.gremlin.process.traversal.Bytecode;
 import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
 import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.DefaultGraphTraversal;
 import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversalSource;
 import org.apache.tinkerpop.gremlin.structure.Graph;
 import org.apache.tinkerpop.gremlin.structure.io.GraphReader;
 import org.apache.tinkerpop.gremlin.structure.io.GraphWriter;
 import org.apache.tinkerpop.gremlin.structure.io.Mapper;
 import org.apache.tinkerpop.gremlin.structure.io.graphson.*;
 import org.apache.tinkerpop.gremlin.tinkergraph.structure.TinkerGraph;
 import org.apache.tinkerpop.shaded.jackson.databind.ObjectMapper;
 
 import java.io.ByteArrayInputStream;
 import java.io.ByteArrayOutputStream;
 import java.io.IOException;
 
 public class GraphExperimental {
     private static final Mapper<ObjectMapper> GRAPHSON_MAPPER_3_0 = GraphSONMapper.build()
             .version(GraphSONVersion.V3_0)
             .typeInfo(TypeInfo.PARTIAL_TYPES)
             .addCustomModule(GraphSONXModuleV3d0.build().create(false))
             .create();
     private static final GraphWriter GRAPHSON_WRITER_3_0 = GraphSONWriter.build()
             .mapper(GRAPHSON_MAPPER_3_0)
             .create();
     private static final GraphReader GRAPHSON_READER_3_0 = GraphSONReader.build()
             .mapper(GRAPHSON_MAPPER_3_0)
             .create();
 
     private GraphExperimental() {
     }
 
     public static void main(String[] args) {
         Graph graph = TinkerGraph.open();
 
         DefaultGraphTraversal<Object, Object> defaultGraphTraversal = new DefaultGraphTraversal<>(graph.traversal());
         // defaultGraphTraversal.addV("A").property("mac", "1");
         defaultGraphTraversal.iterate();
 
         Bytecode bytecode = defaultGraphTraversal.getBytecode();
         String serialize = writeValueAsString(bytecode);
 
         Graph anotherGraph = TinkerGraph.open();
         GraphTraversalSource anotherTraversal = anotherGraph.traversal();
 
         Bytecode bytecodeDeserialized = readValue(serialize, Bytecode.class);
         Traversal.Admin<?, ?> translate = JavaTranslator.of(anotherTraversal).translate(bytecodeDeserialized);
     }
 
     public static <T> T readValue(String value, Class<? extends T> clazz) {
         try (ByteArrayInputStream in = new ByteArrayInputStream(value.getBytes("UTF-8"))) {
             return GRAPHSON_READER_3_0.readObject(in, clazz);
         } catch (IOException e) {
             throw new RuntimeException(e);
         }
     }
 
     public static String writeValueAsString(Object value) {
         try (ByteArrayOutputStream out = new ByteArrayOutputStream()) {
             GRAPHSON_WRITER_3_0.writeObject(out, value);
             return out.toString("UTF-8");
         } catch (IOException e) {
             throw new RuntimeException(e);
         }
     }
 }

结果,我捕捉到了这样一个异常:

代码语言:javascript
复制
    Exception in thread "main" java.lang.IllegalStateException: Could not locate method: GraphTraversalSource.none()
    at org.apache.tinkerpop.gremlin.jsr223.JavaTranslator.invokeMethod(JavaTranslator.java:207)
    at org.apache.tinkerpop.gremlin.jsr223.JavaTranslator.translate(JavaTranslator.java:89)
    at example.GraphExperimental.main(GraphExperimental.java:63)

如果您只是从defaultGraphTraversal.addV("A").property("mac", "1");中删除注释

代码将正常工作

那么为什么不支持这样的反序列化呢?

非常感谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-06-29 19:09:04

我建议您不要尝试直接构建DefaultGraphTraversal,而是从GraphTraversalSource (即您的g)中生成它们。我认为它可以工作,但是那个类实际上并不是被设计成供用户直接使用的,所以API可能会从你的下面转移出来,或者初始化行为可能会改变并给你带来麻烦。

在某种意义上,直接构造是导致问题的原因,因为您构建的遍历字节码并不真正有效:

代码语言:javascript
复制
gremlin> defaultGraphTraversal = new DefaultGraphTraversal<>(graph.traversal());[]
gremlin> defaultGraphTraversal.iterate();[]
gremlin> bytecode = defaultGraphTraversal.getBytecode()
==>[[], [none()]]

因为您不是从GraphTraversalSource派生的,所以最终构建的遍历没有任何源指令(即上面字节码输出中的第一个[] )。否则,JavaTranslator将走上一条与预期不同的道路,并尝试在GraphTraversalSource而不是Traversal上调用none()。当您取消对调用addV()的代码行的注释时,显然可以解决这个问题,因为这是一个适当的开始步骤,可以作为一个派生步骤,而none()则不能。

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

https://stackoverflow.com/questions/68177106

复制
相关文章

相似问题

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