У меня есть приложение 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, а затем выбрать, где это удалось.
У вас действительно нет особого выбора, кроме как проверить результат, чтобы увидеть его тип. Результаты 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, вы получите более сокращенный набор ожидаемых типов. Вы можете увидеть их в файле документация ввода/вывода.
Спасибо, Стивен, я понял, о чем ты говоришь. Мне придется проверять тип рекурсивно. Позвольте мне поиграть с другими сериализациями, обновлю, если это сработает для меня. Вы здорово помогли мне за последние пару дней. Спасибо за быстрые ответы :)