为什么 AddEdgeStep 在使用 Gremlin 的同一遍历中的边 DropStep 之后不起作用?
Why AddEdgeStep doesn't work after DropStep of edges in the same traversal using Gremlin?
我有这段代码,它主要更新属性,删除所有旧的 IsOfType
边并添加新的 IsOfType
边(如果我删除所有 method/class 抽象并使其内联):
traversal = g.V("Entity:633471488:519").as("entity");
//update properties
traversal.property("text", "new text");
traversal.property("description", "new description");
//drop typeEdges
traversal.select("entity").outE("IsOfType").drop();
//even that causes the same issue(!): traversal.select("entity").outE("HasInner").drop();
System.out.println("traversal after type edges deletion: " +traversal);
//make new typeEdges
traversal.V("Entity:996942848:518").as("type-0").addE("IsOfType").from("entity").to("type-0");
System.out.println("traversal after type edges addition: " +traversal);
//storage
traversal.select("entity").forEachRemaining({})
一切正常(甚至删除现有的 IsOfType
边)。但是新的 IsOfType
边的创建似乎并没有在图形上产生新的边。如果我注释掉掉落,那么创建工作正常(!)就好像 addEdgeStep
之前的 DropStep
发生在最后。我什至试图放弃其他类型的边缘,但它导致了同样的问题(!)。可能是隐式事务处理决定在 drop()
发生时提交,就像 next()
、iterate()
和 forEachRemaining()
一样?如果是这种情况,那么使用 Fluent API 就不会在同一个事务中发生丢弃和创建,这使得它对实际应用程序不是很有用:(
这是在我的 运行 中删除和添加两个 IsOfType
边之后的遍历状态(我尝试了 Java 和 Datastax Studio 控制台):
traversal after type edges deletion:
[
GraphStep(vertex,[Entity:633471488:519])@[entity],
AddPropertyStep({value=[Entity], key=[atClass]}),
AddPropertyStep({value=[FilmWithSuperCategories aaa], key=[text]}),
AddPropertyStep({value=[dffsdfsd f2313], key=[description]}),
SelectOneStep(entity)@[entity],
VertexStep(OUT,[IsOfType],edge),
DropStep
]
traversal after type edges addition:
[
GraphStep(vertex,[Entity:633471488:519])@[entity],
AddPropertyStep({value=[Entity], key=[atClass]}),
AddPropertyStep({value=[FilmWithSuperCategories aaa], key=[text]}),
AddPropertyStep({value=[dffsdfsd f2313], key=[description]}),
SelectOneStep(entity)@[entity],
VertexStep(OUT,[IsOfType],edge),
DropStep,
GraphStep(vertex,[Entity:996942848:518])@[type-0],
AddEdgeStep({~from=[[SelectOneStep(entity)]], ~to=[[SelectOneStep(type-0)]], label=[IsOfType]}),
GraphStep(vertex,[Entity:1489781376:516])@[type-1],
AddEdgeStep({~from=[[SelectOneStep(entity)]], ~to=[[SelectOneStep(type-1)]], label=[IsOfType]})
]
编辑
根据我在这里阅读的内容 (http://tinkerpop.apache.org/docs/current/reference/#drop-step)
The drop()-step (filter/sideEffect) is used to remove element and properties from the graph (i.e. remove). It is a filter step because the traversal yields no outgoing objects.
没有返回任何对象,因此在发生掉落后无法执行任何操作!所以我很好奇如何使用 DSE Graph Fluent API
在单个事务中执行多个 drops/additions
谢谢!
您可以将 drop
包裹在 sideEffect
步骤中,例如:
g.V(entity1).as("a").sideEffect(outE().filter(inV().is(entity2)).drop()).
V(entity2).addE("link").from("a")
我有这段代码,它主要更新属性,删除所有旧的 IsOfType
边并添加新的 IsOfType
边(如果我删除所有 method/class 抽象并使其内联):
traversal = g.V("Entity:633471488:519").as("entity");
//update properties
traversal.property("text", "new text");
traversal.property("description", "new description");
//drop typeEdges
traversal.select("entity").outE("IsOfType").drop();
//even that causes the same issue(!): traversal.select("entity").outE("HasInner").drop();
System.out.println("traversal after type edges deletion: " +traversal);
//make new typeEdges
traversal.V("Entity:996942848:518").as("type-0").addE("IsOfType").from("entity").to("type-0");
System.out.println("traversal after type edges addition: " +traversal);
//storage
traversal.select("entity").forEachRemaining({})
一切正常(甚至删除现有的 IsOfType
边)。但是新的 IsOfType
边的创建似乎并没有在图形上产生新的边。如果我注释掉掉落,那么创建工作正常(!)就好像 addEdgeStep
之前的 DropStep
发生在最后。我什至试图放弃其他类型的边缘,但它导致了同样的问题(!)。可能是隐式事务处理决定在 drop()
发生时提交,就像 next()
、iterate()
和 forEachRemaining()
一样?如果是这种情况,那么使用 Fluent API 就不会在同一个事务中发生丢弃和创建,这使得它对实际应用程序不是很有用:(
这是在我的 运行 中删除和添加两个 IsOfType
边之后的遍历状态(我尝试了 Java 和 Datastax Studio 控制台):
traversal after type edges deletion:
[
GraphStep(vertex,[Entity:633471488:519])@[entity],
AddPropertyStep({value=[Entity], key=[atClass]}),
AddPropertyStep({value=[FilmWithSuperCategories aaa], key=[text]}),
AddPropertyStep({value=[dffsdfsd f2313], key=[description]}),
SelectOneStep(entity)@[entity],
VertexStep(OUT,[IsOfType],edge),
DropStep
]
traversal after type edges addition:
[
GraphStep(vertex,[Entity:633471488:519])@[entity],
AddPropertyStep({value=[Entity], key=[atClass]}),
AddPropertyStep({value=[FilmWithSuperCategories aaa], key=[text]}),
AddPropertyStep({value=[dffsdfsd f2313], key=[description]}),
SelectOneStep(entity)@[entity],
VertexStep(OUT,[IsOfType],edge),
DropStep,
GraphStep(vertex,[Entity:996942848:518])@[type-0],
AddEdgeStep({~from=[[SelectOneStep(entity)]], ~to=[[SelectOneStep(type-0)]], label=[IsOfType]}),
GraphStep(vertex,[Entity:1489781376:516])@[type-1],
AddEdgeStep({~from=[[SelectOneStep(entity)]], ~to=[[SelectOneStep(type-1)]], label=[IsOfType]})
]
编辑
根据我在这里阅读的内容 (http://tinkerpop.apache.org/docs/current/reference/#drop-step)
The drop()-step (filter/sideEffect) is used to remove element and properties from the graph (i.e. remove). It is a filter step because the traversal yields no outgoing objects.
没有返回任何对象,因此在发生掉落后无法执行任何操作!所以我很好奇如何使用 DSE Graph Fluent API
在单个事务中执行多个 drops/additions谢谢!
您可以将 drop
包裹在 sideEffect
步骤中,例如:
g.V(entity1).as("a").sideEffect(outE().filter(inV().is(entity2)).drop()).
V(entity2).addE("link").from("a")