はじめに
先日、Neo4j社が無料で使えるグラフデータベースのマネージドサービス「Neo4j AuraDB Free」を発表し、いい機会と思いちょっと触ってみたのでそれについて書いてみました。
Introducing Neo4j AuraDB Free
グラフデータベース自体初めて触ったので内容は初歩的なものですが、まだ触ったことないけど興味あるという方の参考になれば嬉しいです。
グラフデータベースとは
グラフDBはNoSQLの一種で、グラフ構造を持つデータベースです。グラフは以下3つの要素で定義されます。
- ノード:人や物などを表すエンティティ
- エッジ:二つのノード間のつながり、関係性を表すリレーションシップ
- プロパティ:ノード、エッジの属性情報
何はともあれ使ってみると視覚的にもわかりやすいものとなっているので以降で使い方を説明していきます。
Neo4j AuraDB Freeのセットアップ
まずneo4jの公式ページの「Start Free」からアカウントを作成します。
アカウント作成できたら早速「Create a Database」を選択し、DBを作成していきます。
今回はお試しなのでDatabase Typeは「AuraDB Free」を選択します。
Database Nameは「sample」、GCP Regionは「Singapore」、Starting datasetは空のものとし、いざ「Create Database」を選択してDBを作成してみます。
作成後にDBのCredential情報が表示されます。DBに接続するときに使用しますのでメモしておき、「Continue」で次に行きます。
マイページに今作成したDBが表示されますのでこれで一旦DB作成は完了となります。
触ってみる
Neo4j AuraDBはブラウザで接続してクエリを実行できる機能を提供しているのでそれを使ってちょっと触っていきます。
使い方はマイページのDBの右側にある「Open with」を選択するとGUIツールが選択できます。今回は「Neo4j Browser」を使います。
「Neo4j Browser」を選択すると接続画面が表示されますので、セットアップ時に生成されたCredential情報を入力し、「Connect」で接続します。
これでDB上でクエリを実行できるようになりました。neo4jでグラフDBを操作するには「Cypher」というクエリ言語を用います。
またRDBのようにテーブルという概念がないため、いきなりノードを追加していく感じになります。
ここでは詳細の説明は割愛しますが、Cypherの詳しい構文など知りたい方はneo4j公式のDEVELOPER GUIDESなどをご覧いただければと思います。
それでは早速ノードを追加してみます。まずは以下を実行してPersonというノードを追加してみます。
CREATE (a:Person { name: "熊谷", age: 25, hobby: "ゴルフ"})
return a
これでノードが追加されました。
簡単に説明すると、CREATE (a:Person { name: "熊谷", age: 25, hobby: "ゴルフ"})
でノードを作成します。
グラフDBにはテーブルという概念は存在しないのですが、同じ構造のノードに対してラベルをつけることができ、この文のPerson
がそれにあたります。そしてPerson
の前にあるa
はクエリ名となります。RDBでいうas
の後につける任意の名前に近いかと思います。
その後のreturn a
は戻り値指定のようなものでa
とつけたものを返すとなるので、ここでいうと作成したノードを結果として表示するための文となります。
それではもう一つノードを追加して二つのノードをリレーションさせてみたいと思います。
まずPartyというノードを追加します。
CREATE (a:Party { date: "2021-12-11", name: "歓迎会", location: "新橋" })
次に二つのノードをつなぎます。
MATCH (a:Person{name:"熊谷"}), (b:Party{name:"歓迎会"}) CREATE (a)-[r:参加した]->(b)
RETURN a,r,b
これで以下のように「熊谷さんが歓迎会に参加した」というノードとリレーションが作成されます。
またここで構文の説明をしておくと、MATCH (a:Person{name:"熊谷"}), (b:Party{name:"歓迎会"})
はRDBでいうSELECT
です。そしてCREATE (a)-[r:参加した]->(b)
でMATCHで取得したaとbのノード間にリレーションを作成しています。
ここまでで基本的なことができたので、もう少しノードとリレーションを追加してシチュエーションに合わせた検索をしてみます。
Person
熊谷、吉本、清水、今泉、岩森、伊藤、横山
Party
歓迎会、栄養会、キックオフ会、クリスマスパーティー
リレーション
いろんな人がいろんなパーティーに参加
シチュエーション
熊谷さんが高熱なったので接触した人を調べたい
参加状況
▼ 濃厚接触者の検索
濃厚接触者となる人は熊谷さんとパーティで同席した人になるので以下のように取得できます。
MATCH (origin:Person{name:"熊谷"})-[:`参加した`]->(a)<-[:`参加した`]-(close_contact:Person)
return close_contact
▼ 二次接触者の検索
二次接触者は熊谷さんとパーティで同席した人と別のパーティで同席した人になるので以下のように取得できます。
MATCH (origin:Person{name:"熊谷"})-[:`参加した`]->(a)<-[:`参加した`]-(close_contact:Person),
(close_contact)-[:`参加した`]->(b)<-[:`参加した`]-(second_close_contact:Person)
WHERE NOT (origin)-[:`参加した`]->()<-[:`参加した`]-(second_close_contact) AND origin <> second_close_contact
RETURN second_close_contact
以上のように関係を辿って接触者を特定することができました。
おわりに
入門的な内容でしたが、グラフデータベースとはなんぞや?ということが少しでも理解いただける内容となっていれば幸いです。
グラフデータベース自体がRDBだとJOINだらけになって遅くなるような問題を解決するために作られたという話なので、身近で利用シーンが出ることに備えて今後も追っていきたいと思います。
それでは。