【Neo4J】第一話:オレはグラフタウンのサトシ!ポケモンマスターになる!【ポケモンZA】
第一話:オレはグラフタウンのサトシ!ポケモンマスターになる!
この投稿はグラフタウンのサトシ君がグラフデータベースを活用してポケモン最新作ポケモンZAを探索する話です。
スキーマが柔軟なグラフデータベースの良さを体感するために、回ごとにスキーマを進化させていく予定です。
データモデリングがメインなので、ポケモン世界での言葉遣いや時系列は無視してね。
あと今後は進化とかわざとか追加していくので、ネタバレになる可能性があるので気を付けてください。
プロローグ
オレはグラフタウンのサトシ!
グラフタウンではみんながグラフデータベースの知識を持っているITエンジニアだぜ!
オレが使うグラフデータベースは『Neo4J』!
Neo4Jは
Javaで実装された、 オープンソースの最も人気のあるグラフデータベース
なんだ!(出典:https://ja.wikipedia.org/wiki/Neo4j)
これからオレはオーキド博士の研究所で最初のポケモンをもらうんだ!
オーキド博士の研究所
サトシ「オーキド博士!ポケモンください!」
オーキド博士「ふぉっふぉっふぉ。よく来たなサトシ。」
オーキド博士「そこに 3びき ポケモンが いる じゃろう!」
MATCH (n)
RETURN n

サトシ「一匹もいないよ!」
オーキド博士「そんなはずは、、、確か『ほのお』『みず』『くさ』タイプのポケモンがいたはずじゃが、、、」
CREATE (fire:Type {name:'fire',name_ja:'ほのお'})
CREATE (water:Type {name:'water',name_ja:'みず'})
CREATE (grass:Type {name:'grass',name_ja:'くさ'})
RETURN fire,water,grass

サトシ「うーん、、、タイプはあるけどポケモンはいないみたいだよ?」
オーキド博士「おっと、うっかりしておった!見つけたポケモンをポケモン・グラフデータベース・図鑑に登録するの忘れていたようじゃ!」
オーキド博士「まずははっぱポケモンのチコリータ。」
CREATE (chikorita:Pokemon {national_no:152,name:'chikorita',name_ja:'チコリータ'})
RETURN chikorita;

オーキド博士「このポケモンはくさタイプじゃ。」
MATCH (p:Pokemon {name:'chikorita'})
MATCH (t:Type {name:'grass'})
MERGE (p) - [r:HAS_TYPE] -> (t)
RETURN p,r,t

サトシ「CREATEとMERGEの違いはなに?」
オーキド博士「おお!いいところに気が付いたの!」
オーキド博士「グラフデータベースではノードやエッジを作成するときにCREATEを使用すると、もしデータベース上に同じオブジェクトがあると二重に登録されてしまうのじゃ。」
オーキド博士「MERGEを使うと、検索に使用したプロパティ(今回はname)が同じものがあればスキップされ、同じものがなければ登録されるのじゃ。」
オーキド博士「二重に登録されたくないマスタデータなんかはMERGEを使用するのが無難じゃ。ただし重複チェックが入るため、CREATEよりもオーバーヘッドがすこし大きくなるのが注意点じゃがな。」
オーキド博士「さて、このまま『ほのお』ポケモンと『みず』ポケモンも追加していくかの。」
オーキド博士「さっきはノードの作成とエッジの作成を二つのクエリに分けたが、一緒に実行することも可能じゃ。」
MATCH (fire:Type {name:'fire'})
MERGE (tepig:Pokemon {name:'tepig',name_ja:'ポカブ'})
MERGE (tepig) - [r:HAS_TYPE] -> (fire)
RETURN tepig, r, fire

MATCH (water:Type {name:'water'})
MERGE (totodile:Pokemon {name:'totodile',name_ja:'ワニノコ'})
MERGE (totodile) - [r:HAS_TYPE] -> (water)
RETURN totodile, r, water

オーキド博士「さて、あらためて、、、」
オーキド博士「そこに 3びき ポケモンが いる じゃろう!」
MATCH (n) - [r] -> (m)
RETURN n,r,m

(※:グラフデータベースに限りませんが、データベースの全件検索は非常に危険ですので全量が明らかでない場合には実行しないようにしましょう)
オーキド博士「おいぼれた いまは ポケモンも 3びき しか のこっとらんが おまえに 1ぴき やろう! …… さあ えらべ!」
エピローグ
サトシ君がどのポケモンを選んだかは次回のお楽しみです。
めでたしめでたし
これは私です。

今後の展開予定
-
第一話
- 初期ポケモンとタイプで最小限のグラフデータベースを構築
- 追加ノード
- ポケモン(Pokemon)
- タイプ(Type)
- 追加エッジ
- タイプHAS_TYPE
- (Pokemon)-[HAS_TYPE]->(Type)
- タイプHAS_TYPE
-
第二話
- わざの追加
- 追加ノード
- わざ(Move)
- 追加エッジ
- わざタイプ(HAS_TYPE)
- (Move)-[HAS_TYPE]->(Type)
- おぼえるわざ(LEARN_TO)
- (Pokemon)-[LEARN_TO]->(Move)
- わざタイプ(HAS_TYPE)
-
第三話
- タイプ相性の追加と御三家の進化
- 追加ノード
- 追加エッジ
- タイプ相性(EFFECTIVE_AGAINST)
- (Type)-[EFFECTIVEE_AGAINST]->(Type)
- 進化(EVOLVES_TO)
- (Pokemon)-[EVOLVES_TO]->(Pokemon)
- タイプ相性(EFFECTIVE_AGAINST)
-
第四話
- 最大データ量の試算
-
第五話
- 全ポケモンの追加
- 全タイプの追加
-
第六話
- 全わざの追加
-
第七話
- グラフ探索
データ出典:https://pokemondb.net/
最後に
11/06にNeo4Jの年次イベントNODES2025があります。
オンラインでも参加可能なのでぜひ。
Discussion