Пакетный график Титана

Я хочу добавить новое свойство [и иногда добавлять ребра] к выбору узлов в существующем графе из 2 миллионов узлов, более 10 миллионов ребер. Я думал об использовании BatchGraph, но, судя по их WIKI, он не поддерживает поисковые запросы.

Например, извлеките эти узлы: g.V('id',1).has('prop1','text1') и обновите 'prop1' до 'text2'.

Как лучше всего это сделать.


person Alfiyum    schedule 05.06.2014    source источник


Ответы (1)


Я не думаю, что вам нужно использовать здесь BatchGraph. Звучит так, как будто вы делаете большую мутацию графа, и в этом случае, вероятно, лучше всего просто написать сценарий Gremlin для внесения ваших изменений. У вас не очень большой граф, поэтому, если вы не планируете делать какие-то очень сложные мутации (например, многошаговый обход), его выполнение не займет много времени. Если вы думаете, что это будет работать "долго", вам следует подумать о способах распараллеливания работы. Если вы пойдете по этому пути, вы можете рассмотреть возможность использования gpars.

По мере роста вашего графика вы обнаружите, что вам нужно будет использовать Faunus для администрирования большей части данных. В частности, это означает использование этапа скрипта.

person stephen mallette    schedule 05.06.2014
comment
Спасибо. Ну, со временем граф будет расти, поэтому искал пути получше. Я посмотрю на gpars. Также в моем графике [Cassandra-ES, узлы User и Place исчисляются миллионами] замечено, когда я добавляю ребра между существующими узлами [используя Java, около 7 потоков], чтение из файла, User --> Place with 'likes ', он выдает большое количество исключений 'com.thinkaurelius.titan.diskstorage.locking.PermanentLockingException: Конфликт за локальную блокировку'. Есть ли лучший способ справиться с этим? - person Alfiyum; 06.06.2014
comment
Немного обновил мой ответ, чтобы отразить возможный рост вашего графика. Если у вас есть замки, вы должны время от времени ожидать отказа. У вас должна быть какая-то стратегия повторных попыток для повторного выполнения вашей транзакции в случае сбоя. Blueprints имеет TransactionRetryHelper (github.com/tinkerpop/blueprints/wiki /), которые могут быть полезны в этом отношении. Вы также можете рассмотреть возможность предварительной обработки вашего файла, чтобы вы могли с уверенностью включить storage.batch-loading (что отключит блокировку). - person stephen mallette; 06.06.2014
comment
Шаг сценария Faunus выглядит великолепно. В прошлом я также пытался использовать TransactionRetryHelper и по-прежнему видел много сообщений PermanentLockingException в журнале. Просто пытаюсь понять, это потому, что добавление ребра обновляет список смежности как внешней, так и внутренней вершины? Поскольку мой набор данных [Пользователь --> Места] относится к типу «Многие ко многим», в тот момент, когда несколько потоков пытаются обновить график, эти исключения обязательно произойдут. Правильно? Учитывая это, могу ли я включить storage.batch-loading? - person Alfiyum; 06.06.2014
comment
Включение пакетной загрузки может быть небезопасным, если вам нужно обеспечить уникальность. Вам нужно будет предварительно обработать ваши данные, чтобы они представляли собой уникальный список пользователей/мест. Загрузите это, за которым следуют ребра с включенной пакетной загрузкой. Если по какой-то причине вы не можете выполнить предварительную обработку, вам следует попытаться снять блокировки быстрее (с помощью коммита/отката). Вы не указываете размер ваших транзакций, но чем дольше вы оставляете блокировку открытой, тем выше вероятность исключения блокировки. Возможно, вам поможет снижение размера транзакции. - person stephen mallette; 06.06.2014
comment
Вы также хотите убедиться, что вы не создаете странные условия гонки своими замками. Таким образом, внутри транзакции у вас есть блокировка userId и placeId. Одна транзакция в одном потоке захватывает блокировку userId, но не может получить блокировку placeId. Не удается получить блокировку placeId, потому что у другого потока есть этот placeId, но нет блокировки userId. Ни один не может завершить. Иногда дополнительная рандомизация в задержке повтора может помочь в таких ситуациях, но если их можно полностью избежать, тем лучше. - person stephen mallette; 06.06.2014