はじめに
グラフデータベースとはなんぞや?と気になってはいたものの手付かずでしたので、今回、その1つであるNeo4jを使用してみました。
※グラフデータベースについてはこちらが参考になると思います。
Neo4jとは
neo4jはJavaベースの組み込み型のグラフデータベースエンジンでスウェーデンのNeo Technologyが提供するオープンソースソフトウェアです。
インストールとサーバー起動
Get started with Neo4jを参考に進めていきたいと思います。
JDKが必要ですので、インストールされていない場合は別途インストールが必要です。
Neo4jはここからダウンロードして、解凍します。
解凍後は、以下コマンドを実行してサーバー起動します。
- Windowsの場合
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クエリについては今後理解を深める必要がありますね。