#python #gremlin #amazon-neptune
#питон #гремлин #amazon-нептун #python
Вопрос:
Я новичок в gremlin и пытаюсь собрать на карте все вершины и ребра. Это кажется относительно простой операцией, однако я изо всех сил пытаюсь найти лучший способ сделать это.
Я добился этого, выполнив 2 отдельных запроса:
{
"nodes": g.V().valueMap().toList(),
"edges": g.E().valueMap().toList()
}
Возможно ли достичь вышеуказанного результата с помощью одного запроса?
Спасибо
Ответ №1:
Я не уверен в обстоятельствах, при которых вы это делаете, но, кроме самых маленьких графиков, этот тип запроса будет чрезвычайно дорогим. Тем не менее, есть несколько способов, которыми вы могли бы сделать это с помощью одного запроса:
g.V().
project('v','edges').
by(valueMap()).
by(outE().valueMap().fold())
Я думаю, если бы вам было абсолютно необходимо поддерживать структуру, которую вы имели в своем комментарии, вы могли бы сделать:
g.V().store('vertices').by(valueMap()).
outE().store('edges').by(valueMap()).
cap('vertices','edges')
Опять же, эти виды обходов не должны выполняться легко, поскольку они представляют собой полное сканирование графика.
Комментарии:
1. Большое вам спасибо! Запрос будет выполняться только на небольших графиках!
2. для 2-го фрагмента, который меня интересует, похоже, что библиотека gremlin-python не работает, поскольку она не может десериализовать ответ, полученный от AWS Neptune. Выполнение фрагмента непосредственно в AWS Neptune через HTTP работает. В любом случае, спасибо вам за вашу помощь.
3. хм — кажется странным, что это не работает с gremlin-python. вы упоминаете, что это проблема сериализации, но в чем именно ошибка?
Ответ №2:
Как упоминал Стивен, это будет дорогостоящий запрос на большом графике. Тем не менее, я смог запустить следующий код Python, используя Gremlin-Python и Neptune без проблем.
mymap = (
g.V().
project('v','edges').
by(__.valueMap()).
by(__.outE().valueMap().fold())).toList()
print(mymap)
Я не смог запустить другой запрос (ниже) даже из консоли Gremlin, пока я либо не увеличил объем данных, которые могут быть приняты клиентом, либо не ограничил результат запроса. Даже с моим небольшим графиком ваш второй запрос изменяет размер фрейма результата по умолчанию 64 КБ, для которого настроена консоль Gremlin. Это сразу показывает, что это дорогостоящий запрос! Тем не менее, я бы использовал приведенный выше запрос, а не форму store
и cap
для простоты, но в любом большом графике в целом это немного анти-шаблон, поскольку он может возвращать огромные объемы данных. Что касается ошибки из вашего второго запроса, я смог запустить ее на консоли, когда добавил шаг ограничения, но все еще видел проблемы с Python.
# Notice the added limit which allows it to work from the console
g.V().store('vertices').by(__.valueMap()).
outE().limit(10).store('edges').by(__.valueMap()).
cap('vertices', 'edges').toList()
Даже с limit(10)
я все еще вижу ту же ошибку, что и вы, при использовании запроса из Python. Похоже, что клиент Python не может обработать результат запроса. Это требует дополнительного изучения. Пока вы можете просто использовать project
версию запроса.
Комментарии:
1. интересно — мы проверяем «очень большие» результаты, хотя после того, как заметили проблемы с размерами полезной нагрузки — github.com/apache/tinkerpop/blob /…
2. Я отредактировал свой ответ после дополнительного исследования. Похоже, это конкретная проблема десериализации со вторым запросом и Python. Оба запроса работали для меня с консоли.
3. Я думаю, что проблема здесь , поскольку вы не можете таким образом удалить дублированные dicts из списка. Я немного изменил функцию, и у меня это сработало. Смотрите здесь pastebin.com/kvqA9DEj . Я могу создать PR, если мой подход верен!
4. @stephenmallette является ли вышеуказанное решение жизнеспособным?
5. смысл использования
set()
заключался в удалении дубликатов, но если python не позволяет этого должным образом, то, я думаю, нам нужно другое решение. если ваш способ работает, и это наиболее эффективный способ выполнить дедупликацию, и если все тесты пройдут, тогда я буду приветствовать PR. Спасибо!