2019-10-30 20:53:44 +00:00
---
2019-11-14 13:21:25 +00:00
filename: LearnCypher-ua.cql
2019-10-30 20:53:44 +00:00
contributors:
- ["Théo Gauchoux", "https://github.com/TheoGauchoux"]
translators:
- ["AstiaSun", "https://github.com/AstiaSun"]
---
2019-10-31 20:16:50 +00:00
Cypher - це мова запитів Neo4j для спрощення роботи з графами. Вона повторює синтаксис SQL та перемішує його з таким с о б і ascii стилем для відображення структури графа.
2019-10-30 20:53:44 +00:00
Цей навчальний матеріал передбачає, що ви вже знайомі із концепцією графів, зобрема що таке вершини та зв'язки між ними.
[Деталі тут ](https://neo4j.com/developer/cypher-query-language/ )
2024-04-26 09:13:48 +00:00
## Вершини
2019-10-30 20:53:44 +00:00
2024-04-26 09:13:48 +00:00
#### Відображує запис у графі
2019-10-30 20:53:44 +00:00
`()`
Таким чином у запиті позначається пуста *вершина* . Використовується зазвичай для того, щоб позначити, що вона є, проте це не так вже й важливо для запиту.
`(n)`
2019-10-31 20:16:50 +00:00
Це вершина, яка має назву **n** , до неї можна повторно звертатись у запиті. Звернення до вершини **n** починається з нижнього підкреслення та використовує camelCase (верблюжий регіст).
2019-10-30 20:53:44 +00:00
`(p:Person)`
2019-10-31 20:16:50 +00:00
Можна також додати *ярлик* до вершини, в данному випадку - **Person** . Це як тип / клас / категорія. Назва *ярлика* починається з великої літери та використовує верблюжу нотацію.
2019-10-30 20:53:44 +00:00
`(p:Person:Manager)`
Вершина може мати кілька *ярликів* .
`(p:Person {name : 'Théo Gauchoux', age : 22})`
2019-10-31 20:16:50 +00:00
Вершина також може мати різні *властивості* , в данному випадку - **name** та **age** . Також мають починатися з великої літери та використовувати верблюжу нотацію.
2019-10-30 20:53:44 +00:00
2019-10-31 20:16:50 +00:00
Наступні типи дозволяється використовувати у властивостях:
2019-10-30 20:53:44 +00:00
2024-04-26 09:13:48 +00:00
- Чиселиний
- Булевий
- Рядок
- Списки попередніх примітивних типів
2019-10-30 20:53:44 +00:00
*Увага! В Cypher не існує типу, що відображає час. Замість нього можна використовувати рядок із визначеним шаблоном а б о чисельне відображення певної дати.*
`p.name`
З а допомогою крапки можна звернутись до властивості вершини.
2024-04-26 09:13:48 +00:00
## Зв'язки (а б о р е б р а )
#### Сполучають дві вершини
2019-10-30 20:53:44 +00:00
`[:KNOWS]`
Це *зв'язок* з *ярликом* **KNOWS** . Це такий же самий *ярлик* як і у вершини. Починається з великої літери та використовує ВЕРХНІЙ\_Р Е ГІ С Т Р \_І З \_З М І ЇН О Ю\_Н О Т А ЦІ ЄЮ.
`[k:KNOWS]`
2024-04-26 09:13:48 +00:00
Це той же самий *зв'язок* , до якого можна звертатись через змінну **k** . Можна подалі використовувати у запиті, хоч це і не обов'язково.
2019-10-30 20:53:44 +00:00
`[k:KNOWS {since:2017}]`
2019-10-31 20:16:50 +00:00
Той же *зв'язок* , але вже із *властивостями* (як у *вершини* ), в данному випадку властивість - це **since** .
2019-10-30 20:53:44 +00:00
`[k:KNOWS*..4]`
2019-10-31 20:16:50 +00:00
Це структурна інформація, яку використовують *шляхи* , які розглянуті нижче. В данному випадку, ** \*..4** говорить: "Сумістити шаблон із зв'язком **k** , що повторюватиметься від одного до чотирьох разів."
2019-10-30 20:53:44 +00:00
2024-04-26 09:13:48 +00:00
## Шляхи
#### Спосіб поєднувати вершини та зв'язки.
2019-10-30 20:53:44 +00:00
`(a:Person)-[:KNOWS]-(b:Person)`
Шлях описує, що вершини **a** та **b** знають (knows) один одного.
`(a:Person)-[:MANAGES]->(b:Person)`
Шлях може бути направленим. Цей описує, що **а ** є менеджером **b** .
`(a:Person)-[:KNOWS]-(b:Person)-[:KNOWS]-(c:Person)`
Можна створювати ланцюги зі зв'язків. Цей шлях описує друга друга (**a** знає **b** , який в свою чергу знає **c** ).
`(a:Person)-[:MANAGES]->(b:Person)-[:MANAGES]->(c:Person)`
Ланцюг, аналогічно, також може бути направленим. Шлях описує, що **a** - б о с **b** і супер б о с для **c** .
2019-10-31 20:16:50 +00:00
Шаблони, які часто використовуються (з документації Neo4j):
2019-10-30 20:53:44 +00:00
2024-04-26 09:13:48 +00:00
```cypher
// Друг-мого-друга
2019-10-30 20:53:44 +00:00
(user)-[:KNOWS]-(friend)-[:KNOWS]-(foaf)
// Найкоротший шлях
path = shortestPath( (user)-[:KNOWS*..5]-(other) )
// Спільна фільтрація
(user)-[:PURCHASED]->(product)< - [ :PURCHASED ] - ( ) - [ :PURCHASED ] - > (otherProduct)
// Навігація по дереву
(root)< - [ :PARENT * ] - ( leaf:Category ) - [ :ITEM ] - > (data:Product)
```
2024-04-26 09:13:48 +00:00
## Запити на створення
2019-10-30 20:53:44 +00:00
Створити нову вершину:
2024-04-06 15:33:50 +00:00
2024-04-26 09:13:48 +00:00
```cypher
2019-10-30 20:53:44 +00:00
CREATE (a:Person {name:"Théo Gauchoux"})
RETURN a
```
2024-04-06 15:33:50 +00:00
2019-10-30 20:53:44 +00:00
*`RETURN` дозволяє повернути результат після виконання запиту. Можна повертати кілька значень, наприклад, `RETURN a, b` .*
Створити новий зв'язок (із двома вершинами):
2024-04-06 15:33:50 +00:00
2024-04-26 09:13:48 +00:00
```cypher
2019-10-30 20:53:44 +00:00
CREATE (a:Person)-[k:KNOWS]-(b:Person)
RETURN a,k,b
```
2024-04-26 09:13:48 +00:00
## Запити на знаходження
2019-10-30 20:53:44 +00:00
Знайти всі вершини:
2024-04-06 15:33:50 +00:00
2024-04-26 09:13:48 +00:00
```cypher
2019-10-30 20:53:44 +00:00
MATCH (n)
RETURN n
```
Знайти вершини за ярликом:
2024-04-06 15:33:50 +00:00
2024-04-26 09:13:48 +00:00
```cypher
2019-10-30 20:53:44 +00:00
MATCH (a:Person)
RETURN a
```
2019-10-31 20:16:50 +00:00
Знайти вершини за ярликом та властивістю:
2024-04-06 15:33:50 +00:00
2024-04-26 09:13:48 +00:00
```cypher
2019-10-30 20:53:44 +00:00
MATCH (a:Person {name:"Théo Gauchoux"})
RETURN a
```
2019-10-31 20:16:50 +00:00
Знайти вершини відповідно до зв'язків (ненаправлених):
2024-04-06 15:33:50 +00:00
2024-04-26 09:13:48 +00:00
```cypher
2019-10-30 20:53:44 +00:00
MATCH (a)-[:KNOWS]-(b)
RETURN a,b
```
2019-10-31 20:16:50 +00:00
Знайти вершини відповідно до зв'язків (направлених):
2024-04-06 15:33:50 +00:00
2024-04-26 09:13:48 +00:00
```cypher
2019-10-30 20:53:44 +00:00
MATCH (a)-[:MANAGES]->(b)
RETURN a,b
```
2019-10-31 20:16:50 +00:00
Знайти вершини за допомогою `WHERE` :
2024-04-06 15:33:50 +00:00
2024-04-26 09:13:48 +00:00
```cypher
2019-10-30 20:53:44 +00:00
MATCH (p:Person {name:"Théo Gauchoux"})-[s:LIVES_IN]->(city:City)
WHERE s.since = 2015
RETURN p,state
```
Можна використовувати вираз `MATCH WHERE` разом із операцією `CREATE` :
2024-04-06 15:33:50 +00:00
2024-04-26 09:13:48 +00:00
```cypher
2019-10-30 20:53:44 +00:00
MATCH (a), (b)
WHERE a.name = "Jacquie" AND b.name = "Michel"
CREATE (a)-[:KNOWS]-(b)
```
2024-04-26 09:13:48 +00:00
## Запити на оновлення
2019-10-30 20:53:44 +00:00
Оновити окрему властивість вершини:
2024-04-06 15:33:50 +00:00
2024-04-26 09:13:48 +00:00
```cypher
2019-10-30 20:53:44 +00:00
MATCH (p:Person)
WHERE p.name = "Théo Gauchoux"
SET p.age = 23
```
Оновити всі властивості вершини:
2024-04-06 15:33:50 +00:00
2024-04-26 09:13:48 +00:00
```cypher
2019-10-30 20:53:44 +00:00
MATCH (p:Person)
WHERE p.name = "Théo Gauchoux"
SET p = {name: "Michel", age: 23}
```
2019-10-31 20:16:50 +00:00
Додати нову вла с тиві cть до вершини:
2024-04-06 15:33:50 +00:00
2024-04-26 09:13:48 +00:00
```cypher
2019-10-30 20:53:44 +00:00
MATCH (p:Person)
WHERE p.name = "Théo Gauchoux"
SET p + = {studies: "IT Engineering"}
```
Повісити ярлик на вершину:
2024-04-06 15:33:50 +00:00
2024-04-26 09:13:48 +00:00
```cypher
2019-10-30 20:53:44 +00:00
MATCH (p:Person)
WHERE p.name = "Théo Gauchoux"
SET p:Internship
```
2024-04-26 09:13:48 +00:00
## Запити на видалення
2019-10-30 20:53:44 +00:00
2019-10-31 20:16:50 +00:00
Видалити окрему вершину (пов'язані р е б р а повинні бути видалені перед цим):
2024-04-06 15:33:50 +00:00
2024-04-26 09:13:48 +00:00
```cypher
2019-10-30 20:53:44 +00:00
MATCH (p:Person)-[relationship]-()
WHERE p.name = "Théo Gauchoux"
DELETE relationship, p
```
Видалити властивість певної вершини:
2024-04-06 15:33:50 +00:00
2024-04-26 09:13:48 +00:00
```cypher
2019-10-30 20:53:44 +00:00
MATCH (p:Person)
WHERE p.name = "Théo Gauchoux"
REMOVE p.age
```
*Зверніть увагу, що ключове слово `REMOVE` це не те саме, що й `DELETE` !*
2024-04-26 09:13:48 +00:00
Видалити ярлик певної вершини:
2024-04-06 15:33:50 +00:00
2024-04-26 09:13:48 +00:00
```cypher
2019-10-30 20:53:44 +00:00
MATCH (p:Person)
WHERE p.name = "Théo Gauchoux"
DELETE p:Person
```
2024-04-26 09:13:48 +00:00
Видалити всю базу даних:
2024-04-06 15:33:50 +00:00
2024-04-26 09:13:48 +00:00
```cypher
2019-10-30 20:53:44 +00:00
MATCH (n)
OPTIONAL MATCH (n)-[r]-()
DELETE n, r
```
*Так, це `rm -rf /` на мові Cypher !*
2024-04-26 09:13:48 +00:00
## Інші корисні запити
2019-10-30 20:53:44 +00:00
`PROFILE`
Перед виконанням, показати план виконання запитів.
`COUNT(e)`
Порахувати елементи (вершини та зв'язки), що відповідають **e** .
`LIMIT x`
Обмежити результат до x перших результатів.
2024-04-26 09:13:48 +00:00
## Особливі підказки
2019-10-30 20:53:44 +00:00
2024-04-26 09:13:48 +00:00
- У мові Cypher існують лише однорядкові коментарі, що позначаються двійним слешем : `// Коментар`
2019-10-30 20:53:44 +00:00
- Можна виконати скрипт Cypher, збережений у файлі ** .cql** прямо в Neo4j (прямо як імпорт). Проте, не можна мати мати кілька виразів в цьому файлі (розділених ** ;**).
2019-10-31 20:16:50 +00:00
- Використовуйте командний рядок Neo4j для написання запитів Cypher, це легко і швидко.
2019-10-30 20:53:44 +00:00
- Cypher планує бути стандартною мовою запитів для всіх графових баз даних (більш відома як **OpenCypher** ).