TinkerPop Gremlin Как понять, что предикат передан на шаге До - PullRequest
4 голосов
/ 14 июля 2020

У меня есть обход, где мне нужно повторять, пока не будут найдены новые ребра. В консоли gremlin / groovy я достигаю этого путем передачи лямбда-выражения, которое всегда возвращает false.

g.V(7).
  repeat(out().not(hasLabel('region', 'business')).simplePath()).
  until(outE().count().is(0)).
  repeat(both().not(hasLabel('region', 'business')).dedup()).
  emit().until{t -> false}.
  where(hasLabel('account'))

Когда я пробую тот же подход из приложения Java и подключаюсь к экземпляру AWS Neptune, Я получаю исключение о том, что команда не может быть отправлена ​​на сервер ...

GraphTraversal t =
    g.V(uid).union(__.identity(),
        __.repeat(__.out().not(__.hasLabel("region", "business")).simplePath()).
            until(__.outE().limit(1).count().is(0)).
            repeat(__.both().not(__.hasLabel("region", "business")).simplePath()).
            until(x -> false).emit(__.hasLabel("aws_account")));

Я понимаю, мне нужно зарегистрировать Java Lambda и, возможно, Predicates как сериализуемые, но не смог определить синтаксис. Также как мне добавить его в мой построитель кластера с помощью «сериализатора»?

Полная трассировка стека:

Исключение в потоке «main» io.netty.handler.code c .EncoderException: org. apache .tinkerpop.gremlin.driver.exception.ResponseException: произошла ошибка во время сериализации этого запроса [RequestMessage {, requestId = 28cd3e32-306a-457e-a6d2-2dc5bc9797d8, op = 'bytecode', процессор = 'обход', args = {gremlin = [[], [V (A_639008103873), объединение ([[], [identity ()]]], [[], [повторение ([[], [out (), not ([[], [hasLabel (регион, бизнес)]]), simplePath ()]]), до ([[], [outE (), limit (1), count (), is (0)]] ), повторите ([[], [both (), not ([[], [hasLabel (region, business)]]]), simplePath ()]]), до (org.saswata.Main $$ Lambda $ 34 / 1735507635@6110020d), emit ([[], [hasLabel (aws_account)]])]])]], aliases = {g = g}}}] - не удалось отправить на сервер - Причина: org. apache .tinkerpop.gremlin.driver.ser.SerializationException: java .lang.IllegalArgumentException: класс не зарегистрирован: org.saswata.Main $$ Lambda $ 34/1735 507635 Примечание. Для регистрации этого класса используйте: kryo.register (org.saswata.Main $$ Lambda $ 34 / 1735507635.class); в io.netty.handler.code c .MessageToMessageEncoder.write (MessageToMessageEncoder. java: 106) в io.netty.channel.AbstractChannelHandlerContext.invokeWrite0 (AbstractChannelHandlerContext. java: 7. AbstractChannelHandlerContext.invokeWrite (AbstractChannelHandlerContext. java: 730) в io.netty.channel.AbstractChannelHandlerContext.access $ 1900 (AbstractChannelHandlerContext. java: 38) в io.netty.channelContext. * AbstractHandlerContext. * AbstractHandlerContext. * AbstractHandlerContext. : 1081) в io.netty.channel.AbstractChannelHandlerContext $ WriteAndFlushTask.write (AbstractChannelHandlerContext. java: 1128) в io.netty.channel.AbstractChannelHandlerContext $ AbstractWriteTask.run (в * AbstractChannelContext. util.concurrent.AbstractEventExecutor.safeExecute (AbstractEventExecutor. java: 163) в io.netty.util.concurrent.SingleThreadEventExecutor.runAllTasks (SingleThreadEventExecutor. oop: 404) в io.netty.util.concurrent.SingleThreadEventExecutor. *1037*: 404 .ру n (NioEventL oop. java: 465) в io.netty.util.concurrent.SingleThreadEventExecutor $ 5.run (SingleThreadEventExecutor. java: 884) в java .lang.Thread.run (Thread. java: 748) Вызвано: org. apache .tinkerpop.gremlin.driver.exception.ResponseException: произошла ошибка во время сериализации этого запроса [RequestMessage {, requestId = 28cd3e32-306a-457e-a6d2-2dc5bc9797d8, op = ' bytecode ', processor =' traversal ', args = {gremlin = [[], [V (A_639008103873), union ([[], [identity ()]]], [[], [повторение ([[]], [out (), а не ([[], [hasLabel (region, business)]]), simplePath ()]]), пока ([[], [outE (), limit (1), count (), не будет (0 )]]), повторите ([[], [both (), not ([[], [hasLabel (region, business)]]]), simplePath ()]]), пока (org.saswata.Main $$ Lambda $ 34 / 1735507635@6110020d), emit ([[], [hasLabel (aws_account)]])]])]], aliases = {g = g}}}] - не удалось отправить на сервер - Причина: org . apache .tinkerpop.gremlin.driver.ser.SerializationException: java .lang.IllegalArgumentException: класс не зарегистрирован: org.saswata.Main $$ Lambda $ 34/1735507635 Примечание. Для регистрации этого класса используйте: kryo.register (org.saswata.Main $$ Lambda $ 34 / 1735507635.class); по адресу org. apache .tinkerpop.gremlin.driver.handler.WebSocketGremlinRequestEncoder.encode (WebSocketGremlinRequestEncoder. java: 63) в org. apache .tinkerpop.gremlin.driver.handler.WebSocketGremlinquest.Resquest49EnCode (WebSocketGremlinquest.Ruencode *: 40) на io.netty.handler. code c .MessageToMessageEncoder.write (MessageToMessageEncoder. java: 88) ... еще 11

Тем временем я решил обойти проблему, используя хак, чтобы проверить отсутствие метки в до аргумента hasLabel('fake')

1 Ответ

5 голосов
/ 14 июля 2020

Как видите, ЗДЕСЬ Neptune не поддерживает шаги лямбда-выражений. Таким образом, вы не можете использовать этот тип синтаксиса.

Также в вашем сценарии использования шаг until вам вообще не нужен. если вы его не используете, шаг repeat будет продолжаться до тех пор, пока не будет достигнут пустой обход.

пример: https://gremlify.com/8es7aelrr4n

...