HapInS Developers Blog

HapInSが提供するエンジニアリングの情報サイト

グラフデータベースNeo4jを使用してみた

はじめに

グラフデータベースとはなんぞや?と気になってはいたものの手付かずでしたので、今回、その1つであるNeo4jを使用してみました。

※グラフデータベースについてはこちらが参考になると思います。

Neo4jとは

neo4jはJavaベースの組み込み型のグラフデータベースエンジンでスウェーデンのNeo Technologyが提供するオープンソースソフトウェアです。

インストールとサーバー起動

Get started with Neo4jを参考に進めていきたいと思います。

JDKが必要ですので、インストールされていない場合は別途インストールが必要です。

Neo4jはここからダウンロードして、解凍します。

解凍後は、以下コマンドを実行してサーバー起動します。

bin\neo4j-admin server console
./bin/neo4j-admin server console

※終了する場合は、Ctrl-Cで終了します。

起動したら、ブラウザから以下URLを入力し、接続します。

http://localhost:7474/

ユーザー名とパスワード(どちらもneo4j)を入力して、「Connect」ボタン押下します。

※初回のみ、パスワードの変更が求められるので、新しいパスワードを設定します。

以下が表示されたら、OKです。

動かしてみる

Getting started with Neo4j Browserから、使用方法を確認したら、Try Neo4j with live dataのガイドに従って、実際に動かしてみます。

データ投入

緑枠の左上の▶︎をクリックして、Cypherクエリを実行すると、データが作成されます。

以降の操作に必要なデータがここで一気に作成されます。

以下抜粋ですが、MovieノードとPersonノードを作成し、ACTED_INでリレーションを持たせています。

CREATE (TheMatrix:Movie {title:'The Matrix', released:1999, tagline:'Welcome to the Real World'})
CREATE (Keanu:Person {name:'Keanu Reeves', born:1964})
(Keanu)-[:ACTED_IN {roles:['Neo']}]->(TheMatrix)

全てのクエリを実行すると以下のようなグラフが作成されます。

一意制約の追加

MovieのtitleとPersonのnameにそれぞれ一意制約を追加します。

CREATE CONSTRAINT FOR (n:Movie) REQUIRE (n.title) IS UNIQUE
CREATE CONSTRAINT FOR (n:Person) REQUIRE (n.name) IS UNIQUE

一意制約を追加すると、そのプロパティにインデックスが暗黙的に追加されます。

インデックス作成

さらにインデックスを作成していきます。

CREATE INDEX FOR (m:Movie) ON (m.released)

データ取得

データの準備ができたので、実際に取得してみます。

Tom HanksにマッチするPersonを取得

MATCH (tom:Person {name: "Tom Hanks"}) RETURN tom

Personから10件のnameを取得

MATCH (people:Person) RETURN people.name LIMIT 10

nameを指定しているため、グラフ表示はありません。

指定しない場合は、グラフ表示可能です。

MATCH (people:Person) RETURN people LIMIT 10

関連するデータの取得

Tom Hanksが出演した映画の取得

MATCH (tom:Person {name: "Tom Hanks"})-[:ACTED_IN]->(tomHanksMovies) RETURN tom,tomHanksMovies

ベーコン パス

shortestPath()を使用した場合のメグ・ライアンへの「ベーコン・パス」

MATCH p=shortestPath(
(bacon:Person {name:"Kevin Bacon"})-[*]-(meg:Person {name:"Meg Ryan"})
)
RETURN p

ベーコンパスについてはこちら→ケビン・ベーコンのシックス・ディグリーズ

おわりに

ざっと触ってみての感想ですが、ローカルへの導入はさらっといけますので、実際に動かすまでの敷居は低いと感じましたが、 Cypherクエリについては今後理解を深める必要がありますね。