Как я могу определить, что возвращается из запроса Gremlin? Например, вершины, ребра, метки и т. д

У меня есть приложение Java, которое позволяет пользователю отправлять запросы Gremlin из пользовательского интерфейса, и эти запросы выполняются на внутреннем сервере Gremlin.

Я хочу знать, что возвращается в ResultSet. Это может быть список вершин или список ребер, а также список строк (могут быть метки). Чтобы я мог показать правильный пользовательский интерфейс, относящийся к этому типу возвращаемого объекта.

Нет уверенности в том, что возвращается, просто взгляните на начальную часть запроса. Например:

g.V() // returns list of Vertices
g.V().outE() // returns list of Edges
g.E().outV() // returns list of Vertices
g.E().outV().label() // returns list of Strings

String query = "g.E().outV().label()";
ResultSet resultSet = client.submit(query);
resultSet.forEach(result -> result.getString()); // getString or getVertex or getEdge ???

Анализ всего запроса для идентификации возвращенного объекта не является разумным и надежным подходом.

Каким может быть лучший подход для определения типа возвращаемого значения? Кроме того, чтобы попробовать все с помощью try...catch, а затем выбрать, где это удалось.

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
0
253
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

У вас действительно нет особого выбора, кроме как проверить результат, чтобы увидеть его тип. Результаты Gremlin также не всегда однородны. Например, кто-то может отправить это:

g.V(1).outE().path().
  unfold().
  inject(1, [1L, "xyz", [x:"don't care that this traversal is crazy"]], Double.NaN)

Забудьте, что никто, скорее всего, этого не сделает, и просто подумайте, что они могли бы. Вы получаете смесь вершин, ребер, списка с длинной двойной и встроенной картой. Вы не знаете результат, пока не получите его, и даже тогда вам может понадобиться определить типы внутри коллекций контейнеров. Если у вас есть разные виды рендеринга в вашем пользовательском интерфейсе для каждого типа, у вас нет другого выбора, кроме как рекурсивно выполнять определение типа. Возможно, вам также понадобится какой-то рендеринг по умолчанию, который может обрабатывать вещи, которые вы не знаете, как рендерить.

Если вы переключитесь с сериализации Gryo (я полагаю, вы используете ее по умолчанию для своего client) на GraphSON, вы получите более сокращенный набор ожидаемых типов. Вы можете увидеть их в файле документация ввода/вывода.

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

Satyam 21.06.2019 16:35

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