序章

Neo4j は、データノード間の関係を記録するグラフデータベースですが、従来のリレーショナルデータベースは、行と列を使用してデータを格納および構造化します。 各ノードは、接続されている他のすべてのノードへの参照を格納するため、Neo4jは、最小限のオーバーヘッドで複雑な関係をエンコードおよび照会できます。

前提条件

このチュートリアルに従うには、次のものが必要です。

ステップ1—Neo4jをインストールする

公式のUbuntuパッケージリポジトリには、Neo4jデータベースエンジンのコピーは含まれていません。 Neo4jからアップストリームでサポートされているパッケージをインストールするには、Neo4jリポジトリを指す新しいパッケージソースを追加し、Neo4jからGPGキーを追加してダウンロードが有効であることを確認してから、パッケージをインストールします。

開始するには、既存のパッケージのリストを更新します。

  1. sudo apt update

次に、いくつかの前提条件パッケージをインストールします。これにより、aptはHTTPS接続を使用してパッケージをインストールできます。 システムにはすでにこれらのパッケージがデフォルトでインストールされている場合がありますが、とにかく次のコマンドを実行しても安全です。

  1. sudo apt install apt-transport-https ca-certificates curl software-properties-common

次に、公式のNeo4jパッケージリポジトリのGPGキーをシステムに追加します。 このキーにより、アップストリームリポジトリからインストールされたNeo4jパッケージを信頼できるようになります。 次のコマンドを実行して、キーをインストールします。

  1. curl -fsSL https://debian.neo4j.com/neotechnology.gpg.key | sudo apt-key add -

次に、Neo4j4.1リポジトリをシステムのAPTソースに追加します。

  1. sudo add-apt-repository "deb https://debian.neo4j.com stable 4.1"

次のステップは、Neo4jパッケージとそのすべての依存関係をインストールすることです。 この手順では、互換性のあるJavaパッケージをダウンロードしてインストールするため、aptコマンドですべての依存関係をインストールするように求められたら、Yと入力できます。

  1. sudo apt install neo4j

インストールプロセスが完了すると、Neo4jが実行されているはずです。 ただし、システムの再起動時に開始するようには設定されていません。 したがって、最後のセットアップ手順は、サービスとして有効にすることです。

  1. sudo systemctl enable neo4j.service

これらの手順をすべて完了したら、systemctlコマンドを使用してNeo4jのステータスを調べます。

  1. 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ユーティリティを使用します。 次のようなユーティリティを呼び出します。

  1. cypher-shell

シェルを最初に呼び出すときは、デフォルトの管理neo4jユーザーとneo4jパスワードの組み合わせを使用してログインします。 認証されると、Neo4jは管理者パスワードを変更するように促します。

cypher-shell prompt
username: 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プロンプトを終了します。

  1. :exit

次に、オプションで、リモート接続を受け入れるようにNeo4jを構成できます。

ステップ3(オプション)—リモートアクセス用にNeo4jを構成する

複数のサーバーを使用するより大きなアプリケーションまたは環境にNeo4jを組み込みたい場合は、他のシステムからの接続を受け入れるように構成する必要があります。 このステップでは、リモート接続を許可するようにNeo4jを構成します。また、ファイアウォールルールを追加して、Neo4jサーバーに接続できるシステムを制限します。

デフォルトでは、Neo4jはlocalhostからの接続のみを受け入れるように構成されています(127.0.0.1localhostのIPアドレスです)。 この構成により、Neo4jサーバーがパブリックインターネットに公開されず、ローカルシステムにアクセスできるユーザーのみがNeo4jと対話できるようになります。

Neo4jが使用するネットワークソケットをlocalhostから他のシステムが使用できるものに変更するには、/etc/neo4j/neo4j.confファイルを編集する必要があります。 好みのエディターで構成ファイルを開き、dbms.default_listen_address設定を見つけます。 次の例では、nanoを使用してファイルを編集します。

  1. sudo nano /etc/neo4j/neo4j.conf

コメントアウトされた#dbms.default_listen_address=0.0.0.0行を見つけ、先頭の#コメント文字を削除してコメントを解除します。

/etc/neo4j/neo4j.conf
. . .
#*****************************************************************
# 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+XYENTERの順に押すと使用できます。

:IPv6アドレスを使用してNeo4jを構成した場合、IPv6アドレスを使用してcypher-shellを使用してNeo4jに直接接続することはできません。 代わりに、IPv6アドレスに解決されるDNS名を構成するか、アドレスを名前にマップするエントリをリモートシステムの/etc/hostsファイルに追加する必要があります。 これで、DNSまたはhostsファイル名を使用して、リモートシステムからIPv6を使用してNeo4jに接続できるようになります。

たとえば、2001:db8::1のようなIPv6アドレスを持つNeo4jサーバーでは、リモート接続システムに次のような/etc/hostsエントリが必要であり、強調表示されたyour_hostnameの代わりに名前を使用します。 ]:

/ etc / hosts
. . .
2001:db8::1 your_hostname

次に、次のように指定した名前を使用して、リモートシステムからサーバーに接続します。

  1. cypher-shell -a 'neo4j://your_hostname:7687'

Neo4jが::1のIPv6localhostアドレスを使用するように制限している場合は、/etc/hostsファイルは次のようになります:

  1. 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インターフェイスにアクセスできるようにファイアウォールを構成するには、次のコマンドを入力します。

UFWIPv4シングルホストの例
  1. sudo ufw allow from 203.0.113.1 to any port 7687 proto tcp

