今回紹介する言語は、グラフデータベースのNeo4jで使う問い合わせ言語のCypherです。Cypherは一般的なデータベースを操作するSQLと同等の機能をグラフデータベースで扱えるように設計されたものです。グラフデータベースは見た目も面白く、データ管理だけでなく視覚化の点でも役立ちます。

  • Cypherで3と5の公倍数を表示したところ

    Cypherで3と5の公倍数を表示したところ

Cypherとは

以前、本連載では一般的なデータベース(RDBMS)で使えるSQLについて紹介しました。SQLはデータベースの問い合わせ言語であり、簡単なコマンドによりデータの挿入、変更、削除、検索を行います。

同じように、Cypherを使うことでグラフデータベースを操作できます。CypherはもともとNeo4jのために設計されましたが、2015年にオープンソースのプロジェクトとしても公開されています。

グラフデータベースNeo4jとは

なお、Neo4jというのはグラフ構造のデータモデルを扱うことのできるデータベース管理システムです。Javaで開発されておりクロスプラットフォームに対応しています。

そもそも、Neo4jは、一般的なRDBMSのパフォーマンスを改善する目的で2002年に開発されました。2007年にGPLライセンスでオープンソース化され、その後も着々と使い勝手が改善されてきました。原稿執筆時点での最新版は4.4.2です。商用ライセンスとGPLの二重ライセンスとなっています。

Neo4jの最大の特徴は、グラフ構造のデータを手軽に扱うことができることです。また、一般的なデータベースのRDBMSではデータベースを使い始める前にしっかりとデータ構造を定義する必要があります。しかし、Neo4jでは定義が不要であり、手軽に利用できます。

また、ローカルPCでNeo4jサーバーを起動すると、ブラウザ上にグラフを描画することができます。

  • ブラウザ上でCypherを実行してグラフを確認できる

    ブラウザ上でCypherを実行してグラフを確認できる

Neo4jのインストール

それでは、Neo4jをインストールして、Cypherで簡単にデータベースを操作してみましょう。こちらのNeo4jのダウンロードページよりアーカイブをダウンロードしてください。ここでは、オープンソース版のCommunity Editionを選択してダウンロードしてみます。

【Windowsの場合】

なお、Neo4jを実行するにはJava11が必要です。OpenJDKかOracle Javaをインストールする必要があります。ここでは、OpenJDK 11を使う方法を紹介します。上記のNeo4jに加えて、こちらのページから、OpenJDK 11.02を選んでダウンロードします。

  • OpenJDK 11.02をダウンロード

    OpenJDK 11.02をダウンロード

OpenJDK 11のZIPファイルを解凍したら、C:\Javaにコピーしましょう。

  • エクスプローラーにコピー

    エクスプローラーにコピー

その上でWindowsの環境変数にOpenJDKを追加します。コントロールパネルを開いて、検索ボックスに「環境変数を編集」と入力して環境変数の編集画面を出しましょう。

そして、次の図のように「JAVA_HOME」に「C:\Java\jdk-11.0.2」を設定し、「Path」に「C:\Java\jdk-11.0.2\bin」を追加します。

  • OpenJDKの環境変数を設定

    エクスプローラーにコピー

  • PathにOpenJDKのbinフォルダを追加

    PathにOpenJDKのbinフォルダを追加

そして、Neo4jをダウンロードしたZIPファイルを解凍します。そして解凍したらコマンドプロンプトを起動します。そして、以下のようなコマンドを実行します。すると、Neo4jのサーバーが起動します。

cd (Neo4jを解凍したフォルダ)
cd bin
neo4j console

なお、Neo4jを終了するには、[Ctrl]+[C]キーを押します。

【macOSの場合】

macOSの場合は、パッケージマネージャーのHomebrewを利用します。こちらのページを開いて、書かれているコマンドをコピーしましょう。そして、ターミナル.appを起動して、貼り付けて実行します。

Homebrewをインストールしてから、以下のコマンドを実行すると、Neo4jがインストールできます。

brew install neo4j

それから、以下のコマンドを実行しましょう。

neo4j console

すると、Neo4jのサーバーが起動します。

共通の操作

Neo4jをインストールし、サーバーが起動したら、ブラウザを起動して次のURLにアクセスします。

http://localhsot:7474
  • Neo4jのサーバーが起動したところ

    Neo4jのサーバーが起動したところ

そして、Usernameに「neo4j」、Passwordに「neo4j」と入力してログインしましょう。初回ログインすると、パスワードの変更画面が出ます。

グラフデータベースにデータを挿入しよう

それでは、データベースにデータを入力しましょう。問い合わせ言語のCypherを利用してデータベースを操作します。ブラウザの画面上部にある「neo4j$」の部分にCypherを入力します。

ここでは、以下のコマンドを入力してデータを挿入しましょう。コマンドを実行するとPersonという5件のノードを作成します。

CREATE
(:Person { name: "鈴木", age: 30 }),
(:Person { name: "田中", age: 22 }),
(:Person { name: "武田", age: 20 }),
(:Person { name: "伊藤", age: 24 }),
(:Person { name: "工藤", age: 30 });

