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

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

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

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

  1. Я хочу найти всех друзей узла X
  2. Я хочу найти конкретного друга узла 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.

Другие вопросы по тегам