Gremlin Java 使用 DefaultGraphTraversal 抛出顶点已存在

Gremlin Java Using DefaultGraphTraversal Throws Vertex Already Exists

我正在尝试使用 gremlin java 将顶点保存到 TinkerGraph 中, 我做了一个测试,首先将一个顶点保存到图形中,然后检查这个顶点是否存在,如果不存在,添加相同的顶点。

这个有效:

GraphTraversalSource graph = TinkerGraph.open().traversal();
graph.addV().property(T.id, "1").next();
graph.V("1").fold().coalesce(__.unfold(),__.addV().property(T.id, "1")).next();

我看到 graph.V() 实际上正在创建一个 DefaultGraphTraversal GraphTraversalSource,所以我尝试用另一种方式来写它:

GraphTraversalSource graph = TinkerGraph.open().traversal();
graph.addV().property(T.id, "1").next();
new DefaultGraphTraversal(graph).V("1").fold().coalesce(__.unfold(),__.addV().property(T.id, "1")).next();

但抛出异常:

java.lang.IllegalArgumentException: Vertex with id already exists: 1

不知道为什么和第一种方式不一样? DefaultGraphTraversal 好像不能直接用?

虽然 DefaultGraphTraversal class 是 public 我不认为它是供用户直接使用的。它可能对图形提供者有一些用处,但这就是为什么它没有受到范围的更多保护。坚持编写 Gremlin 来与您的图表交互,因为它将成为您可以在其中构建应用程序的 most portable way。我也会考虑坚持更常见的事物命名约定:

Graph graph = TinkerGraph.open();
GraphTraversalSource g = graph.traversal();
g.addV().property(T.id, "1").next();
g.V("1").fold().coalesce(__.unfold(),__.addV().property(T.id, "1")).next();

单行GraphTraversalSource创作已成常态:

GraphTraversalSource g = TinkerGraph.open().traversal(); 

但重点是 "graph" 用于 Graph 而 "g" 用于 GraphTraversalSource

至于为什么直接使用DefaultGraphTraversal会报错:

gremlin> g = TinkerGraph.open().traversal();
==>graphtraversalsource[tinkergraph[vertices:0 edges:0], standard]
gremlin> g.addV().property(T.id, "1").next();
==>v[1]
gremlin> new DefaultGraphTraversal(g).V("1")
gremlin> new DefaultGraphTraversal(g).V("1").steps[0].isStartStep()
==>false
gremlin> g.V("1").steps[0].isStartStep()
==>true

区别在于 DefaultGraphTraversalV() 的调用与 GraphTraversalSourceV() 的调用不同。前者是 mid-traversal V() ,后者是开始步骤。始终使用 GraphTraversalSource 和 "g" 开始编写您的 Gremlin。