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

Я новичок в гремлинах и пытаюсь собрать на карте все вершины и ребра. Это кажется относительно простой операцией, однако я изо всех сил пытаюсь найти лучший способ сделать это.

Я сделал это, выполнив 2 отдельных запроса:

{
    "nodes": g.V().valueMap().toList(),
    "edges": g.E().valueMap().toList()
}

Можно ли добиться вышеуказанного результата с помощью одного запроса?

Спасибо

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
0
446
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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

Я не уверен в обстоятельствах, при которых вы это делаете, но кроме самых маленьких графиков, этот тип запроса будет очень дорогим. Тем не менее, есть несколько способов сделать это с помощью одного запроса:

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')

Опять же, такие обходы не следует выполнять легкомысленно, поскольку они представляют собой полное сканирование графа.

Большое спасибо! Запрос будет выполняться только на маленьких графах!

dimmg 08.04.2019 13:35

для 2-го фрагмента, который меня интересует, похоже, что библиотека gremlin-python не работает, поскольку она не может десериализовать ответ, полученный от AWS Neptune. Выполнение фрагмента напрямую в AWS Neptune через HTTP работает. В любом случае, спасибо за вашу помощь.

dimmg 08.04.2019 14:00

хм - кажется странным, что это не работает с гремлин-питоном. вы упомянули, что это проблема сериализации, но в чем именно ошибка?

stephen mallette 08.04.2019 14:42

Как упомянул Стивен, это будет дорогостоящий запрос на большом графике. Тем не менее, я смог без проблем запустить следующий код 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/…

stephen mallette 08.04.2019 15:40

Я отредактировал свой ответ после дополнительного расследования. Кажется, это конкретная проблема десериализации со вторым запросом и Python. Оба запроса работали у меня из консоли.

Kelvin Lawrence 08.04.2019 15:52

Я думаю, что проблема в здесь, так как вы не можете удалить дубликаты диктов из списка таким образом. Я немного изменил функцию, и она сработала для меня. См. здесь pastebin.com/kvqA9DEj. Я могу создать PR, если мой подход правильный!

dimmg 08.04.2019 16:19

@stephenmallette жизнеспособно ли вышеуказанное решение?

dimmg 09.04.2019 21:39

смысл использования set() заключался в том, чтобы удалить дубликаты, но если python не позволяет этого должным образом, я думаю, нам нужно другое решение. если ваш способ работает, и это самый эффективный способ выполнить дедупликацию, и если все тесты пройдены, то я приветствую PR. Спасибо!

stephen mallette 09.04.2019 22:06

дополнительное обсуждение PR: github.com/apache/tinkerpop/pull/1095 для тех, кто следит

stephen mallette 10.04.2019 12:51

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