📊

Neo4Jに入門してみる

2022/11/18に公開

Neo4Jとは?

Javaで開発されたオープンソースのグラフデータベース。
2000年ごろに開発された。会社はスウェーデンに最初にできて、本社をシリコンバレーに移転した。
公式サイト
https://neo4j.com/docs/getting-started/current/

どんなものか?

公式を翻訳してみた

Neo4j グラフ データ プラットフォーム

グラフ データベースとして始まった Neo4j は、多くのツール、アプリケーション、およびライブラリを備えた豊富なエコシステムに進化し、グラフ テクノロジを作業環境に統合する機会を提供します。

Neo4j エコシステムの 3 つの柱を見てみましょう。

https://neo4j.com/docs/getting-started/current/get-started-with-neo4j/graph-platform/#platform-components

まず、Neo4jは世界をリードするグラフ データベースです。このアーキテクチャは、ノードと関係の最適な管理、ストレージ、およびトラバーサルのために設計されています。

次に、Neo4j Auraは、クラウド内の完全に管理されたグラフ データ プラットフォーム サービスです。Aura を使用すると、開発者やデータ サイエンティストは、インフラストラクチャを管理する手間をかけずに、スケーラブルな AI 駆動型アプリケーションを迅速に構築し、アルゴリズムを使用してビッグ データを分析できます。Neo4j Aura には、アプリケーション用の AuraDB とデータ サイエンス用の AuraDS が含まれています。

3 番目に、Neo4j グラフ データ サイエンスは、接続されたデータ分析および機械学習プラットフォームであり、ビッグ データの接続を理解するのに役立ちます。

サイファー

Cypher は、Neo4j のグラフ クエリ言語であり、ユーザーがグラフ データベースからデータを保存および取得できるようにします。これは、グラフのパターンを記述するための、SQL にヒントを得た宣言型言語です。この構文は、グラフ内のノードと関係のパターンを一致させるための視覚的かつ論理的な方法を提供します。Cypher は、誰にとっても簡単に習得、理解、使用できるように設計されていますが、他の標準的なデータ アクセス言語のパワーと機能も組み込まれています。


環境構築

まずは、使ってみる。
英語の情報しかないと思ったのですが、Qiitaで記事が多かったり、YouTubeでNeo4Jと検索すると日本人の方(知ってる人なんですけど)案浦さんという方がご紹介してくれてます。
ユーザー登録をすればブラウザで気軽に試すことができるサービスもある。

https://neo4j.com/docs/browser-manual/current/

よく使われているのはデスクトップ版なのでこちらをダウンロードして使って動かしてみてください。

https://neo4j.com/docs/desktop-manual/current/

で、Neo4Jを使うときに使う技術がCypherというSQLと似たクエリ言語を使ってデーターベースにアクセスをして、データを作成、検索、編集、削除を行います。
グラフが表示されて、触ると動くので「なんだこれ、動くぞと!!!」と驚きました。

覚えることがいっぱいあるので最初は3つ覚えておけば大丈夫

node
ノードは、リレーショナルデータベースで言えば、レコード的なものですが、ラベルをつけてグループ化するとテーブルのような扱いもできます。

テーブルというかノードを作るCypherクエリをまずは実行するところから始める。
csvやjsonファイルをimportしてnodeを用意することもできます。こちらは操作に慣れないと、どこに配置するのか分からなかったりする?

会社の名前をもつNodeを作るならこんなイメージですね。
1個ずつ実行する。

create (n:会社 { name: "NTT"})
create (n:会社 { name: "au"})
create (n:会社 { name: "Soft Bank"})

成功するとこのように作成されます

property

属性は「キー:バリュー」の書式で、ノードと関係性の両方に設定できます。例えば、(n:Person)というノードの属性には、「名前」、「性別」、「年齢」、「住所」、「電話番号」などが設定できます。関係性を示す「知っている」というタイプには、「好感を持っている」、「好感は持っていない」、「趣味があう」、「趣味が合わない」などの属性が設定できます。下記の例で{ name:"Jboy" }の部分が属性の定義であり、書式は{キー:"バリュー"}です。コンマで区切って、{name: "Jboy",address: "福岡",tel="090-9999-9999",・・・ }のように複数の属性を登録することもできます。
エンジニアというnodeを作成する場合だとこのようにCypherを書く

CREATE (n:Engineer { name: "Jboy",address: "福岡", tel: "090-9999-9999" })

実行すると、Engineerというnodeが作成されました。tableで表示することもできます。jsonみたいに表示されます。

グラフ

table

SQLのSELECTと同じように、データを検索するには、MATCH文を使います。

Engineerというnodeを検索する方法。これだと、全て検索してしまいますけどね。
みるだけなら、画面左の作成したnodeの名前をマウスでクリックするだけでも見れますよ!

MATCH (n:Engineer) RETURN n LIMIT 25

relationship
Node同士が関係を持っているものを作るときは、Relationshipを使います。
Node同士が、線で繋がっているイメージですね。
新規のNodeをCREATE文で作成するときに、[:AAA]->を使います。
こちらが公式の解説
https://neo4j.com/docs/cypher-manual/current/clauses/match/#relationship-basics
Qiitaの記事ですけど、独特な記号の使い方が載ってます。
https://qiita.com/makopo/items/76ae5be981c90c06877e

CREATE c=(:Companyn{name:'NTT'})-[:STAFF]->(:Person{name:'Taro'})

RETURN c

JOINみたいなクエリで検索してみる。
こんな感じでNTTという企業とTaroさんという社員が関係を持っているのをグラフで表示できました!
これでいいのか疑問だが...

最後に

最近グラフデーターベースなんてものがあったのを知って、面白いと思った。
SQLが苦手な分野で使われているそうです。機械学習をしていて、ネットワークイメージを可視化したい人たちには人気が高まっているそうです!
NTT、GMO、有名どころの企業さんも導入しているようです。

Discussion