Gremlin - перемещение нескольких ребер за один проход - PullRequest
0 голосов
/ 06 ноября 2019

Я использую Gremlin для доступа к данным в AWS Neptune. Мне нужно изменить 2 ребра, выходящие из одной вершины, чтобы они указывали на 2 вершины, которые отличаются от тех, на которые он указывает в данный момент.

Например, если текущее отношение выглядит так, как показано ниже:

(X)---(A)---(Y)
   (B)   (C)

Я хочу изменить его на:

(X)   (A)   (Y)
     /   \
   (B)   (C)

Чтобы вся операция выполнялась водна транзакция, мне нужно сделать это за один проход (потому что логика транзакций вручную с использованием tx.commit() и tx.rollback() не поддерживается в 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') возвращает 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) ...

Пожалуйста, помогите.

1 Ответ

0 голосов
/ 06 ноября 2019

Вы можете попробовать:

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()
)
...