この状態で、画面左側の「Databese Information」からPersonというラベルをクリックすると、ノードが画面に表示されます。この状態では、Personノードが5個あるだけです。ノードをクリックすると、ノードの情報を確認できます。

  • Personノードの一覧をグラフに表示

    Personノードの一覧をグラフに表示

グラフデータベースでは、ノード同士の関係を接続することができます。次に、ノード同士の関係を追加しましょう。ここでは、Personに友人関係を追加してみましょう。

MATCH (a:Person{name: "鈴木"}), (b:Person{name: "田中"})
  CREATE (a)-[:友人]->(b);
MATCH (a:Person{name: "鈴木"}), (b:Person{name: "伊藤"})
  CREATE (a)-[:友人]->(b);
MATCH (a:Person{name: "伊藤"}), (b:Person{name: "田中"})
  CREATE (a)-[:友人]->(b);
MATCH (a:Person{name: "伊藤"}), (b:Person{name: "工藤"})
  CREATE (a)-[:友人]->(b);
MATCH (a:Person{name: "武田"}), (b:Person{name: "工藤"})
  CREATE (a)-[:友人]->(b);

改めて、Database InformationからPersonノードの一覧を確認してみましょう。すると、次のように友人関係ができて、誰と誰が友達なのかを確認できます。

  • Personノードの友人関係が確認できる

    Personノードの友人関係が確認できる

グラフデータベースを検索しよう

このようにグラフが完成したら、Cypherを利用して任意のデータを検索して表示できます。例えば、鈴木さんから工藤さんまで誰を介せば会えるかを検索してみましょう。以下のように記述します。

MATCH p=(:Person{name:"鈴木"})-[*]->(:Person{name:"工藤"})
  RETURN p;

上記コマンドを実行すると、次のようなグラフが描画されます。つまり、鈴木さんが工藤さんと仲良くなるには伊藤さんを介せば良いことが分かりました。

  • 鈴木さんが工藤さんと仲良くなるには伊藤さんを介せば良いことが分かった

    鈴木さんが工藤さんと仲良くなるには伊藤さんを介せば良いことが分かった

FizzBuzzをグラフで表現してみる

続いて、本例債で恒例となっているFizzBuzz問題を解いてみましょう。しかし、データベースでFizzBuzzを解いても面白くないので、ここはFizzとBuzzの関係をグラフで表示してみましょう。

なお、1から100までの値で、Fizzとは3で割り切れる値であり、Buzzとは5で割り切れる値です。これをNeo4jで表現してみましょう。なお、プログラムをコピーしたい場合は、こちらからコピーしてください。

// Fizz, Buzzのノードを作る --- (*1)
CREATE (:FizzBuzzGroup { name: "Fizz" }), (:FizzBuzzGroup { name: "Buzz" });
// 1から100までの値を追加 --- (*2)
FOREACH (i IN RANGE(1,100) | CREATE (a:FizzBuzz{v:i}));
// isFizz, isBuzzの関係を追加 --- (*3)
MATCH (i:FizzBuzz),(g:FizzBuzzGroup{name:"Fizz"})
  WHERE i.v % 3 = 0
  CREATE (g)-[:isFizz]->(i);
MATCH (i:FizzBuzz),(g:FizzBuzzGroup{name:"Buzz"})
  WHERE i.v % 5 = 0
  CREATE (g)-[:isBuzz]->(i);

(*1)の部分では、FizzBuzzGroupにFizzとBuzzのノードを追加します。続いて、(*2)では、1から100の値を表すノード(FizzBuzz)を追加します。そして、(*3)でisFizzとisBuzzの関係を追加します。

続いて以下を実行してみましょう。

MATCH p=(n:FizzBuzzGroup)-[*]->(v:FizzBuzz) RETURN p

すると次のようにFizzBuizzが表示されます。実行結果にそれほど意味があるわけではありませんが、3の倍数(Fizz)と5の倍数(Buzz)の公倍数が確認できます。

  • FizzBuzzの値を表示したところ

    FizzBuzzの値を表示したところ

まとめ

以上、今回はグラフデータベースのNeo4jをインストールして、Cypherを使ってグラフデータベースを操作する方法を紹介しました。Cypherを使うと、SQLのようにデータの挿入から検索まで高度な処理が可能です。FizzBuzzの例を見るとCypherの表現力の高さが分かることでしょう。簡単な構文さえ覚えてしまえば、それなりに使えるので挑戦してみると良いでしょう。

自由型プログラマー。くじらはんどにて、プログラミングの楽しさを伝える活動をしている。代表作に、日本語プログラミング言語「なでしこ」 、テキスト音楽「サクラ」など。2001年オンラインソフト大賞入賞、2004年度未踏ユース スーパークリエータ認定、2010年 OSS貢献者章受賞。技術書も多く執筆している。直近では、「シゴトがはかどる Python自動処理の教科書(マイナビ出版)」「すぐに使える!業務で実践できる! PythonによるAI・機械学習・深層学習アプリのつくり方 TensorFlow2対応(ソシム)」「マンガでざっくり学ぶPython(マイナビ出版)」など。