Ubuntu20.04にNeo4jをインストールして構成する方法
序章
Neo4j は、データノード間の関係を記録するグラフデータベースですが、従来のリレーショナルデータベースは、行と列を使用してデータを格納および構造化します。 各ノードは、接続されている他のすべてのノードへの参照を格納するため、Neo4jは、最小限のオーバーヘッドで複雑な関係をエンコードおよび照会できます。
前提条件
このチュートリアルに従うには、次のものが必要です。
- Ubuntu20.04初期サーバーセットアップガイドに従ってセットアップされた1つのUbuntu20.04サーバー。sudo対応の非rootユーザーとファイアウォールが含まれます。
ステップ1—Neo4jをインストールする
公式のUbuntuパッケージリポジトリには、Neo4jデータベースエンジンのコピーは含まれていません。 Neo4jからアップストリームでサポートされているパッケージをインストールするには、Neo4jリポジトリを指す新しいパッケージソースを追加し、Neo4jからGPGキーを追加してダウンロードが有効であることを確認してから、パッケージをインストールします。
開始するには、既存のパッケージのリストを更新します。
- sudo apt update
次に、いくつかの前提条件パッケージをインストールします。これにより、apt
はHTTPS接続を使用してパッケージをインストールできます。 システムにはすでにこれらのパッケージがデフォルトでインストールされている場合がありますが、とにかく次のコマンドを実行しても安全です。
- sudo apt install apt-transport-https ca-certificates curl software-properties-common
次に、公式のNeo4jパッケージリポジトリのGPGキーをシステムに追加します。 このキーにより、アップストリームリポジトリからインストールされたNeo4jパッケージを信頼できるようになります。 次のコマンドを実行して、キーをインストールします。
- curl -fsSL https://debian.neo4j.com/neotechnology.gpg.key | sudo apt-key add -
次に、Neo4j4.1リポジトリをシステムのAPTソースに追加します。
- sudo add-apt-repository "deb https://debian.neo4j.com stable 4.1"
次のステップは、Neo4jパッケージとそのすべての依存関係をインストールすることです。 この手順では、互換性のあるJavaパッケージをダウンロードしてインストールするため、apt
コマンドですべての依存関係をインストールするように求められたら、Y
と入力できます。
- sudo apt install neo4j
インストールプロセスが完了すると、Neo4jが実行されているはずです。 ただし、システムの再起動時に開始するようには設定されていません。 したがって、最後のセットアップ手順は、サービスとして有効にすることです。
- sudo systemctl enable neo4j.service
これらの手順をすべて完了したら、systemctl
コマンドを使用してNeo4jのステータスを調べます。
- sudo systemctl status neo4j.service
次のような出力が必要です。
Output● neo4j.service - Neo4j Graph Database
Loaded: loaded (/lib/systemd/system/neo4j.service; enabled; vendor preset: enabled)
Active: active (running) since Fri 2020-08-07 01:43:00 UTC; 6min ago
Main PID: 21915 (java)
Tasks: 45 (limit: 1137)
Memory: 259.3M
CGroup: /system.slice/neo4j.service
. . .
他にも詳細な出力行がありますが、注意すべき重要な点は、強調表示されたenabled
およびrunning
行です。 Neo4jをインストールして実行したら、次の一連の手順に進むことができます。この手順では、Neo4jへの接続、資格情報の構成、およびデータベースへのノードの挿入について説明します。
ステップ2—Neo4jへの接続と構成
Neo4jがインストールされ、再起動後に実行するように構成されたので、データベースへの接続をテストし、管理者の資格情報を構成できます。
コマンドラインでNeo4jを操作するには、cypher-shell
ユーティリティを使用します。 次のようなユーティリティを呼び出します。
- cypher-shell
シェルを最初に呼び出すときは、デフォルトの管理neo4j
ユーザーとneo4j
パスワードの組み合わせを使用してログインします。 認証されると、Neo4jは管理者パスワードを変更するように促します。
cypher-shell promptusername: neo4j
password: *****
Password change required
new password: ********************
Connected to Neo4j 4.1.0 at neo4j://localhost:7687 as user neo4j.
Type :help for a list of available commands or :exit to exit the shell.
Note that Cypher queries must end with a semicolon.
neo4j@neo4j>
この例では、強調表示された********************
は、新しいパスワードのマスクされたバージョンです。 強力で覚えやすいパスワードを選択し、安全な場所に記録してください。 パスワードを設定すると、インタラクティブなneo4j@neo4j>
プロンプトに接続され、ノードを挿入してクエリを実行することでNeo4jデータベースを操作できます。
注:Neo4jのCommunity Editionは、一度に1つのデータベースの実行をサポートします。 さらに、コミュニティバージョンには、ユーザーに役割と権限を割り当てる機能が含まれていないため、これらの手順はこのチュートリアルには含まれていません。 Neo4jのCommunityEditionでサポートされているさまざまな機能の詳細については、Neo4jのドキュメントはこちらを参照してください。
管理者パスワードを設定し、Neo4jへの接続をテストしたので、:exit
と入力して、cypher-shell
プロンプトを終了します。
- :exit
次に、オプションで、リモート接続を受け入れるようにNeo4jを構成できます。
ステップ3(オプション)—リモートアクセス用にNeo4jを構成する
複数のサーバーを使用するより大きなアプリケーションまたは環境にNeo4jを組み込みたい場合は、他のシステムからの接続を受け入れるように構成する必要があります。 このステップでは、リモート接続を許可するようにNeo4jを構成します。また、ファイアウォールルールを追加して、Neo4jサーバーに接続できるシステムを制限します。
デフォルトでは、Neo4jはlocalhost
からの接続のみを受け入れるように構成されています(127.0.0.1
はlocalhost
のIPアドレスです)。 この構成により、Neo4jサーバーがパブリックインターネットに公開されず、ローカルシステムにアクセスできるユーザーのみがNeo4jと対話できるようになります。
Neo4jが使用するネットワークソケットをlocalhost
から他のシステムが使用できるものに変更するには、/etc/neo4j/neo4j.conf
ファイルを編集する必要があります。 好みのエディターで構成ファイルを開き、dbms.default_listen_address
設定を見つけます。 次の例では、nano
を使用してファイルを編集します。
- sudo nano /etc/neo4j/neo4j.conf
コメントアウトされた#dbms.default_listen_address=0.0.0.0
行を見つけ、先頭の#
コメント文字を削除してコメントを解除します。
. . .
#*****************************************************************
# Network connector configuration
#*****************************************************************
# With default configuration Neo4j only accepts local connections.
# To accept non-local connections, uncomment this line:
dbms.default_listen_address=0.0.0.0
. . .
デフォルトでは、値0.0.0.0
は、localhost
を含む、システムで使用可能なすべてのIPv4インターフェースにNeo4jをバインドします。 Neo4jを特定のIPアドレス(サーバーがデータパスに使用するプライベートネットワークIPなど)に制限する場合は、サーバーのプライベートネットワークインターフェイスに割り当てられているIPアドレスをここで指定します。
IPv6インターフェースを使用するようにNeo4jを構成することもできます。 IPv4と同様に、default_listen_address
値を、Neo4jとの通信に使用する特定のIPv6アドレスに設定できます。 サーバーのローカルIPv6アドレスのみを使用するようにNeo4jを制限する場合は、IPv6表記を使用するlocalhost
に対応する::1
を指定します。
Neo4jが接続に使用するデフォルトのIPアドレスの構成が完了したら、neo4j.conf
を保存して閉じます。 nano
を使用している場合は、CTRL+X
、Y
、ENTER
の順に押すと使用できます。
注:IPv6アドレスを使用してNeo4jを構成した場合、IPv6アドレスを使用してcypher-shell
を使用してNeo4jに直接接続することはできません。 代わりに、IPv6アドレスに解決されるDNS名を構成するか、アドレスを名前にマップするエントリをリモートシステムの/etc/hosts
ファイルに追加する必要があります。 これで、DNSまたはhostsファイル名を使用して、リモートシステムからIPv6を使用してNeo4jに接続できるようになります。
たとえば、2001:db8::1
のようなIPv6アドレスを持つNeo4jサーバーでは、リモート接続システムに次のような/etc/hosts
エントリが必要であり、強調表示されたyour_hostname
の代わりに名前を使用します。 ]:
. . .
2001:db8::1 your_hostname
次に、次のように指定した名前を使用して、リモートシステムからサーバーに接続します。
- cypher-shell -a 'neo4j://your_hostname:7687'
Neo4jが::1
のIPv6localhost
アドレスを使用するように制限している場合は、/etc/hosts
ファイルは次のようになります:
- cypher-shell -a 'neo4j://ip6-localhost:7687'
接続URIを使用してcypher-shell
を呼び出すと、通常どおりユーザー名とパスワードの入力を求められます。
リモート接続を許可するようにNeo4jを構成したので、信頼できるシステムのみが接続できるようにリモートアクセスを制限することが重要です。 Neo4jへのリモートアクセスを制限するには、UbuntuのデフォルトのUFWファイアウォールを使用できます。 前提条件Ubuntu20.04チュートリアルを使用したサーバーの初期設定に従った場合、UFWはすでにインストールされており、サーバーで使用できるようになっています。
Neo4jは、デフォルトのインストールで2つのネットワークソケットを作成します。1つは組み込みのHTTPインターフェイス用のポート7474に、もう1つはポート7687にメインのボルトプロトコルです。 Neo4jは、本番環境でHTTPポートを使用しないことを推奨しているため、ポート7687のみのファイアウォールルールを作成します。
信頼できるリモートホストがIPv4を使用してbolt
インターフェイスにアクセスできるようにファイアウォールを構成するには、次のコマンドを入力します。
- sudo ufw allow from 203.0.113.1 to any port 7687 proto tcp
強調表示された203.0.113.1値の代わりに、Neo4jへのアクセスに使用する信頼できるリモートシステムのIPアドレスに置き換えます。
プライベート管理やデータパスネットワークなど、ネットワーク範囲全体へのアクセスを許可する場合は、次のようなルールを使用します。
- sudo ufw allow from 192.0.2.0/24 to any port 7687 proto tcp
ここでも、強調表示された 192.0.2.0/24 ネットワークの代わりに、Neo4jにアクセスしたいネットワークに置き換えます。
ホストがIPv6を使用してNeo4jにリモートでアクセスできるようにする場合は、次のようなルールを追加します。
- sudo ufw allow from 2001:DB8::1/128 to any port 7687 proto tcp
強調表示された2001:DB8::1/128
アドレスの代わりに、信頼できるシステムのIPv6アドレスを使用してください。
IPv4と同様に、Neo4jサーバーへのさまざまなIPv6アドレスのアクセスを許可することもできます。 これを行うには、次のようなUFWルールを作成します。
- sudo ufw allow from 2001:DB8::/32 to any port 7687 proto tcp
強調表示された2001:DB8::/32
ネットワーク範囲の代わりに、信頼できるネットワーク範囲に置き換えてください。
ネットワーク構成と信頼できるホストまたはネットワークに適切なUFWルールを作成したら、UFWを有効にしてルールを有効にします。
- sudo ufw reload
ufw status
コマンドを使用して、現在ロードされているUFWルールを調べることができます。 これを実行して、指定したアドレスまたはネットワークがポート7687でNeo4jにアクセスできることを確認します。
- sudo ufw status
次のような出力が必要です。
OutputStatus: active
To Action From
-- ------ ----
22/tcp ALLOW Anywhere
22/tcp (v6) ALLOW Anywhere (v6)
7687/tcp ALLOW 203.0.113.1
これで、信頼できるリモートサーバーまたはネットワークへのポート7687でのアクセスを許可するように構成されたNeo4jサーバーができました。 このチュートリアルの次のセクションでは、データベースへのノードの追加と、ノード間の関係を定義する方法について学習します。
ステップ4—Neo4jを使用する
Neo4jの使用を開始するには、いくつかのサンプルノードを追加してから、それらの間の関係を定義しましょう。 cypher-shell
を使用してNeo4jに接続します。
- cypher-shell
注:[ステップ3(オプション)—リモートアクセス用のNeo4jの構成](ステップ-3-optional-configuring-neo4j-for-remote-access]でリモートアクセスを許可するようにNeo4jを構成した場合は、 Neo4jサーバーのアドレスに対応するURI。 たとえば、Neo4jサーバーのIPが203.0.113.1
の場合、リモートシステムから次のように接続します。
- cypher-shell -a 'neo4j://203.0.113.1:7687'
通常どおり、ユーザー名とパスワードの入力を求められます。
IPv6を使用している場合は、手順3で説明した名前の/etc/hosts
エントリがあることを確認してください。 次に、次のようなcypher-shell
コマンドを使用して、リモートシステムからNeo4jサーバーに接続します。
- cypher-shell -a 'neo4j://your_hostname:7687'
繰り返しになりますが、強調表示されたyour_hostname
が、リモートシステムの/etc/hosts
ファイルにあるNeo4jサーバーのIPv6アドレスにマップされていることを確認してください。
ユーザー名とパスワードを使用してNeo4jにログインすると、ノードと関係をデータベースに照会して追加できます。
開始するには、Neo4jにホオジロザメノードを追加します。 次のコマンドは、Great White
という名前のShark
タイプのノードを作成します。
- CREATE (:Shark {name: 'Great White'});
各コマンドの後に、次のような出力が表示されます。
Output0 rows available after 3 ms, consumed after another 0 ms
Added 1 nodes, Set 1 properties, Added 1 labels
注:次のcypher
クエリのそれぞれの完全な説明は、このチュートリアルの範囲を超えています。 cypher
クエリ言語の構文の詳細については、 Neo4j CypherManualを参照してください。
次に、サメをさらに追加し、FRIEND
という関係を使用してそれらを関連付けます。 Neo4jを使用すると、ノードを任意の名前の関係に関連付けることができるため、FRIEND
は、使用する関係の任意のラベルにすることができます。
次の例では、3つのサメを追加し、FRIEND
という関係を使用してそれらをリンクします。
- CREATE
- (:Shark {name: 'Hammerhead'})-[:FRIEND]->
- (:Shark {name: 'Sammy'})-[:FRIEND]->
- (:Shark {name: 'Megalodon'});
3つの新しいサメがデータベースに追加されたことを示す出力を受け取るはずです。
Output. . .
Added 3 nodes, Created 2 relationships, Set 3 properties, Added 3 labels
Neo4jでは、関係に任意の名前を使用してノードを関連付けることができるため、既存のFRIEND
関係に加えて、サミーとメガロドンを分類学的ランクを使用して関連付けることもできます。
サミーとメガロドンは、ネズミザメの共通の順序を共有しています。 リレーションシップはノードと同じようにプロパティを持つことができるため、Lamniformes
に設定されたname
プロパティを使用してORDER
リレーションシップを作成し、サミーとメガロドンのリレーションシップの1つを説明します。
- MATCH (a:Shark),(b:Shark)
- WHERE a.name = 'Sammy' AND b.name = 'Megalodon'
- CREATE (a)-[r:ORDER { name: 'Lamniformes' }]->(b)
- RETURN type(r), r.name;
その関係を追加すると、次のような出力が得られます。
Output+-------------------------+
| type(r) | r.name |
+-------------------------+
| "ORDER" | "Lamniformes" |
+-------------------------+
1 row available after 2 ms, consumed after another 7 ms
Created 1 relationships, Set 1 properties
次に、Selachimorphaである分類学的スーパーオーダーに基づいて、SammyとHammerheadの間にSUPERORDER
関係を追加します。 この場合も、関係にはname
プロパティが与えられ、Selachimorpha
に設定されます。
- MATCH (a:Shark),(b:Shark)
- WHERE a.name = 'Sammy' AND b.name = 'Hammerhead'
- CREATE (a)-[r:SUPERORDER { name: 'Selachimorpha'}]->(b)
- RETURN type(r), r.name;
ここでも、関係のタイプを示す出力と、関係を説明するために追加された名前が表示されます。
Output+--------------------------------+
| type(r) | r.name |
+--------------------------------+
| "SUPERORDER" | "Selachimorpha" |
+--------------------------------+
1 row available after 2 ms, consumed after another 8 ms
Created 1 relationships, Set 1 properties
最後に、これらすべてのノードと関係が定義され、Neo4jに格納されている状態で、次のクエリを使用してデータを調べます。
- MATCH (a)-[r]->(b)
- RETURN a.name,r,b.name
- ORDER BY r;
次のような出力を受け取るはずです。
Output+---------------------------------------------------------------------+
| a.name | r | b.name |
+---------------------------------------------------------------------+
| "Hammerhead" | [:FRIEND] | "Sammy" |
| "Sammy" | [:FRIEND] | "Megalodon" |
| "Sammy" | [:ORDER {name: "Lamniformes"}] | "Megalodon" |
| "Sammy" | [:SUPERORDER {name: "Selachimorpha"}] | "Hammerhead" |
+---------------------------------------------------------------------+
4 rows available after 72 ms, consumed after another 1 ms
出力には、Hammerhead、Sammy、およびMegalodonの間で定義されたFRIEND
の関係、およびORDER
とSUPERORDER
の分類学的関係が含まれます。
Neo4jデータベースへのノードと関係の追加と調査が終了したら、:exit
コマンドを入力して、cypher-shell
を終了します。
結論
これで、サーバー上のNeo4jにデータがインストール、構成、および追加されました。 また、オプションで、リモートシステムからの接続を受け入れるようにNeo4jを構成し、UFWを使用して保護しました。
Neo4jとcypher
クエリ言語の使用について詳しく知りたい場合は、公式のNeo4jドキュメントを参照してください。