5

エッジを削除して、2 つの頂点間に新しいエッジを追加しようとしています。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]]

ありがとうございました。

4

1 に答える 1

9

Gremlin コンソールのチュートリアルでは、この問題について少し説明しています。トラバーサルを繰り返していません。次の点を考慮してください。

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]

おそらく、それは 2 つ以上の別々のトラバーサルに分割するほど読みにくいかもしれませんが、それは可能です。

于 2016-11-17T15:21:03.873 に答える