Gremlin - 在单次遍历中移动多条边
Gremlin - Move multiple edges in single traversal
我正在使用 Gremlin 访问 AWS Neptune 中的数据。我需要修改从单个顶点发出的 2 条边,以指向 2 个顶点,这两个顶点与它目前指向的顶点不同。
例如当前关系如下所示:
(X)---(A)---(Y)
(B) (C)
我想修改为:
(X) (A) (Y)
/ \
(B) (C)
为确保整个操作在单个事务中完成,我需要在单个遍历中完成(因为 manual transaction logic using tx.commit()
and tx.rollback()
is not supported 在 AWS Neptune 中)。
我尝试了以下查询来完成此操作但失败了:
1) 通过使用别名选择它们来添加新边并删除之前的边:
g.V(<id of B>).as('B').V(<id of C>).as('C').V(<id of A>).as('A').outE('LINK1','LINK2')
.as('oldEdges').addE('LINK1').from('A').to('B').addE('LINK2').from('A').to('C')
.select('oldEdges').drop();
这里,由于outE('LINK1','LINK2')
returns 2条边,后面加上的边,执行两次。所以我得到了 A 到 B 和 C 之间预期边数的两倍。
2) 添加新边并删除边 id 不等于新添加边的现有边。
g.V(<id of B>).as('B').V(<id of C>).as('C').V(<id of A>).as('A')
.addE('LINK1').from('A').to('B').as('edge1').addE('LINK2').from('A').to('C').as('edge2')
.select('A').outE().where(__.hasId(neq(select('edge1').id()))
.and(hasId(neq(select('edge2').id())))).drop();
我的 gremlin 控制台出现以下异常:
could not be serialized by org.apache.tinkerpop.gremlin.driver.ser.AbstractGryoMessageSerializerV3d0.
java.lang.IllegalArgumentException: Class is not registered: org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.DefaultGraphTraversal
Note: To register this class use: kryo.register(org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.DefaultGraphTraversal.class);
at org.apache.tinkerpop.shaded.kryo.Kryo.getRegistration(Kryo.java:488)
at org.apache.tinkerpop.gremlin.structure.io.gryo.AbstractGryoClassResolver.writeClass(AbstractGryoClassResolver.java:110)
at org.apache.tinkerpop.shaded.kryo.Kryo.writeClass(Kryo.java:517)
at org.apache.tinkerpop.shaded.kryo.Kryo.writeClassAndObject(Kryo.java:622)
at org.apache.tinkerpop.gremlin.structure.io.gryo.kryoshim.shaded.ShadedKryoAdapter.writeClassAndObject(ShadedKryoAdapter.java:49)
at org.apache.tinkerpop.gremlin.structure.io.gryo.kryoshim.shaded.ShadedKryoAdapter.writeClassAndObject(ShadedKryoAdapter.java:24)
...
请帮忙。
你可以试试:
g.V(<id of A>).union(
addE('Link1').to(V(<id of B>)),
addE('Link2').to(V(<id of C>)),
outE('Link1', 'Link2').where(inV().hasId(<id of X>,<id of Y>)).drop()
)
我正在使用 Gremlin 访问 AWS Neptune 中的数据。我需要修改从单个顶点发出的 2 条边,以指向 2 个顶点,这两个顶点与它目前指向的顶点不同。
例如当前关系如下所示:
(X)---(A)---(Y)
(B) (C)
我想修改为:
(X) (A) (Y)
/ \
(B) (C)
为确保整个操作在单个事务中完成,我需要在单个遍历中完成(因为 manual transaction logic using tx.commit()
and tx.rollback()
is not supported 在 AWS Neptune 中)。
我尝试了以下查询来完成此操作但失败了:
1) 通过使用别名选择它们来添加新边并删除之前的边:
g.V(<id of B>).as('B').V(<id of C>).as('C').V(<id of A>).as('A').outE('LINK1','LINK2')
.as('oldEdges').addE('LINK1').from('A').to('B').addE('LINK2').from('A').to('C')
.select('oldEdges').drop();
这里,由于outE('LINK1','LINK2')
returns 2条边,后面加上的边,执行两次。所以我得到了 A 到 B 和 C 之间预期边数的两倍。
2) 添加新边并删除边 id 不等于新添加边的现有边。
g.V(<id of B>).as('B').V(<id of C>).as('C').V(<id of A>).as('A')
.addE('LINK1').from('A').to('B').as('edge1').addE('LINK2').from('A').to('C').as('edge2')
.select('A').outE().where(__.hasId(neq(select('edge1').id()))
.and(hasId(neq(select('edge2').id())))).drop();
我的 gremlin 控制台出现以下异常:
could not be serialized by org.apache.tinkerpop.gremlin.driver.ser.AbstractGryoMessageSerializerV3d0.
java.lang.IllegalArgumentException: Class is not registered: org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.DefaultGraphTraversal
Note: To register this class use: kryo.register(org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.DefaultGraphTraversal.class);
at org.apache.tinkerpop.shaded.kryo.Kryo.getRegistration(Kryo.java:488)
at org.apache.tinkerpop.gremlin.structure.io.gryo.AbstractGryoClassResolver.writeClass(AbstractGryoClassResolver.java:110)
at org.apache.tinkerpop.shaded.kryo.Kryo.writeClass(Kryo.java:517)
at org.apache.tinkerpop.shaded.kryo.Kryo.writeClassAndObject(Kryo.java:622)
at org.apache.tinkerpop.gremlin.structure.io.gryo.kryoshim.shaded.ShadedKryoAdapter.writeClassAndObject(ShadedKryoAdapter.java:49)
at org.apache.tinkerpop.gremlin.structure.io.gryo.kryoshim.shaded.ShadedKryoAdapter.writeClassAndObject(ShadedKryoAdapter.java:24)
...
请帮忙。
你可以试试:
g.V(<id of A>).union(
addE('Link1').to(V(<id of B>)),
addE('Link2').to(V(<id of C>)),
outE('Link1', 'Link2').where(inV().hasId(<id of X>,<id of Y>)).drop()
)