Как удалить ребро и добавить новое ребро между двумя вершинами?

Я пытаюсь опустить ребро и добавить новое ребро между двумя вершинами. Как мне это сделать в 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:

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 ответ

Решение

В руководстве по Gremlin Console эта проблема немного обсуждается. Вы не повторяете свой обход. Учтите следующее:

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 хранится в переменной "персона"... или это?

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]

Возможно, это может быть не так легко читаемо, как разбить его на два или более отдельных обхода, но это можно сделать.

Другие вопросы по тегам