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