強調表示された203.0.113.1値の代わりに、Neo4jへのアクセスに使用する信頼できるリモートシステムのIPアドレスに置き換えます。

プライベート管理やデータパスネットワークなど、ネットワーク範囲全体へのアクセスを許可する場合は、次のようなルールを使用します。

UFWIPv4ネットワークの例
  1. sudo ufw allow from 192.0.2.0/24 to any port 7687 proto tcp

ここでも、強調表示された 192.0.2.0/24 ネットワークの代わりに、Neo4jにアクセスしたいネットワークに置き換えます。

ホストがIPv6を使用してNeo4jにリモートでアクセスできるようにする場合は、次のようなルールを追加します。

UFWIPv6シングルホストの例
  1. sudo ufw allow from 2001:DB8::1/128 to any port 7687 proto tcp

強調表示された2001:DB8::1/128アドレスの代わりに、信頼できるシステムのIPv6アドレスを使用してください。

IPv4と同様に、Neo4jサーバーへのさまざまなIPv6アドレスのアクセスを許可することもできます。 これを行うには、次のようなUFWルールを作成します。

UFWIPv6シングルホストの例
  1. sudo ufw allow from 2001:DB8::/32 to any port 7687 proto tcp

強調表示された2001:DB8::/32ネットワーク範囲の代わりに、信頼できるネットワーク範囲に置き換えてください。

ネットワーク構成と信頼できるホストまたはネットワークに適切なUFWルールを作成したら、UFWを有効にしてルールを有効にします。

  1. sudo ufw reload

ufw statusコマンドを使用して、現在ロードされているUFWルールを調べることができます。 これを実行して、指定したアドレスまたはネットワークがポート7687でNeo4jにアクセスできることを確認します。

  1. sudo ufw status

次のような出力が必要です。

Output
Status: 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に接続します。

  1. cypher-shell

:[ステップ3(オプション)—リモートアクセス用のNeo4jの構成](ステップ-3-optional-configuring-neo4j-for-remote-access]でリモートアクセスを許可するようにNeo4jを構成した場合は、 Neo4jサーバーのアドレスに対応するURI。 たとえば、Neo4jサーバーのIPが203.0.113.1の場合、リモートシステムから次のように接続します。

  1. cypher-shell -a 'neo4j://203.0.113.1:7687'

通常どおり、ユーザー名とパスワードの入力を求められます。

IPv6を使用している場合は、手順3で説明した名前の/etc/hostsエントリがあることを確認してください。 次に、次のようなcypher-shellコマンドを使用して、リモートシステムからNeo4jサーバーに接続します。

  1. cypher-shell -a 'neo4j://your_hostname:7687'

繰り返しになりますが、強調表示されたyour_hostnameが、リモートシステムの/etc/hostsファイルにあるNeo4jサーバーのIPv6アドレスにマップされていることを確認してください。

ユーザー名とパスワードを使用してNeo4jにログインすると、ノードと関係をデータベースに照会して追加できます。

開始するには、Neo4jにホオジロザメノードを追加します。 次のコマンドは、Great Whiteという名前のSharkタイプのノードを作成します。

  1. CREATE (:Shark {name: 'Great White'});

各コマンドの後に、次のような出力が表示されます。

Output
0 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という関係を使用してそれらをリンクします。

  1. CREATE
  2. (:Shark {name: 'Hammerhead'})-[:FRIEND]->
  3. (:Shark {name: 'Sammy'})-[:FRIEND]->
  4. (:Shark {name: 'Megalodon'});

3つの新しいサメがデータベースに追加されたことを示す出力を受け取るはずです。

Output
. . . Added 3 nodes, Created 2 relationships, Set 3 properties, Added 3 labels

Neo4jでは、関係に任意の名前を使用してノードを関連付けることができるため、既存のFRIEND関係に加えて、サミーとメガロドンを分類学的ランクを使用して関連付けることもできます。

サミーとメガロドンは、ネズミザメの共通の順序を共有しています。 リレーションシップはノードと同じようにプロパティを持つことができるため、Lamniformesに設定されたnameプロパティを使用してORDERリレーションシップを作成し、サミーとメガロドンのリレーションシップの1つを説明します。

  1. MATCH (a:Shark),(b:Shark)
  2. WHERE a.name = 'Sammy' AND b.name = 'Megalodon'
  3. CREATE (a)-[r:ORDER { name: 'Lamniformes' }]->(b)
  4. 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に設定されます。

  1. MATCH (a:Shark),(b:Shark)
  2. WHERE a.name = 'Sammy' AND b.name = 'Hammerhead'
  3. CREATE (a)-[r:SUPERORDER { name: 'Selachimorpha'}]->(b)
  4. 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に格納されている状態で、次のクエリを使用してデータを調べます。

  1. MATCH (a)-[r]->(b)
  2. RETURN a.name,r,b.name
  3. 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の関係、およびORDERSUPERORDERの分類学的関係が含まれます。

Neo4jデータベースへのノードと関係の追加と調査が終了したら、:exitコマンドを入力して、cypher-shellを終了します。

結論

これで、サーバー上のNeo4jにデータがインストール、構成、および追加されました。 また、オプションで、リモートシステムからの接続を受け入れるようにNeo4jを構成し、UFWを使用して保護しました。

Neo4jとcypherクエリ言語の使用について詳しく知りたい場合は、公式のNeo4jドキュメントを参照してください。