Cypher — это декларативный язык запросов к графам, который позволяет выполнять эффективные запросы к данным в графе свойств.

Cypher был в значительной степени изобретением Андреса Тейлора во время работы в Neo4j, Inc. (ранее Neo Technology) в 2011 году. Первоначально Cypher предназначался для использования с графовой базой данных Neo4j, но был открыт в рамках проекта openCypher в октябре 2015 года.

Язык был разработан с учётом мощности и возможностей SQL (стандартного языка запросов для реляционной модели базы данных), но Cypher был основан на компонентах и потребностях базы данных, созданной на основе концепций теории графов. В графовой модели данные структурированы в виде узлов (называемых в математике и сетевых науках вершинами) и связей (рёбер в математике и сетевых науках), что позволяет сосредоточиться на том, как сущности данных связаны и соотносятся друг с другом.

Графовая модель Cypher основан на модели графа свойств, которая организует данные в узлы и рёбра (называемые «связями» в Cypher). В дополнение к стандартным элементам графа узлов и связей модель графа свойств добавляет метки и свойства для описания более тонких категорий и атрибутов данных.

Узлы — это сущности в графе. Они могут содержать любое количество атрибутов (пар ключ-значение), называемых свойствами. Узлы могут быть как не помечены ни одной меткой, так и быть помеченными любым количеством меток (например, тегами или категориями), отражающими их различные роли в домене. Отношения обеспечивают направленные, именованные, семантически значимые связи между двумя узловыми сущностями. Связь всегда имеет направление, начальный узел, конечный узел и ровно один тип связи. Как и узлы, отношения также могут иметь свойства.

Метки могут группировать похожие узлы, на которые могут быть назначены метки. Метки — это своего рода теги, которые позволяют указывать определённые типы сущностей для поиска или создания. Свойства представляют собой пары «ключ-значение» с привязкой строкового ключа к некоторому значению из системы типов Cypher. Запросы Cypher собираются с использованием шаблонов узлов и связей с любой заданной фильтрацией по меткам и свойствам для создания, чтения, обновления и удаления данных, найденных в указанном шаблоне.

Система типов Система типов данных Cypher включает в себя многие общие типы данных, используемые в других языках программирования и в языках запросов. Поддерживаемые типы данных включают скалярные типы данных, такие как логический, строковый, числовой, целый и число с плавающей запятой. Она также включает типы данных для работы со временем, такие как datetime, localdatetime, date, time, localtime и duration. Также доступны контейнерные типы данных для карт и списков, а также графовые типы данных для узлов, отношений и путей, а также тип void.

Синтаксис Язык запросов 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 используется перед описанием шаблона поиска для нахождения узлов, связей или комбинаций узлов и связей. WHERE в Cypher используется для добавления дополнительных ограничений к шаблонам и фильтрации ненужных шаблонов. RETURN в Cypher форматирует и организует вывод результатов. Как и в случае с другими языками запросов, вы можете возвращать результаты с определёнными свойствами, списками, упорядочением и т. д.

Используя ключевые слова с синтаксисом шаблона, показанным выше, пример запроса ниже будет искать шаблон узла (метка «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 movieCypher также содержит ключевые слова для указания условий записи, обновления и удаления данных. CREATE и DELETE используются для создания и удаления узлов и связей. SET и REMOVE используются для установки значений свойств и добавления/удаления меток к узлам. MERGE используется для создания уникальных узлов без дубликатов. Узлы можно удалить только в том случае, если у них нет никаких связей. Пример: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 прошло в Берлине одновременно с семинаром W3C по веб-стандартам для управления графовыми данными в марте 2019 года.

На этой встрече было достигнуто общее согласие относительно того, чтобы Cypher стал значимым вкладом в более масштабный проект по созданию международного стандартизированного языка графовых запросов под названием GQL. В сентябре 2019 года предложение о проекте стандарта GQL было одобрено голосованием национальных органов по стандартизации, являющихся членами Совместного технического комитета 1 ISO/IEC (ответственного за стандарты в области информационных технологий). В проектном предложении GQL указано следующее:

С 2024 года стандарт GQL был опубликован как стандартный язык графовых запросов в соответствии с ISO/IEC 39075:2024. Первая реализация подмножества языка с открытым исходным кодом уже доступна. Помимо реализации, можно также найти формализацию и синтаксис конкретного подмножества GQL.

См. также Neo4j, популярная графовая база данных для языка запросов Cypher Графовая база данных, предыстория, модели данных, компоненты и поставщики для этой категории баз данных SPARQL — стандартный декларативный язык запросов W3C для запроса графовых данных Gremlin, ещё один способ запроса графовых данных Язык графовых запросов , теоретический язык, абстрагирующийся от некоторых особенностей языков графовых запросов  — мультимодельная база данных на основе PostgreSQL, поддерживающая синтаксис Cypher

Источники

Категория:NoSQL Категория:Языки программирования, появившиеся в 2007 году Категория:Информационные языки Категория:Википедия:Страницы с непроверенными переводами