Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationEventAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
3
Help us understand the problem. What are the problem?

More than 1 year has passed since last update.

AzureでNeo4jを使ってみる

この記事は、Neo4j v4.0(2020-01)に合わせて更新しています!

Azure VMでグラフDB Neo4jをインストールしてみました。

グラフDBとは、RDBでは処理困難な、非常に複雑なネットワーク状のデータ処理に特化したデータベースです。

  • 1つのSQL文で結合関係が10個以上発生するような処理
  • SQLでは、書き切れないような処理(遅くて困っているものも含めて)
  • そもそも、関係性が複雑すぎてデータベース設計自体が困難

グラフDBのデータモデルは、文字通り、グラフ(頂点と辺)です。RDBと違って結合関係を永続化します。辺(WRITE)の前後に始点の終点のIDを持たせて、インデックスのような働きをさせています(トラバーサルと言います)。
datamodel4type.png

RDBのように結合関係を紐解く必要がないために、とても複雑な処理を簡明な構文で書けるし、高速処理が可能です。

ネットワーク状のデータとは、どのようなデータでしょうか。

そもそも、すべてのデータは何かしらの繋がりを持ち、本質的にネットワークの形状をしています。そこにあるのは、データ間の繋がりの密度が高いか低いか、階層が深いか浅いか、だけの問題です。そのなかでグラフDBは、繋がりの密度が高く、階層が深いデータ処理に向いています。

グラフモデルの場合、データベース設計がとても簡単です。エンジニアでなくても、自分が担当している業務のフローは書けると思います。それが、そのままデータベースのスキーマになります。

datamodel-of-network&IT.png
Displaying 17 nodes, 63 relationships.

このスキーマは、オンラインサンドボックスの「Network and IT Management」のデータモデルです。
https://neo4j.com/sandbox/

複雑なネットワーク構造のデータをSQLで処理しようとすると、いわゆる「ジョインボム(join bomb)」の問題に直面します。想像を絶する長さでノロノロしたクエリのことです。それでも、SQLで書き切れるなら幸いな方です。プロシジャーを書く羽目になるかも知れません。その時点でリアルタイム処理は遠のいてしまいます。

Neo4jは、とても複雑なネットワーク状のデータ処理に最適化された、Cypher(サイファー)というクエリ言語を使ってデータ処理を行います。

Neo4jのインストール

事前準備

[参考]
https://neo4j.com/docs/operations-manual/current/installation/linux/rpm/

サーバを用意します。

  • Standard A2m v2 (2 vcpu 数、16 GiB メモリ) /* これは推奨ですが、半分ぐらいでも結構です */
  • CentOS-based V7.5
  • パスワードログイン

セキュリティグループに「tcp 7474,7687」を追加します。

最新のNeo4j 4.xは、Java 11が必要です。

Neo4j 3.x Neo4j 4.x
Java 8 Java11

VMにログインします(centos/your password)。

Java11をインストールします。
CentOSは、Java 8が標準でしたのでJava 11に切り替えました。

# yum install java-11-openjdk-devel

# java -version
   java version "1.8.0_231"
   Java(TM) SE Runtime Environment (build 1.8.0_231-b11)
    Java HotSpot(TM) 64-Bit Server VM (build 25.231-b11, mixed mode)

#  alternatives --config java    // CentOS7のDefaultがjdk1.8.0
*+ 1           /usr/java/jdk1.8.0_231-amd64/jre/bin/java
   2           java-11-openjdk.x86_64 (/usr/lib/jvm/java-11-openjdk-11.0.6.10-1.el7_7.x86_64/bin/java)
Enter to keep the current selection[+], or type selection number: 2

# java -version
openjdk version "11.0.6" 2020-01-14 LTS
OpenJDK Runtime Environment 18.9 (build 11.0.6+10-LTS)
OpenJDK 64-Bit Server VM 18.9 (build 11.0.6+10-LTS, mixed mode, sharing)

Neo4jインストール

Neo4j3.5からRPMパッケージが使えるようになりました。
ここでは、「Red Hat, CentOS, Fedora」をベースに解説します。

# rpm --import https://debian.neo4j.com/neotechnology.gpg.key
# cat <<EOF>  /etc/yum.repos.d/neo4j.repo
[neo4j]
name=Neo4j RPM Repository
baseurl=https://yum.neo4j.com/stable
enabled=1
gpgcheck=1
EOF

コミュニティ版のインストール

# yum install neo4j-4.0.0

コマシャル版のインストール(30日間無償で使えます)

# yum install neo4j-enterprise-4.0.0

ファイル配置を確認します。

# ls /etc/neo4j/
neo4j.conf

