Ошибка при построении обхода Gremlin с использованием лямбда-функции

У меня есть вершина со свойствами startDate и endDate:

Date start = new Date();
Date end = Date.from(start.toInstant().plusSeconds(600));
g.V(8L).property("startDate", start).property("endDate", end).next();

Теперь я хочу вычислить разницу endDate-startDate, и я могу сделать это с помощью sack():

g.V(8L)
    .sack(Operator.assign).by(values("endDate").map(it -> ((Date)it.get()).getTime()))
    .sack(Operator.minus).by(values("startDate").map(it -> ((Date)it.get()).getTime()))
    .sack()

Однако это не работает, если обход отправляется удаленно.

Путем преобразования Lambda в Lambda.function() приведенный ниже обход работает удаленно:

String funcGetTime = "v -> ((Date)v.get()).getTime()";
g.V(8L)
        .sack(Operator.assign).by(values("endDate").map(Lambda.function(funcGetTime)))
        .sack(Operator.minus).by(values("startDate").map(Lambda.function(funcGetTime)))
        .sack()

Однако обход больше не работает в моей локальной настройке графа в памяти. Сообщение об ошибке:

java.lang.IllegalArgumentException: The provided traverser does not map to a value: v[8]->[PropertiesStep([endDate],value), LambdaMapStep(lambda[v -> ((Date)v.get()).getTime()])]

Мой вопрос: есть ли обход, который делает то же самое (вычисляет разницу между endDate и startDate), который может работать как для локального, так и для удаленного? Мне это нужно, поскольку мои модульные тесты запускаются локально с графом в памяти, а во время работы мое приложение вызывает обход, подключаясь к удаленному графу.

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

Спасибо.

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
22
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

В Gremlin еще нет операторов даты и времени, которые могли бы помочь вам в этом, и, как вы обнаружили, удаленная лямбда не будет оцениваться так же, как локальная. Удаленный требует, чтобы весь обход оценивался в GremlinGroovyScriptEngine, который в основном берет Gremlin Bytecode, пропускает его через GroovyTranslator, а затем оценивает все это как сценарий. Я могу смоделировать это в консоли Gremlin следующим образом:

gremlin> evaluate(GroovyTranslator.of("g").translate(g.V().map(Lambda.function("v -> v"))).script)
==>v[1]
==>v[2]
==>v[3]
==>v[4]
==>v[5]
==>v[6]

Если вам нужно, чтобы удаленный работал так же, как локальный, я не могу придумать никаких обходных путей, кроме как описанного выше подхода, или путем сохранения вашей даты до тех пор (возможно, как форма денормализации), чтобы вы могли выполнять вычисления напрямую без необходимость преобразования DateTime. Будем надеяться, что в будущих версиях Gremlin улучшит работу с датами.

Большое спасибо за ваш ответ и предложение. Возможно, использование типа long должно работать в моем случае. Мое приложение преобразует его в отображение даты.

Hieu Nguyen 06.04.2022 18:57

Другие вопросы по теме