我尝试使用none()步骤对遍历查询进行反序列化,但似乎不支持这种反序列化
小炉匠版本是3.5.0
下面是一个失败的代码
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);
}
}
}结果,我捕捉到了这样一个异常:
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");中删除注释
代码将正常工作
那么为什么不支持这样的反序列化呢?
非常感谢!
发布于 2021-06-29 19:09:04
我建议您不要尝试直接构建DefaultGraphTraversal,而是从GraphTraversalSource (即您的g)中生成它们。我认为它可以工作,但是那个类实际上并不是被设计成供用户直接使用的,所以API可能会从你的下面转移出来,或者初始化行为可能会改变并给你带来麻烦。
在某种意义上,直接构造是导致问题的原因,因为您构建的遍历字节码并不真正有效:
gremlin> defaultGraphTraversal = new DefaultGraphTraversal<>(graph.traversal());[]
gremlin> defaultGraphTraversal.iterate();[]
gremlin> bytecode = defaultGraphTraversal.getBytecode()
==>[[], [none()]]因为您不是从GraphTraversalSource派生的,所以最终构建的遍历没有任何源指令(即上面字节码输出中的第一个[] )。否则,JavaTranslator将走上一条与预期不同的道路,并尝试在GraphTraversalSource而不是Traversal上调用none()。当您取消对调用addV()的代码行的注释时,显然可以解决这个问题,因为这是一个适当的开始步骤,可以作为一个派生步骤,而none()则不能。
https://stackoverflow.com/questions/68177106
复制相似问题