Cypher (язык запросов)

Cypher
Класс языка язык графовых запросов и декларативный язык программирования
Лицензия GNU GPL 3[1]
Платформа Java Virtual Machine

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].

См. также

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

Источники

  1. GitHub (англ.) — 2007.
  2. Cypher Introduction. Neo4j. Дата обращения: 8 ноября 2019. Архивировано 11 ноября 2019 года.
  3. Cypher: An Evolving Query Language for Property Graphs (англ.). Proceedings of the 2018 International Conference on Management of Data. ACM. Дата обращения: 27 июня 2018. Архивировано 27 июня 2018 года.
  4. Meet openCypher: The SQL for Graphs - Neo4j Graph Database. Neo4j Graph Database (англ.). 21 октября 2015. Архивировано 15 октября 2019. Дата обращения: 8 ноября 2019.
  5. Property Graph Model (англ.). GitHub. Дата обращения: 8 ноября 2019. Архивировано 25 сентября 2021 года.
  6. Cypher Type System (англ.). GitHub. Дата обращения: 8 ноября 2019. Архивировано 27 ноября 2021 года.
  7. Cypher manual - MATCH clause (англ.). Neo4j. Дата обращения: 8 ноября 2019. Архивировано 11 ноября 2019 года.
  8. Cypher manual - WHERE clause (англ.). Neo4j. Дата обращения: 8 ноября 2019. Архивировано 11 ноября 2019 года.
  9. Cypher manual - RETURN clause (англ.). Neo4j. Дата обращения: 8 ноября 2019. Архивировано 11 ноября 2019 года.
  10. Cypher manual clauses (англ.). Neo4j. Дата обращения: 8 ноября 2019. Архивировано 11 ноября 2019 года.
  11. Events · openCypher (англ.). Дата обращения: 21 ноября 2024. Архивировано 5 декабря 2024 года.
  12. W3C Workshop on Web Standardization for Graph Data. Creating Bridges: RDF, Property Graph and SQL (англ.). W3C. Дата обращения: 29 сентября 2019. Архивировано 5 октября 2023 года.
  13. ISO/IEC WD 39075 Information Technology — Database Languages — GQL (англ.). ISO. Дата обращения: 29 сентября 2019. Архивировано 20 февраля 2022 года.
  14. ISO/IEC JTC 1/SC 32 N 3007 - ISO/IEC NP 39075 Information Technology -- Database Languages -- GQL (англ.). British Standards Institute. Дата обращения: 29 сентября 2019. Архивировано 5 октября 2023 года.
  15. GQL Parser (англ.). GitHub. Дата обращения: 18 января 2021. Архивировано 12 сентября 2021 года.
  16. First GQL research implementation from Olof Morra at TU Eindhoven! Alastair Green. Дата обращения: 18 января 2021. Архивировано 18 января 2022 года.
  17. A Semantics of GQL; a New Query Language for Property Graphs Formalized (англ.). Olof Morra. Дата обращения: 18 января 2021. Архивировано 18 января 2022 года.
  18. AgensGraph (англ.).