Мне нужно выбрать случайную вершину или ребро из графа. В настоящее время я использую API чертежей для запроса графика. Как лучше всего случайным образом выбрать вершину или ребро из моего графа?
Как лучше всего выбрать случайную вершину из базы данных графа Titan
Ответы (1)
Предполагая, что вы не знаете всех своих элементов на графике, вы можете использовать getVertices() или getEdges() для извлечения всех вершин/ребер из графа.
Но поскольку вы получаете итератор из этих методов, настоящая проблема заключается в том, как выбрать случайный элемент из итератора.
Есть два способа решить эту проблему.
- Перебрать все элементы и сохранить их в массиве или списке и выбрать случайный элемент по размеру коллекции или
- Используйте выборку из резервуара при переборе элементов.
Есть еще один способ решить эту проблему, если вы используете конвейер Gremlin. , выполняя ваш запрос на основе ваших меток, используя фильтр случайных чисел от Gremlin и выбирая первую вершину.
person
Martin Seeler
schedule
23.12.2013
В настоящее время я получаю все свои вершины в список массивов, а затем генерирую случайное число от 0 до размера массива. Метод Arraylist.get(randomNumber) в настоящее время работает, но работает медленно. Я хотел знать, есть ли другой способ выбрать случайную вершину. Мое требование состоит в том, чтобы получить случайную вершину среди тех, у кого есть определенное ребро (свойство метки), или запросить случайное ребро с определенной меткой, чтобы я мог получить его вершину.
- person user2611221; 24.12.2013
Тогда второй подход должен соответствовать вашим потребностям. Вы должны использовать такой запрос, как
graph.query().labels("foo").vertices()
, и использовать выборку Reservoire, чтобы избежать дополнительного списка для выбора случайного элемента из итератора.
- person Martin Seeler; 24.12.2013
Я использую базу данных Titan Graph, и я не вижу метода ha как lables() для графика. graph.query.labels() выдает ошибку компиляции. У меня есть метод labels() с вершиной (vertex.query().labels()).
- person user2611221; 24.12.2013
Да, вы правы, это доступно только на вершинах. Но пробоотбор резервуара все равно должен делать свою работу с
getEdges()
.
- person Martin Seeler; 24.12.2013
Я добавил еще один способ, возможно, это поможет вам.
- person Martin Seeler; 24.12.2013
Я не уверен, что
random
является таким же хорошим выбором, как перемешивание в данном случае. С shuffle
вы можете просто next()
найти первый элемент в конвейере, где random
может потребоваться несколько оценок, прежде чем будет выбран случайный элемент.
- person stephen mallette; 24.12.2013
Спасибо за ответы!! И случайный выбор, и случайный выбор по-прежнему дороги. Сейчас пробую пробу из водохранилища. Спасибо еще раз!
- person user2611221; 24.12.2013