Условное прерывание прохождения обновления java-gremlin с сообщением об ошибке - PullRequest
0 голосов
/ 27 сентября 2018

У меня есть сценарий, в котором я в процессе обхода обновления хочу проверить условие, и если это условие ложное, я хочу прервать обход и оставить график без изменений.Также я хочу знать, что обход был пропущен, поэтому я могу выдать исключение для вызывающего кода.

Ограничения:

  • Мне нужно сделать это в one traversal, потому что служба баз данных графа, которую я использую, не может удерживать транзакцию через несколько обходов.
  • Мне нужен способ определить причину прерывания обхода.
  • Также кажется, что я не могуиспользуйте шаг sideEffect () (?), потому что кажется, что он не подходит для сериализации запроса gremlin.

Основной обход, который работает локально с использованием TinkerGraph, но не , развернутый каклямбда-вызов AWS Neptune.

GraphTraversalSource g = graph.traversal();

g.V().hasLabel("ops").fold()
  .coalesce(
      unfold(),
      sideEffect(t -> { throw new RuntimeException("First vertice not found"); }))
  .as("a")
  // do much more stuff
  .hasNext();

sideEffect (org.someone.graph.ClassImpl$$Lambda$155/352598575@1b7f1140)]]], aliases = {g = g}}}] не удалосьбыть сериализованным org.apache.tinkerpop.gremlin.driver.ser.AbstractGryoMessageSerializerV3d0.

1 Ответ

0 голосов
/ 27 сентября 2018

Lambdas нельзя сериализовать, поэтому вы получаете это исключение.Кроме того, лямбды не поддерживаются в Нептуне , поэтому ваш подход все равно не сработает.Ваши эксперименты с TinkerGraph сработали, потому что у него нет ни одного из этих ограничений.

Я не уверен, что вы можете сделать, чтобы обойти эту проблему, потому что вы упомянули, что:

Мне действительно нужноспособ определить, почему обход был прерван.

Может быть, вы могли бы каким-то образом использовать constant()?

gremlin> g = TinkerFactory.createModern().traversal()
==>graphtraversalsource[tinkergraph[vertices:6 edges:6], standard]
gremlin> g.V().has('person','name','marko').fold().coalesce(unfold(), constant('Not Found'))
==>v[1]
gremlin> g.V().has('person','name','x').fold().coalesce(unfold(), constant('Not Found'))
==>Not Found

Я не уверен, что это будет работать идеально, потому что выхотите

оставить график без изменений

В зависимости от того, как вы пишете свой Gremlin, это не сработало бы даже в TinkerGraph.constant() не является «условием ошибки», которое будет распознаваться как метод отката транзакции.Возможно, это просто то, что нужно знать.В зависимости от того, насколько сложна ваша логика, у вас может получиться действительно трудный для чтения Gremlin.Возможно, вам придется пересмотреть свой подход.

...