У этого термина существуют и другие значения, см.
Cypher.
Cypher — это декларативный язык запросов к графам, который позволяет выполнять эффективные запросы к данным в графе свойств[2].
Cypher был в значительной степени изобретением Андреса Тейлора во время работы в Neo4j, Inc. (ранее Neo Technology) в 2011 году[3]. Первоначально Cypher предназначался для использования с графовой базой данных Neo4j, но был открыт в рамках проекта openCypher в октябре 2015 года[4].
Язык был разработан с учётом мощности и возможностей SQL (стандартного языка запросов для реляционной модели базы данных), но Cypher был основан на компонентах и потребностях базы данных, созданной на основе концепций теории графов. В графовой модели данные структурированы в виде узлов (называемых в математике и сетевых науках вершинами) и связей (рёбер в математике и сетевых науках), что позволяет сосредоточиться на том, как сущности данных связаны и соотносятся друг с другом.
Графовая модель
Cypher основан на модели графа свойств, которая организует данные в узлы и рёбра (называемые «связями» в Cypher). В дополнение к стандартным элементам графа узлов и связей модель графа свойств добавляет метки и свойства для описания более тонких категорий и атрибутов данных.
Узлы — это сущности в графе. Они могут содержать любое количество атрибутов (пар ключ-значение), называемых свойствами. Узлы могут быть как не помечены ни одной меткой, так и быть помеченными любым количеством меток (например, тегами или категориями), отражающими их различные роли в домене. Отношения обеспечивают направленные, именованные, семантически значимые связи между двумя узловыми сущностями. Связь всегда имеет направление, начальный узел, конечный узел и ровно один тип связи. Как и узлы, отношения также могут иметь свойства[5].
Метки могут группировать похожие узлы, на которые могут быть назначены метки. Метки — это своего рода теги, которые позволяют указывать определённые типы сущностей для поиска или создания. Свойства представляют собой пары «ключ-значение» с привязкой строкового ключа к некоторому значению из системы типов Cypher. Запросы Cypher собираются с использованием шаблонов узлов и связей с любой заданной фильтрацией по меткам и свойствам для создания, чтения, обновления и удаления данных, найденных в указанном шаблоне.
Система типов
Система типов данных Cypher включает в себя многие общие типы данных, используемые в других языках программирования и в языках запросов. Поддерживаемые типы данных включают скалярные типы данных, такие как логический, строковый, числовой, целый и число с плавающей запятой. Она также включает типы данных для работы со временем, такие как datetime
, localdatetime
, date, time, localtime и duration. Также доступны контейнерные типы данных для карт и списков, а также графовые типы данных для узлов, отношений и путей, а также тип void[6].
Синтаксис
Язык запросов Cypher отображает наборы узлов и связей и фильтрует эти наборы на основе меток и свойств. Синтаксис Cypher основан на ASCII-графике — текстовом визуальном искусстве для компьютеров. Это делает язык очень наглядным и легким для чтения, поскольку он визуально и структурно представляет данные, указанные в запросе. Например, узлы представлены с помощью скобок вокруг атрибутов и информации, касающейся сущности. Связи изображаются стрелкой (направленной или ненаправленной), а тип связи указывается в скобках.
//node
(variable:Label {propertyKey: 'propertyValue'})
//relationship
-[variable:RELATIONSHIP_TYPE]->
//Cypher pattern
(node1:LabelA)-[rel1:RELATIONSHIP_TYPE]->(node2:LabelB)
Ключевые слова
Подобно другим языкам запросов, Cypher содержит множество ключевых слов для указания шаблонов, фильтрации шаблонов и возврата результатов. Среди наиболее распространенных: MATCH, WHERE и RETURN. Они работают немного иначе, чем SELECT и WHERE в SQL; однако имеют схожие цели.
MATCH используется перед описанием шаблона поиска для нахождения узлов, связей или комбинаций узлов и связей.[7] WHERE в Cypher используется для добавления дополнительных ограничений к шаблонам и фильтрации ненужных шаблонов[8]. RETURN в Cypher форматирует и организует вывод результатов. Как и в случае с другими языками запросов, вы можете возвращать результаты с определёнными свойствами, списками, упорядочением и т. д.[9]
Используя ключевые слова с синтаксисом шаблона, показанным выше, пример запроса ниже будет искать шаблон узла (метка «Actor» и свойство с именем «name» со значением «Nicole Kidman»), связанного отношением (тип «ACTED_IN» и исходящее направление от первого узла) с другим узлом (метка «Movie»). Затем предложение WHERE фильтрует, чтобы оставить только те шаблоны, в которых узел Movie в предложении match имеет свойство year, которое меньше значения переданного параметра. В ответе запрос указывает на необходимость вывода узлов фильмов, соответствующих шаблону, и фильтрации по условиям match и where.
MATCH (nicole:Actor {name: 'Nicole Kidman'})-[:ACTED_IN]->(movie:Movie)
WHERE movie.year < $yearParameter
RETURN movie
Cypher также содержит ключевые слова для указания условий записи, обновления и удаления данных. CREATE и DELETE используются для создания и удаления узлов и связей. SET и REMOVE используются для установки значений свойств и добавления/удаления меток к узлам. MERGE используется для создания уникальных узлов без дубликатов. Узлы можно удалить только в том случае, если у них нет никаких связей. Пример[10]:
MATCH (startContent:Content)-[relationship:IS_RELATED_TO]->(endContent:Content)
WHERE endContent.source = 'user'
OPTIONAL MATCH (endContent)-[r]-()
DELETE relationship, endContent
Стандартизация
С проектом openCypher начались усилия по стандартизации Cypher как языка запросов для обработки графов. В рамках этого процесса было проведено пять очных встреч разработчиков openCypher. Первая встреча состоялась в феврале 2017 года в штаб-квартире SAP в Вальдорфе (Германия) и совпала с заседанием Совета по сравнительному анализу связанных данных. Ещё одно мероприятие разработчиков openCypher прошло в Берлине[11] одновременно с семинаром W3C по веб-стандартам для управления графовыми данными в марте 2019 года[12].
На этой встрече было достигнуто общее согласие относительно того, чтобы Cypher стал значимым вкладом в более масштабный проект по созданию международного стандартизированного языка графовых запросов под названием GQL. В сентябре 2019 года предложение о проекте стандарта GQL было одобрено голосованием национальных органов по стандартизации, являющихся членами Совместного технического комитета 1 ISO/IEC (ответственного за стандарты в области информационных технологий)[13]. В проектном предложении GQL указано следующее:
Использование графа в качестве фундаментального представления для моделирования данных является новым подходом в управлении данными. В этом подходе набор данных моделируется как граф, представляющий каждую сущность данных как вершину (также называемую узлом) графа, а каждую связь между двумя сущностями как ребро между соответствующими вершинами. Графовая модель данных привлекает внимание своими уникальными преимуществами.
Во-первых, графовая модель может быть естественным образом подходящей для наборов данных, которые имеют иерархическую, сложную или даже произвольную структуру. Такие структуры можно легко закодировать в графовой модели как рёбра. Это может быть удобнее, чем реляционная модель, которая требует нормализации набора данных в набор таблиц с фиксированными типами строк.
Во-вторых, графовая модель обеспечивает эффективное выполнение дорогостоящих запросов или аналитических функций данных, которые должны учитывать многоступенчатые взаимосвязи между сущностями данных, такими как запросы достижимости[англ.], запросы кратчайшего или самого дешёвого пути или поиск центральности. В настоящее время используются две графовые модели: модель Resource Description Framework (RDF) и модель Property graph[англ.]. Модель RDF была стандартизирована W3C в ряде спецификаций. Модель Property Graph, с другой стороны, имеет множество реализаций в графовых базах данных, графовых алгоритмах и средствах обработки графов. Однако общий стандартизированный язык запросов для свойств графов (например, SQL для реляционных баз данных) отсутствует. Для заполнения этого пробела предлагается использовать GQL.[14]
С 2024 года стандарт GQL был опубликован как стандартный язык графовых запросов в соответствии с ISO/IEC 39075:2024. Первая реализация подмножества языка с открытым исходным кодом уже доступна[15][16]. Помимо реализации, можно также найти формализацию и синтаксис конкретного подмножества GQL[17].
См. также
Источники