запросы olap и oltp в gremlin

#titan #gremlin #tinkerpop

#titan #gremlin #tinkerpop

Вопрос:

В gremlin,

  1. s = graph.traversal()

  2. g = graph.traversal(computer())

я знаю, что первый предназначен для OLTP, а второй — для OLAP. Я знаю разницу между OLAP и OLTP на уровне определения.У меня есть следующие запросы по этому поводу:

Как

  1. вышеуказанные запросы отличаются в работе?
  2. Могу ли я использовать второй, используя ‘g’ в запросах в моем приложении для получения результатов (я знаю, что этот ‘g’ дает результаты быстрее, чем первый)?
  3. Разница между OLAP и OLTP с примером?

Заранее спасибо.

Ответ №1:

С точки зрения пользователя, с точки зрения результатов, нет реальной разницы между OLAP и OLTP. Инструкции Gremlin такие же, за исключением конфигурации TraversalSource , как вы показали при использовании withComputer() и других настройках.

Разница больше в том, как обход выполняется за кулисами. Обходы на основе OLAP предназначены для обработки «всего графа» (т. Е. Всех вершин / ребер и, возможно, более одного раза). Где обходы на основе OLTP предназначены для обработки меньших массивов данных, обычно начиная с одной или нескольких вершин и проходя оттуда. Когда вы рассматриваете графики в масштабе «миллиардов ребер», легко понять, почему для обработки таких графиков необходим эффективный механизм, подобный OLAP.

Вы действительно не должны думать о OLTP против OLAP как о «более быстром» и «более медленном». Вероятно, лучше думать об этом так, как это описано в документации:

  • OLTP: в режиме реального времени, ограниченный доступ к данным, произвольный доступ к данным, последовательная обработка, запросы
  • OLAP: длительный запуск, доступ ко всему набору данных, последовательный доступ к данным, параллельная обработка, пакетная обработка

Нет причин, по которым вы не можете использовать обход OLAP в своих приложениях, если ваше приложение осведомлено о требованиях этого обхода. Если у вас есть какое-либо соглашение об уровне обслуживания, в котором указано, что запросы REST должны выполняться менее чем за 0,5 секунды, и вы решите использовать обход OLAP для получения ответа, вы, несомненно, нарушите свое соглашение об уровне обслуживания. Предполагая, что вы выполняете задание обхода OLAP через Spark, Spark потребуется 10-15 секунд, чтобы организовать выполнение вашего задания.

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

 g.V().has('username','stephenm').out('knows').values('age').mean()
  

но что, если я хочу узнать средний возраст каждого пользователя в моей базе данных? В этом случае у меня нет никакого индекса, который я мог бы использовать для поиска «небольшого набора начальных вершин» — я должен обработать все миллионы / миллиарды вершин в моем графике. Это идеальный вариант использования для OLAP:

 g.V().hasLabel('user').values('age').mean()
  

OLAP также отлично подходит для понимания роста вашего графика и для поддержания вашего графика. С миллиардами ребер и высокой скоростью приема данных не знать, что ваш график растет неправильно, — это смертный приговор. Полезно использовать OLAP для сбора глобальной статистики по всем данным на графике:

 g.E().label().groupCount()
g.V().label().groupCount()
  

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