Neo4jとは
NoSQLとは?
Neo4jはNoSQLのDBMSです。
データベースというと、リレーショナルデータベース(RDB)が一般的ですが、RDBでないデータベースが2000年ごろから広がり始めました。そうした「RDBではないデータベース」をNoSQLと言います。RDBと区別するために、それ以外のデータベースを総称して使われています。
ちなみにNoSQLは「Not Only SQL」の略です。
つまり、「RDBはもう不要!これからはNOSQLだけあればいい!」ということではなく、「RDBだけではなくて、新しいデータベースも利用する必要がある」という背景があります。
※RDBを操作するための言語をSQLと言います。
NoSQLの種類
NoSQLは下記4つに分類されることが一般的です。
1. キー・バリュー型
「キー」と「バリュー」という組み合わせから作られるシンプルなモデル。
RDBのようにテーブルや関係性を定義する必要がない。
代表例:Redis、Amazon DynamoDB
2. 列指向型(カラム指向型)
キー・バリュー型を高度にしたモデル。
キーが1つのバリューと対になるのではなく、キーが複数のカラム(列)を持つことができる。
代表例:GoogleBigTable、Cassandra
3. ドキュメント型
JSONやXMLをそのままドキュメントの形でデータを管理するモデル。
複雑な階層構造のデータをそのまま1レコードにできる。
代表例:MongoDB
4. グラフ型
数学のグラフ理論に基づいた「ノード(主要なデータの要素)」、「エッジ(関係性)」、「プロパティ(属性情報)」から構成されるモデル。
SQLではJOINが複雑になるほど速度が遅くなるが、グラフ型では関係性が複雑であっても速度が速い。
代表例:Neo4j、TigerGraph
Neo4jとは
下記4つで構成されるデータモデル
1. ノード
2. リレーションシップ
3. プロパティ
4. ラベル
なぜNeo4jなのか
グラフ型の人気は年々増加傾向にある
出典: https://db-engines.com/en/ranking_categories
グラフ型の中ではNeo4jがダントツで人気がある
出典: https://db-engines.com/en/ranking/graph+dbms
Neo4jのメリット
RDBでフォロー機能を実装した場合
このようなテーブル定義で、imaizumiのフォロワーを取得するSQLは下記のようになる。
- imaizumiのフォロワー
SELECT u1.name
FROM User as u1
JOIN Relationship
ON Relationship.follower_id = u1.id
JOIN User as u2
ON Relationship.followed_id = u2.id
WHERE u2.name = 'imaizumi'
この段階でもSQLはまあまあ長いが、例えば、imaizumiのフォロワーのフォロワーを取得したい場合はJOINがもっと増えてパフォーマンスが落ちる。
また、階層が増えれば増えるほど、クエリが複雑化する。
Neo4jでフォロー機能を実装した場合
Cypherクエリの場合は下記のようになる。
- imaizumiのフォロワー
MATCH (imaizumi:User{name: "imaizumi"})<-[:FOLLOW]-(follower:User)
RETURN follower.name
- imaizumiのフォロワーのフォロワーを取得するCypherクエリ
MATCH (imaizumi:User{name: "imaizumi"})<-[:FOLLOW]-(:User)<-[:FOLLOW]-(follower_of_follower:User)
WHERE follower_of_follower <> imaizumi
RETURN follower_of_follower.name
Cypherクエリはシンプルに、かつ直感的に分かりやすく書ける。
参考
NOSQLの基礎知識
【図解】NoSQLとは?注目される背景や種類をわかりやすく解説
NoSQLとは?メリットやRDBMSとの違いについてわかりやすく解説
Neo4jドキュメント
Discussion