9
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

運動通信社 AdventCalendar 2021Advent Calendar 2021

Day 6

【neo4j】グラフデータベースを触ってみる

Last updated at Posted at 2021-12-06

はじめに

先日、Neo4j社が無料で使えるグラフデータベースのマネージドサービス「Neo4j AuraDB Free」を発表し、いい機会と思いちょっと触ってみたのでそれについて書いてみました。
Introducing Neo4j AuraDB Free

グラフデータベース自体初めて触ったので内容は初歩的なものですが、まだ触ったことないけど興味あるという方の参考になれば嬉しいです。

グラフデータベースとは

グラフDBはNoSQLの一種で、グラフ構造を持つデータベースです。グラフは以下3つの要素で定義されます。

  • ノード:人や物などを表すエンティティ
  • エッジ:二つのノード間のつながり、関係性を表すリレーションシップ
  • プロパティ:ノード、エッジの属性情報

何はともあれ使ってみると視覚的にもわかりやすいものとなっているので以降で使い方を説明していきます。

Neo4j AuraDB Freeのセットアップ

まずneo4jの公式ページの「Start Free」からアカウントを作成します。
スクリーンショット 2021-12-06 0.48.23.png

アカウント作成できたら早速「Create a Database」を選択し、DBを作成していきます。
スクリーンショット 2021-12-05 0.22.15.png

今回はお試しなのでDatabase Typeは「AuraDB Free」を選択します。
スクリーンショット 2021-12-05 0.22.34.png

Database Nameは「sample」、GCP Regionは「Singapore」、Starting datasetは空のものとし、いざ「Create Database」を選択してDBを作成してみます。
スクリーンショット 2021-12-05 0.23.24.png

作成後にDBのCredential情報が表示されます。DBに接続するときに使用しますのでメモしておき、「Continue」で次に行きます。
スクリーンショット 2021-12-06 1.03.17.png

マイページに今作成したDBが表示されますのでこれで一旦DB作成は完了となります。
スクリーンショット 2021-12-05 0.28.33.png

触ってみる

Neo4j AuraDBはブラウザで接続してクエリを実行できる機能を提供しているのでそれを使ってちょっと触っていきます。
使い方はマイページのDBの右側にある「Open with」を選択するとGUIツールが選択できます。今回は「Neo4j Browser」を使います。
スクリーンショット 2021-12-06 1.12.02.png

「Neo4j Browser」を選択すると接続画面が表示されますので、セットアップ時に生成されたCredential情報を入力し、「Connect」で接続します。
スクリーンショット 2021-12-05 0.29.43.png

これでDB上でクエリを実行できるようになりました。neo4jでグラフDBを操作するには「Cypher」というクエリ言語を用います。
またRDBのようにテーブルという概念がないため、いきなりノードを追加していく感じになります。
ここでは詳細の説明は割愛しますが、Cypherの詳しい構文など知りたい方はneo4j公式のDEVELOPER GUIDESなどをご覧いただければと思います。

それでは早速ノードを追加してみます。まずは以下を実行してPersonというノードを追加してみます。

CREATE (a:Person { name: "熊谷", age: 25, hobby: "ゴルフ"})
return a

スクリーンショット 2021-12-05 1.16.54.png

これでノードが追加されました。
簡単に説明すると、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

これで以下のように「熊谷さんが歓迎会に参加した」というノードとリレーションが作成されます。
スクリーンショット 2021-12-05 1.56.59.png

またここで構文の説明をしておくと、MATCH (a:Person{name:"熊谷"}), (b:Party{name:"歓迎会"})はRDBでいうSELECTです。そしてCREATE (a)-[r:参加した]->(b)でMATCHで取得したaとbのノード間にリレーションを作成しています。

ここまでで基本的なことができたので、もう少しノードとリレーションを追加してシチュエーションに合わせた検索をしてみます。

Person

熊谷、吉本、清水、今泉、岩森、伊藤、横山

Party

歓迎会、栄養会、キックオフ会、クリスマスパーティー

リレーション

いろんな人がいろんなパーティーに参加

シチュエーション

熊谷さんが高熱なったので接触した人を調べたい

参加状況

スクリーンショット 2021-12-05 2.54.48.png

▼ 濃厚接触者の検索

濃厚接触者となる人は熊谷さんとパーティで同席した人になるので以下のように取得できます。

MATCH (origin:Person{name:"熊谷"})-[:`参加した`]->(a)<-[:`参加した`]-(close_contact:Person)
return close_contact

結果は以下の2名になります。
スクリーンショット 2021-12-06 2.45.27.png

▼ 二次接触者の検索

二次接触者は熊谷さんとパーティで同席した人と別のパーティで同席した人になるので以下のように取得できます。

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

結果は以下の3名になります。
スクリーンショット 2021-12-06 2.45.38.png

以上のように関係を辿って接触者を特定することができました。

おわりに

入門的な内容でしたが、グラフデータベースとはなんぞや?ということが少しでも理解いただける内容となっていれば幸いです。
グラフデータベース自体がRDBだとJOINだらけになって遅くなるような問題を解決するために作られたという話なので、身近で利用シーンが出ることに備えて今後も追っていきたいと思います。
それでは。

9
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?