Получить все вершины и ребра в виде карты в одном запросе

#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. Спасибо!