Cypher (язык запросов) (Cypher (x[dt [ghjkvkf))

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