2016-02-04 3 views
0

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

Example Graph

Теперь у меня есть следующие ситуации:

  1. Я хочу найти все Freinds из узла X.
  2. Я хочу найти конкретную подругу узла X например .

Для сценария 1 Я: g.V(X).out(friend).toList(). Для сценария 2 я делаю: g.V(X).out(friend).hasId(5).next(). Оба этих обхода будут работать, но масштабируются плохо, так как X получает больше друзей. Могу ли я оптимизировать эту ситуацию, добавив дополнительную информацию на этикетку края? Например, если на границе между X и изменить метку freind_with_5 будет следующее быстрее:

`g.V(X).out(freind_with_5).next()` 

В моем понимании это будет быстрее, так как только один край будет пройдено. Тем не менее, если я сделаю такое изменение в своих меток, как бы найти всех друзей X?

ответ

1

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

Предпочтительный способ борьбы с этим - vertex-centric indices. Если вы денормализуете данные на своих краях, вы должны делать это с учетом этих показателей (а не путем кодирования этих данных в метку края). Поместите уникальный идентификатор для друга на край «друга» и проиндексируйте его.

Если ваши сверхновости особенно велики (миллионы + края), вы также должны рассмотреть функцию Titan's vertex partitioning.