# ls /var/lib/neo4j
certificates  data  import  plugins

# ls /usr/bin/{neo4j,neo4j-admin,cypher-shell}
/usr/bin/cypher-shell  /usr/bin/neo4j  /usr/bin/neo4j-admin

インストール後の環境設定

リモートからNeo4jブラウザーに接続するためには、neo4j.conf」の設定が必要です。
次のように「リッスンアドレス」をアンコメントします。

/etc/neo4j/neo4j.conf

dbms.connectors.default_listen_address=<local IP address>

次のように初期パスワードを登録します。

# neo4j-admin set-initial-password your_password

運用中にadminユーザーのパスワードを忘れてしまった場合のリセット方法は、次のURLを参照してください。
https://neo4j.com/docs/operations-manual/current/configuration/password-and-user-recovery/

Neo4jの起動

Neo4jを起動します。

# systemctl start neo4j
# systemctl status neo4j
● neo4j.service - Neo4j Graph Database
   Loaded: loaded (/usr/lib/systemd/system/neo4j.service; disabled; vendor preset: disabled)
   Active: active (running) since Sun 2020-03-01 18:55:17 JST; 19min ago
 Main PID: 4242 (java)
   CGroup: /system.slice/neo4j.service
           mq4242 /usr/bin/java -cp /var/lib/neo4j/plugins:/etc/neo4j:/usr/share/neo4j/lib/*:/var/lib/neo4j/plugins/* -server -XX:+UseG1GC -XX:-OmitStackTraceInFastThrow -XX:+AlwaysPreTo...

Mar 01 18:55:17 mongodb-shard neo4j[4242]: import:       /var/lib/neo4j/import
Mar 01 18:55:17 mongodb-shard neo4j[4242]: data:         /var/lib/neo4j/data
Mar 01 18:55:17 mongodb-shard neo4j[4242]: certificates: /var/lib/neo4j/certificates
Mar 01 18:55:17 mongodb-shard neo4j[4242]: run:          /var/run/neo4j
Mar 01 18:55:17 mongodb-shard neo4j[4242]: Starting Neo4j.
Mar 01 18:55:19 mongodb-shard neo4j[4242]: 2020-03-01 09:55:19.086+0000 INFO  ======== Neo4j 4.0.1 ========
Mar 01 18:55:19 mongodb-shard neo4j[4242]: 2020-03-01 09:55:19.098+0000 INFO  Starting...
Mar 01 18:55:30 mongodb-shard neo4j[4242]: 2020-03-01 09:55:30.645+0000 INFO  Bolt enabled on 0.0.0.0:7687.
Mar 01 18:55:30 mongodb-shard neo4j[4242]: 2020-03-01 09:55:30.646+0000 INFO  Started.
Mar 01 18:55:33 mongodb-shard neo4j[4242]: 2020-03-01 09:55:33.590+0000 INFO  Remote interface available at http://localhost:7474/

Neo4jへログイン

Webブラウザーから、次のように接続します。

PublicIP:7474

初期画面では、サーバーで設定したパスワードを入力します(neo4j/your_password)。

neo4j-install-1.png

次のようにワーキングパネルが表示されます。ここまで表示できたらインストールは成功です。

neo4j-install-2.png

演習用の映画データベース作成

Neo4jブラウザーへ、次のように入力し、実行します(右上の実行パターンをクリック)。

:play movie graph

映画データベースの紹介画面が表示されたら右に移動します。そして、次のような映画データベース作成用のCypherクエリ文が表示されたら、枠のなかをクリックし、コマンドラインにコピーしてから実行します。

neo4j-install-3.png

次のようなグラフが表示されたらデータベース作成は成功です。

movie-graph.png

Neo4jのデータ処理

Neo4jのデータ処理は、GUI及びCUIを適切にミックスして行います。

Keanu Reevesさんが出演した映画をグラフとして出力してみます。

MATCH (actor:Person {name:'Keanu Reeves'})-[r:ACTED_IN]->(movie)
RETURN actor,movie 

keanu-movie-1.png

グラフの中身はテキストとしても出力できます。

MATCH (actor:Person {name:'Keanu Reeves'})-[r:ACTED_IN]->(movie)
RETURN actor.name,movie.title 

keanu-movie-2.png

Cypherを勉強してみたい方は、こちらのオンライントレーニングがお薦めです。
https://neo4j.com/graphacademy/online-training/introduction-to-neo4j/

筆者から言わせると、Cypherはアート(芸術作品)です。

Neo4jのストップ

Neo4jをストップします。

# systemctl stop neo4j

以上、Neo4j v4.x(2020-01)のインストール手順でした。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
3
Help us understand the problem. What are the problem?