使用DefaultGraphTraversal的Gremlin Java已存在

使用DefaultGraphTraversal的Gremlin Java已存在,gremlin,Gremlin,我正在尝试使用gremlin java将vertex保存到TinkerGraph中, 我做了一个测试,首先将一个顶点保存到图中,然后检查这个顶点是否存在,如果不存在,则添加相同的顶点 这项工作: GraphTraversalSource graph = TinkerGraph.open().traversal(); graph.addV().property(T.id, "1").next(); graph.V("1").fold().coalesce(__.unfold(),__.addV()

我正在尝试使用gremlin java将vertex保存到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()实际上是在使用提供的 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:id为的顶点已存在:1


我想知道为什么它和第一条路不一样?DefaultGraphTraversal似乎不应该直接使用?

虽然
DefaultGraphTraversal
类是
public
类,但我认为它不是供用户直接使用的。它可能对图形提供者有一些用途,但这就是为什么它不受范围的更多保护。坚持编写Gremlin与图形交互,因为它将是构建应用程序的最佳工具。我也会考虑坚持更常见的命名约定:

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

区别在于对
V()
DefaultGraphTraversal
调用与对
V()
graphtraversource
调用不同。前者是第一步,后者是第一步。始终使用
图形旅行资源
和“g”开始编写您的小精灵。

谢谢您的解释!为什么中间遍历会导致它无法识别现有顶点“1”,因为管道中没有开始遍历的遍历器。中间遍历
V()。管道显示为空,因此不执行任何操作。这就是为什么我展示了
isStartStep()
的输出-作为“开始步骤”的步骤不需要遍历器来触发它…它能够注入遍历器来启动管道。