Получить все вершины и ребра в виде карты в одном запросе - PullRequest
0 голосов
/ 08 апреля 2019

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

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

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

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

Спасибо

Ответы [ 2 ]

1 голос
/ 08 апреля 2019

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

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

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

0 голосов
/ 08 апреля 2019

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

...