Понимание прохождения Титана

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

Пример графика

Сейчас у меня следующие ситуации:

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

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

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

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


person Filipe Teixeira    schedule 04.02.2016    source источник


Ответы (1)


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

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

Если ваши суперузлы особенно велики (миллионы+ ребер), вам также следует рассмотреть Titan. функция разделения вершин.

person stephen mallette    schedule 04.02.2016