Я новичок в гремлинах и пытаюсь собрать на карте все вершины и ребра. Это кажется относительно простой операцией, однако я изо всех сил пытаюсь найти лучший способ сделать это.
Я сделал это, выполнив 2 отдельных запроса:
{
"nodes": g.V().valueMap().toList(),
"edges": g.E().valueMap().toList()
}
Можно ли добиться вышеуказанного результата с помощью одного запроса?
Спасибо
Я не уверен в обстоятельствах, при которых вы это делаете, но кроме самых маленьких графиков, этот тип запроса будет очень дорогим. Тем не менее, есть несколько способов сделать это с помощью одного запроса:
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')
Опять же, такие обходы не следует выполнять легкомысленно, поскольку они представляют собой полное сканирование графа.
для 2-го фрагмента, который меня интересует, похоже, что библиотека gremlin-python не работает, поскольку она не может десериализовать ответ, полученный от AWS Neptune. Выполнение фрагмента напрямую в AWS Neptune через HTTP работает. В любом случае, спасибо за вашу помощь.
хм - кажется странным, что это не работает с гремлин-питоном. вы упомянули, что это проблема сериализации, но в чем именно ошибка?
Как упомянул Стивен, это будет дорогостоящий запрос на большом графике. Тем не менее, я смог без проблем запустить следующий код 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
версию запроса.
интересно — мы проверяем «очень большие» результаты, хотя заметили проблемы с размерами полезной нагрузки — github.com/apache/tinkerpop/blob/…
Я отредактировал свой ответ после дополнительного расследования. Кажется, это конкретная проблема десериализации со вторым запросом и Python. Оба запроса работали у меня из консоли.
Я думаю, что проблема в здесь, так как вы не можете удалить дубликаты диктов из списка таким образом. Я немного изменил функцию, и она сработала для меня. См. здесь pastebin.com/kvqA9DEj. Я могу создать PR, если мой подход правильный!
@stephenmallette жизнеспособно ли вышеуказанное решение?
смысл использования set()
заключался в том, чтобы удалить дубликаты, но если python не позволяет этого должным образом, я думаю, нам нужно другое решение. если ваш способ работает, и это самый эффективный способ выполнить дедупликацию, и если все тесты пройдены, то я приветствую PR. Спасибо!
дополнительное обсуждение PR: github.com/apache/tinkerpop/pull/1095 для тех, кто следит
Большое спасибо! Запрос будет выполняться только на маленьких графах!