如何删除边并在两个顶点之间添加新边?
How to remove an edge and add a new edge between two vertices?
我正在尝试删除一条边并在两个顶点之间添加一条新边。我如何在 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 控制台 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
。 "person" 是一个 Traversal
,控制台会这样看待它并为你迭代它,这就是你在输出中得到 "v1" 的原因。请注意,遍历现在是 "done":
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]
可以说,这可能不如将其分成两个或多个单独的遍历那样可读,但可以做到。
我正在尝试删除一条边并在两个顶点之间添加一条新边。我如何在 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 控制台 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
。 "person" 是一个 Traversal
,控制台会这样看待它并为你迭代它,这就是你在输出中得到 "v1" 的原因。请注意,遍历现在是 "done":
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]
可以说,这可能不如将其分成两个或多个单独的遍历那样可读,但可以做到。