【问题标题】:How to remove an edge and add a new edge between two vertices?如何删除边并在两个顶点之间添加新边?
【发布时间】:2016-11-17 14:35:50
【问题描述】:

我正在尝试删除一条边并在两个顶点之间添加一条新边。我如何在 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]]

谢谢。

【问题讨论】:

    标签: gremlin tinkerpop3 gremlinjs


    【解决方案1】:

    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 存储在“人”变量中……是吗?

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

    显然它不是Vertex。 “人”是Traversal,控制台会这样看待它并为您迭代它,这就是为什么您在输出中得到“v1”的原因。请注意,遍历现在“完成”:

    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]
    

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

    【讨论】:

    • 谢谢。我得到了它。您是否还有将边缘从 user--is_invited_to_join--group 转换为 user--is_member_of--group 的建议?
    猜你喜欢
    • 2016-04-07
    • 2019-12-07
    • 1970-01-01
    • 2019-07-27
    • 2012-10-09
    • 2016-09-21
    • 2022-11-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多