1. 初めに
MYJLab Advent Calendar 2024 の8日目の担当するM1の浦です。
最近は就活に追われており、記事を絶望しながら書いております、、、
この記事では、グラフデータベースのNeo4jを初めて触れる方向けに、基本的な概念からセットアップ方法、簡単なクエリの実行までを解説しようと思います。
2. グラフデータベースとは?
グラフデータベースとは、頂点(vertex)と辺(edge)から構成されるデータ構造を備えたデータベースのこと。従来のリレーショナルデータベースとは異なり、データ同士の繋がりを表現するグラフ構造に基づいてデータを格納する。これにより、ネットワーク状のデータ構造を効率的に格納・検索することが可能。
主要概念
- ノード(Node): データのエンティティやオブジェクトを表す
- エッジ(Edge): ノード間の関係を表し、方向性を持つことがある
- プロパティ(Property): ノードやエッジに付加される属性情報
特徴
- 柔軟性: グラフモデルのスキーマと構造はグラフ構造を事前に定義する必要がなく、既存のグラフ構造を追加・変更しても、既存の機能に影響を与えることなく運用できる
- 高速なパフォーマンス: リレーショナルデータベースではリレーションシップが増えるとパフォーマンスが低下する一方、グラフデータベースではリレーションシップの量が増えてもパフォーマンスは一定を保つ。データ間のリレーションシップは永続的にデータベース内に保存されているため、クエリ結果を高速に取得できる
3. Neo4jのデスクトップ版のDBMSの作成方法について
デスクトップ版でのセットアップ方法について記載する。
-
公式サイトからNeo4j Desktopをダウンロード
-
インストール後、アプリを起動してCreate projectでプロジェクトの作成。Neo4jでは扱いたいDBMSをProjectで紐付ける
-
最後に別ウィンドドウが立ち上がったら完了。この画面ではCypher言語を用いてこのDBMSを操作することができ、その結果をグラフィカルに見ることができる
4. 基本的なCypherクエリの書き方とその結果
画面
Neo4jでは、Cypherという独自のクエリ言語を使用します。以下の基本構文を覚えよう。
4.1 ノードの作成
CREATE (a:Person {name: 'Alice', age: 30})
CREATE (b:Person {name: 'Bob', age: 35});
4.2 現在のデータベース全体の可視化
MATCH(n)OPTIONAL MATCH(n)-[r]-()RETURN n,r
4.3 リレーションシップの作成
MATCH (a:Person {name: 'Alice'}), (b:Person {name: 'Bob'})
CREATE (a)-[:FRIEND]->(b);
このままではノードの関係がないのでリレーションシップを作成する。AliceからBobへのFREINDの関係が作成される。
4.4 データベース中の全データ削除
MATCH(n)OPTIONAL MATCH(n)-[r]-()DELETE n,r
MATCH(n)OPTIONAL MATCH(n)-[r]-()RETURN n,r
5. サンプルデータを用いたクエリ
Neo4jには「映画データベース」というサンプルデータが用意されています。これを活用して練習できる。
5.1 映画データベースのインポート
:play movies
チュートリアルが表示されるので、指示に従ってデータベースをセットアップする。下記の画面が出たら完了。
5.2 ノードやプロパティの検索
トム・ハンクスを検索
MATCH (tom {name: "Tom Hanks"}) RETURN tom
1990年代の映画を検索
MATCH (nineties:Movie) WHERE nineties.released >= 1990 AND nineties.released < 2000 RETURN nineties.title
5.3 ノード間の関係検索
トム・ハンクスが出演した映画
MATCH (tom:Person {name: "Tom Hanks"})-[:ACTED_IN]->(movies) RETURN movies.title
「クラウド・アトラス」の監督を検索
MATCH (nineties:Movie) WHERE nineties.released >= 1990 AND nineties.released < 2000 RETURN nineties.title
5.4 最短経路を計算する例
ケビン・ベーコンとメグ・ライアン間の最短経路
MATCH p=shortestPath(
(bacon:Person {name:"Kevin Bacon"})-[*]-(meg:Person {name:"Meg Ryan"})
)
RETURN p
5.5 コネクションを活用した推薦
トム・ハンクスの新しい共演者を探す
MATCH (tom:Person {name:"Tom Hanks"})-[:ACTED_IN]->(m)<-[:ACTED_IN]-(coActors),
(coActors)-[:ACTED_IN]->(m2)<-[:ACTED_IN]-(potentialCoActors)
WHERE NOT (tom)-[:ACTED_IN]->()<-[:ACTED_IN]-(potentialCoActors) AND tom <> potentialCoActors
RETURN potentialCoActors.name AS Recommended, COUNT(*) AS Strength ORDER BY Strength DESC
6. 次のステップ
- 自分のデータを使ってグラフデータベースを構築
- Cypherの高度なクエリやNeo4jのAPI連携を学ぶ
Neo4jを使うことで、データの関係性を可視化し、直感的に操作できる楽しさを感じてください!