Neo4jのCypher入門：グラフデータベースを7ステップで操作しよう

## はじめに
こんにちは！今回は、グラフデータベースの代表格であるNeo4jで使用されるクエリ言語、Cypherの基本を学んでいきます。RDBMSに慣れた方でも簡単に理解できる、7つのステップで基本的な操作方法をマスターしましょう。

Neo4jは、データをノードとそれらの関係性で表現するグラフデータベースです。以下の図は、Neo4jの基本的な構造を表しています：

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2648069/0f8b3c10-f3bc-dcef-db78-827bc6d8f9d6.png)


この図では、「Person」と「Company」という2つのノードが「WORKS_AT」という関係で結ばれています。これは、ある人がある会社で働いているという情報を表現しています。
Cypherは、このようなグラフ構造を簡単に操作するためのクエリ言語です。本記事では、Cypherを使ってこのようなデータ構造を作成し、検索する方法を学んでいきます。

## 目次
1. Cypherとは何か？
2. ノードの作成と検索
3. リレーションシップの作成
4. パターンマッチング
5. フィルタリングと並べ替え
6. 集計関数の使用
7. 応用：複雑なクエリの作成

## 1. Cypherとは何か？

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2648069/7d43cce6-15c1-17f6-ed7a-76de7a8cf484.png)

Cypherは、Neo4jグラフデータベース用に設計された宣言型クエリ言語です。SQLに似た構文を持ちながら、グラフデータの操作に特化しています。

主な特徴：
- ノードとリレーションシップを中心とした直感的な構文
- パターンマッチングによる効率的なデータ検索
- 視覚的に理解しやすいクエリ構造

## 2. ノードの作成と検索

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2648069/631230c0-431f-c559-ac34-5f76606146e2.png)

### ノードの作成
```cypher
CREATE (p:Person {name: "John Doe", age: 30})
```

### ノードの検索
```cypher
MATCH (p:Person)
WHERE p.name = "John Doe"
RETURN p
```

## 3. リレーションシップの作成

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2648069/c9e800a7-5072-fcdf-2abf-a5d650ac1be3.png)

```cypher
MATCH (a:Person {name: "John Doe"}), (b:Person {name: "Jane Smith"})
CREATE (a)-[r:KNOWS]->(b)
RETURN a, b, r
```

## 4. パターンマッチング

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2648069/e2e6dbb8-a7d8-e073-c6b8-b010590c22f1.png)

```cypher
MATCH (a:Person)-[:KNOWS]->(b:Person)
RETURN a.name, b.name
```

## 5. フィルタリングと並べ替え

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2648069/fba21520-a733-37a4-9784-dd1b078c3e56.png)

```cypher
MATCH (p:Person)
WHERE p.age > 25
RETURN p.name, p.age
ORDER BY p.age DESC
```

## 6. 集計関数の使用

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2648069/b197c6d6-6ab0-8c48-a84a-a13d9bd62a02.png)

```cypher
MATCH (p:Person)
RETURN AVG(p.age) as average_age, COUNT(p) as total_people
```

## 7. 応用：複雑なクエリの作成

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2648069/2ade88da-466c-8e3a-552f-92490b36fa5e.png)


```cypher
MATCH (p:Person)-[:WORKS_AT]->(c:Company)
WHERE c.industry = "Tech"
WITH p, COUNT(c) as company_count
WHERE company_count > 1
RETURN p.name, company_count
ORDER BY company_count DESC
LIMIT 5
```

以上の7ステップを通じて、Cypherの基本的な使い方を学びました。グラフデータベースの強力な機能を活用し、複雑なデータ関係を簡単に操作できることがお分かりいただけたでしょうか。

Neo4jとCypherを使いこなすことで、従来のリレーショナルデータベースでは難しかったような、複雑な関係性を持つデータの管理や分析が可能になります。ぜひ実際に手を動かして、Cypherの魅力を体験してみてください！

# 参考情報

この記事を作成するにあたり、以下の資料を参考にしました。より深い学習や最新の情報を得たい方は、これらのリソースをご覧ください。

## 公式ドキュメント

- [Neo4j公式ドキュメント](https://neo4j.com/docs/)
  - Neo4jとCypherに関する最も信頼できる情報源です。
- [Cypher Manual](https://neo4j.com/docs/cypher-manual/current/)
  - Cypherの詳細な文法や機能について学べます。

## チュートリアルとガイド

- [Neo4j GraphAcademy](https://graphacademy.neo4j.com/)
  - 無料のオンラインコースで、体系的にNeo4jとCypherを学べます。
- [Neo4j Sandbox](https://sandbox.neo4j.com/)
  - ブラウザ上でNeo4jを試せる環境です。実際に手を動かしながら学習できます。

これらの資料を活用することで、Neo4jとCypherについてより深い理解を得ることができるでしょう。グラフデータベースの世界を探索し、その可能性を最大限に引き出してください！