如何删除边并在两个顶点之间添加新边?

时间:2016-11-17 14:35:51

标签: gremlin tinkerpop3 gremlinjs

我正在尝试删除边缘并在两个顶点之间添加新边。我如何在Tinkerpop3中做到这一点?

def user = g.V().has("userId", 'iamuser42').has("tenantId", 'testtenant').hasLabel('User'); 
user.outE("is_invited_to_join").where(otherV().has("groupId", 'test123')).drop();
def group = g.V().has("groupId", 'test123').has("tenantId", 'testtenant').hasLabel('Group').next();
user.addEdge("is_member_of", group);

这是我在gremlin shell上遇到的错误:

No signature of method: org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.DefaultGraphTraversal.addEdge() is applicable for argument types: (java.lang.String, com.thinkaurelius.titan.graphdb.vertices.CacheVertex) values: [is_member_of, v[8224]]

谢谢。

1 个答案:

答案 0 :(得分:6)

Gremlin控制台tutorial稍微讨论了这个问题。你没有迭代你的遍历。请考虑以下事项:

gremlin> graph = TinkerFactory.createModern()
==>tinkergraph[vertices:6 edges:6]
gremlin> g = graph.traversal()
==>graphtraversalsource[tinkergraph[vertices:6 edges:6], standard]
gremlin> person = g.V().has('name','marko')
==>v[1]

大!人Vertex存储在" person"变量......还是它?

gremlin> person.class
==>class org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.DefaultGraphTraversal

显然它不是Vertex。 "人"是一个Traversal,控制台会看到它并为你迭代它,这就是为什么你得到" v 1"在输出中。请注意,遍历现在已经完成":

gremlin> person.hasNext()
==>false

您需要将Traversal迭代到您的变量中 - 在这种情况下,使用next()

gremlin> person = g.V().has('name','marko').next()
==>v[1]
gremlin> person.class
==>class org.apache.tinkerpop.gremlin.tinkergraph.structure.TinkerVertex

请注意,您在脚本中会遇到更多问题,因为您现在使用的是Vertex作为Traversal,所以这一行:

user.outE("is_invited_to_join").where(otherV().has("groupId", 'test123')).drop();

现在会因类似错误而失败,因为Vertex不会有outE()。您需要执行以下操作:

g.V(user).outE("is_invited_to_join").where(otherV().has("groupId", 'test123')).drop();

如果您想在同一遍历中添加边缘并删除旧边缘,可以执行以下操作:

gremlin> graph = TinkerFactory.createModern()
==>tinkergraph[vertices:6 edges:6]
gremlin> g = graph.traversal()
==>graphtraversalsource[tinkergraph[vertices:6 edges:6], standard]
gremlin> g.V(1).outE('knows')
==>e[7][1-knows->2]
==>e[8][1-knows->4]
gremlin> g.V(1).as('a').outE().as('edge').inV().hasId(2).as('b').addE('knew').from('a').to('b').select('edge').drop()
gremlin> g.V(1).outE('knew')
==>e[12][1-knew->2]
gremlin> g.V(1).outE('knows')
==>e[8][1-knows->4]

可以说,这可能不像将其分解为两个或多个单独的遍历那样可读,但可以这样做。