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