Как лучше всего выбрать случайную вершину из базы данных графа Titan

Мне нужно выбрать случайную вершину или ребро из графа. В настоящее время я использую API чертежей для запроса графика. Как лучше всего случайным образом выбрать вершину или ребро из моего графа?


person user2611221    schedule 23.12.2013    source источник


Ответы (1)


Предполагая, что вы не знаете всех своих элементов на графике, вы можете использовать getVertices() или getEdges() для извлечения всех вершин/ребер из графа.

Но поскольку вы получаете итератор из этих методов, настоящая проблема заключается в том, как выбрать случайный элемент из итератора.

Есть два способа решить эту проблему.

  1. Перебрать все элементы и сохранить их в массиве или списке и выбрать случайный элемент по размеру коллекции или
  2. Используйте выборку из резервуара при переборе элементов.

Есть еще один способ решить эту проблему, если вы используете конвейер Gremlin. , выполняя ваш запрос на основе ваших меток, используя фильтр случайных чисел от Gremlin и выбирая первую вершину.

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