Поиск лучшей базы данных для вашего приложения или стека разработки — это больше, чем просто функции, масштабируемость и производительность. Хотя все это важно, есть еще один элемент графовой базы данных, который слишком многие архитекторы упускают из виду: язык запросов к базе данных.
Большинство реляционных баз данных (RDBMS) используют вариант SQL (язык структурированных запросов ), что делает SQL де-факто языком запросов к базе данных среди большинства профессионалов в области данных. Но с появлением графовых баз данных, которые более эффективны, чем реляционные базы данных , пришло время соответствующего перехода на более мощный язык запросов.
В этой серии блогов «Графические базы данных для начинающих» я познакомлю вас с основами графовой технологии, предполагая, что у вас мало (или нет) опыта в пространстве. В последние недели мы обсуждали, почему графы — это будущее , почему важны взаимосвязи данных , основы моделирования данных и как избежать наиболее распространенных (и фатальных) ошибок моделирования данных .
На этой неделе мы обсудим, почему язык запросов к базе данных имеет значение, даже если вы не разработчик.
Почему нам нужны языки запросов
До этого момента в нашей серии для начинающих все наши модели баз данных были в форме диаграмм, подобных приведенной ниже.
Графические диаграммы, подобные этой, идеально подходят для описания графической базы данных вне любого технологического контекста. Однако, когда дело доходит до фактического использования базы данных, каждому разработчику, архитектору и заинтересованным сторонам бизнеса нужен конкретный механизм для создания, обработки и запроса данных. То есть нам нужен язык запросов.
До сих пор язык запросов, используемый разработчиками и архитекторами данных (например, SQL), был слишком загадочным и эзотерическим, чтобы его могли понять лица, принимающие бизнес-решения. Но так же, как базы данных графов сделали процесс моделирования более понятным для непосвященных, так и язык запросов к базе данных графов облегчил обычному человеку понимание и создание собственных запросов.
Почему лингвистическая эффективность имеет значение
Если вы не технический специалист, вам может быть интересно, почему язык запросов к базе данных имеет значение вообще. В конце концов, если языки запросов являются чем-то похожим на естественные человеческие языки, то не должны ли они все в конечном итоге передать одну и ту же точку с несколькими отличиями в выражениях? Ответ и да, и нет.
Давайте рассмотрим пример на естественном языке. На английском вы можете сказать: «Я любил послеобеденный разговор», вспоминая свое детство. На испанском языке эта же фраза написана так: « Disfrutaba sobremesa. «Оба языка выражают одну и ту же идею, но гораздо эффективнее передать ее.
Когда дело доходит до языка запросов, лингвистика эффективности аналогична. Один запрос в SQL может быть на много строк длиннее, чем тот же запрос в языке запросов к базе данных графа, таком как Cypher . (Вот один прекрасный пример эффективного отображения с естественного языка на Cypher .)
Длинные запросы не только требуют больше времени для выполнения, но они также с большей вероятностью включают ошибки кодирования человеком из-за их сложности. Кроме того, более короткие запросы упрощают понимание и сопровождение в вашей команде разработчиков. Например, представьте, что если внешний разработчик должен был выполнить сложный запрос и попытаться выяснить намерения первоначального разработчика, проблема наверняка возникнет.
Но о каком уровне эффективности мы говорим между запросами SQL и графовыми запросами? Как гораздо более эффективным является один против другого? Ответ: достаточно быстро, чтобы существенно изменить ваш бизнес .
Эффективность графовых запросов означает, что они выполняются в режиме реального времени, а в экономике, которая работает со скоростью одного твита , это разница, которую вы не можете игнорировать.
Интимные отношения между моделированием и запросами
Прежде чем углубиться в механику языка запросов к базе данных графов, приведенного ниже, стоит отметить, что язык запросов — это не просто запрос (или запрос) базы данных для определенного набора результатов; это также о моделировании этих данных в первую очередь.
Из предыдущих сообщений мы знаем, что моделирование данных для графической базы данных так же просто, как соединение кругов и линий на доске. То, что вы рисуете на доске, — это то, что вы храните в базе данных.
Сама по себе такая простота моделирования имеет много преимуществ для бизнеса, наиболее очевидным из которых является то, что вы можете понять, что, черт возьми, создают ваши разработчики баз данных. Но это еще не все: интуитивно понятная модель, построенная на правильном языке запросов, гарантирует отсутствие несоответствия между тем, как вы построили данные, и тем, как вы их анализируете.
Язык запросов представляет свою модель тесно. Вот почему SQL — это все о таблицах и объединениях, а Cypher — об отношениях между сущностями. Как с моделью графа работать более естественно, так и с Сайфер, поскольку она заимствует из графического представления окружностей, связанных стрелками, которое может понять даже ребенок.
В реляционной базе данных процесс моделирования данных настолько абстрагирован от реальных повседневных SQL-запросов, что существует существенное несоответствие между анализом и реализацией. Другими словами, процесс построения модели реляционной базы данных не подходит для эффективного (и ответа) на вопросы из этой же модели.
С другой стороны, модели графовых баз данных не только сообщают, как связаны ваши данные, но и помогают вам четко определить, какие вопросы вы хотите задать в своей модели данных. Графовые модели и графовые запросы — это всего лишь две стороны одной медали.
Правильный язык запросов к базе данных помогает нам пересекать обе стороны.
Введение в Cypher, язык запросов к базе данных графов
Пришло время погрузиться в детали. В то время как большинство реляционных баз данных используют форму SQL в качестве языка запросов, мир графовых баз данных более разнообразен, поэтому мы рассмотрим конкретный язык запросов баз данных графов: Cypher.
Хотя в настоящее время специфично для Neo4j , близкое отношение Cypher к представлению графов в виде диаграмм делает его идеальным для описания графов. Cypher, пожалуй, самый простой в изучении язык запросов к графам, и как только вы поймете Cypher, станет очень легко переходить и изучать другие языки запросов к графам.
Это введение не является справочным документом для Cypher, а является просто обзором высокого уровня.
Cypher предназначен для легкого чтения и понимания разработчиками, специалистами по базам данных и заинтересованными сторонами. Его легко использовать, потому что он соответствует тому, как мы интуитивно описываем графики с помощью диаграмм.
Основное понятие Cypher заключается в том, что он позволяет запрашивать базу данных для поиска данных, которые соответствуют определенному шаблону. В разговорной речи мы могли бы попросить базу данных «найти такие вещи», и способ, которым мы описываем, как «такие вещи» выглядят, состоит в том, чтобы нарисовать их, используя искусство ASCII .
Рассмотрим простой рисунок на рисунке ниже.
Эта графическая диаграмма описывает трех общих друзей.
Если мы хотим выразить шаблон этого базового графа в Cypher, мы бы написали:
(emil)<-[:KNOWS]-(jim)-[:KNOWS]->(ian)-[:KNOWS]->(emil)
Это утверждение Cypher описывает путь, который образует треугольник, который соединяет узел, который мы называем jim
с двумя узлами, которые мы называем ian
и emil
, и который также соединяет ian
узел с emil
узлом. Как видите, Cypher, естественно, следует тому, как мы рисуем графики на доске.
Теперь, хотя этот шаблон Cypher описывает простую структуру графа, он еще не ссылается на какие-либо конкретные данные в базе данных. Чтобы связать шаблон с конкретными узлами и отношениями в существующем наборе данных, нам сначала нужно указать некоторые значения свойств и метки узлов, которые помогут найти соответствующие элементы в наборе данных.
Вот наш более конкретный запрос:
(emil:Person {name:'Emil'})
<-[:KNOWS]-(jim:Person {name:'Jim'})
-[:KNOWS]->(ian:Person {name:'Ian'})
-[:KNOWS]->(emil)
Здесь мы привязали каждый узел к его идентификатору, используя его свойство name и метку Person. Например, идентификатор emil связан с узлом в наборе данных с меткой Person и свойством name, значение которого равно Emil. Привязка частей шаблона к реальным данным является обычной практикой Cypher.
Руководство для начинающих по Cypher клаузулы
(Отказ от ответственности: этот раздел все еще предназначен для начинающих, но он определенно ориентирован на разработчиков. Если вам просто интересно узнать о языках запросов к базе данных в целом, перейдите к разделу «Другие языки запросов» ниже для хорошей подведения итогов.)
Как и большинство языков запросов, Cypher состоит из предложений.
Простейшие запросы состоят из предложения MATCH, за которым следует предложение RETURN. Вот пример запроса Cypher, который использует эти три предложения, чтобы найти общих друзей пользователя по имени Джим
MATCH (a:Person {name:'Jim'})-[:KNOWS]->(b)-[:KNOWS]->(c), (a)-[:KNOWS]->(c)
RETURN b, c
Давайте посмотрим на каждый пункт более подробно:
МАТЧ
Предложение MATCH
лежит в основе большинства запросов Cypher.
Используя символы ASCII для представления узлов и отношений, мы рисуем интересующие нас данные. Мы рисуем узлы с круглыми скобками, как в этих примерах из запроса выше:
(a:Person {name:'Jim'})
(b)
(c)
(a)
Проведем отношения , используя при помощи пары черточками с более чем или менее чем знаки ( -->
и <--
) , где <
и >
признаки указывают направление отношения. Между тире имена отношений заключаются в квадратные скобки и начинаются с префикса двоеточием, как в этом примере из запроса выше:
-[:KNOWS]->
Метки узла также имеют префикс двоеточия. Как видно из первого узла запроса, Person — это применимая метка.
(a:Person … )
Пары ключ-значение свойства узла (и отношения) затем указываются в фигурных скобках, как в этом примере:
( … {name:'Jim'})
В нашем первоначальном примере запрос, мы ищем узел меченый Person
с name
свойством, значение которого Jim
. Возвращаемое значение из этого поиска привязано к идентификатору a
. Этот идентификатор позволяет нам обращаться к узлу, который представляет Jim в остальной части запроса.
Стоит отметить, что этот шаблон
(a)-[:KNOWS]->(b)-[:KNOWS]->(c), (a)-[:KNOWS]->(c)
теоретически может происходить много раз в данных нашего графа, особенно в большом наборе пользователей.
Чтобы ограничить запрос, нам нужно привязать некоторую его часть к одному или нескольким местам на графике. Указывая, что мы ищем узел с именем Person, значением свойства имени которого является Jim, мы связали шаблон с конкретным узлом на графике — узлом, представляющим Jim.
Затем Cypher сопоставляет оставшуюся часть шаблона с графиком, непосредственно окружающим эту опорную точку, на основе предоставленной информации о связях и соседних узлах. При этом он обнаруживает узлы для привязки к другим идентификаторам. Хотя a всегда будет привязан к Jim, b и c будут связаны с последовательностью узлов при выполнении запроса.
ВОЗВРАЩЕНИЕ
В этом пункте указывается, какие выражения, отношения и свойства в сопоставленных данных должны быть возвращены клиенту. В нашем примере запроса мы заинтересованы в возвращении узлов, привязанных к идентификаторам b и c.
Другие статьи Cypher
Другие предложения, которые вы можете использовать в запросе Cypher:
ГДЕ |
Предоставляет критерии для фильтрации результатов сопоставления с образцом. |
СОЗДАЙТЕ И СОЗДАЙТЕ УНИКАЛЬНОЕ |
Создать узлы и отношения. |
MERGE |
Гарантирует, что предоставленный шаблон существует в графе, либо путем повторного использования существующих узлов и отношений, которые соответствуют предоставленным предикатам, либо путем создания новых узлов и отношений. |
УДАЛИТЬ / УДАЛИТЬ |
Удаляет узлы, отношения и свойства. |
УСТАНОВЛЕН |
Устанавливает значения свойств и метки. |
СОРТИРОВАТЬ ПО |
Сортирует результаты как часть ВОЗВРАТА. |
SKIP LIMIT |
Пропустить результаты вверху и ограничить количество результатов |
ДЛЯ КАЖДОГО |
Выполняет действие по обновлению для каждого элемента в списке. |
UNION |
Объединяет результаты двух или более запросов. |
С |
Последовательность последующих частей запроса и пересылка результатов от одного к другому. Аналогично командам конвейера в Unix. |
Если эти пункты выглядят знакомыми — особенно если вы являетесь разработчиком SQL — это здорово! Cypher предназначен для простых в освоении ветеранов SQL, а также для начинающих. ( Нажмите здесь, чтобы получить самую последнюю версию Cypher Refcard, чтобы глубже погрузиться в язык запросов Cypher.)
В то же время Cypher достаточно отличается, чтобы подчеркнуть, что мы имеем дело с графами, а не с реляционными множествами.
Другие языки запросов
Cypher не единственный язык запросов к графовой базе данных; другие графические базы данных также имеют свои собственные средства для запроса данных. Многие, включая Neo4j, поддерживают язык запросов RDF SPARQL и императивный язык запросов на основе путей Gremlin .
Вывод
Не каждый получает практический доступ к языку запросов к базе данных на повседневном уровне; тем не менее, ваша команда разработчиков, нуждающаяся в средствах массовой информации, нуждается в практическом способе моделирования и запроса данных, особенно если они решают проблему на основе графиков .
Если ваша команда имеет опыт работы с SQL, такой язык запросов, как Cypher, будет легко выучить и еще проще выполнить. И когда дело доходит до вашего приложения уровня предприятия, вы будете рады, что язык, лежащий в основе всего этого, создан для скорости и эффективности.
Примечание редактора: Это сообщение первоначально появилось в блоге Neo4j, написанном Брайсом Мерклом Сасаки .