Neo4jグラフデータベースクエリ

Neo4jグラフデータベースクエリ

  • オーケストレーション
6分で読めます 更新日 Mar 29, 2019

ポイント: Neo4jグラフデータベースクエリは、ノードとリレーションを作成するための構文例に焦点を当てた、Neo4jでのクエリ実行に関する詳細ガイドを提供します。

  • Neo4jサーバーを起動し、シェルを使用するための手順。
  • ノードを作成し、リレーションを確立するための例。
  • ノードおよびそのリレーションをクエリし、リストする方法。

前回のブログ投稿では、Neo4jを紹介しました。ここではクエリを説明します。まず、サーバーを起動し、その後シェルを開きます:

    cd neo4j bin

./neo4j start

./cypher-shell   -a bolt://localhost:7687  -u neo4j  -p xxx

ノードとリレーションの作成

ここでは2つのノードを作成します。それぞれに友人というラベルと名前プロパティがあります。リレーションは、プロパティを持つこともできます。

    CREATE (x:Friends { name: 'Walker' }) 
CREATE (y:Friends { name: 'Stephen' }) 
return x,y;

+------------------------------------------------------------+
| x                           | y                            |
+------------------------------------------------------------+
| (:Friends {name: "Walker"}) | (:Friends {name: "Stephen"}) |
+------------------------------------------------------------+

1 row available after 15 ms, consumed after another 0 ms
Added 2 nodes, Set 2 properties, Added 2 labels

注意:スペルと大文字小文字は重要です。Neo4jは何かが間違ってスペルされていると警告を出しません。したがって、たとえば、リレーションシップを作成するときは、注意を払ってください。何も警告がない状態で空になります。各ステートメントの後に作成されたxリレーションとx行が利用可能を確認して、それが機能したかどうかを確認します。次に、スティーブンからウォーカーへのリレーションシップ(エッジと呼ばれる)を作成します。このリレーションには任意の名前Friendを付けます。オブジェクトの前にx、y、rを付けて、次のステップで参照できるようにします。これは短縮記法です。また、作成されたオブジェクトをスコープに持ち込みます。リレーションを作成する手順は、ノードをMATCHとWHEREステートメントで結びつけ、その後、リレーションの方向を示すCREATEを発行することです。あるいは、双方向の場合は単純な線を用います。たとえば、スティーブンがウォーカーの友人であれば、ウォーカーもスティーブンの友人です。したがって、矢印は単純な線である可能性があります。クエリ(すなわちMATCH)ステートメントで方向を示したいときは、二重線--、→、←を使用しますが、作成ステートメントでは使用しません。

    MATCH (x:Friends),(y:Friends)
WHERE y.name = "Stephen" AND x.name = "Walker"
CREATE (x)-[r:Friend]->(y)
RETURN type(r);

+----------+
| type(r)  |
+----------+
| "Friend" |
+----------+

すべての友人ノードをリスト

今、異なるクエリを試してみましょう。これにより、私たちはWHERE条件を与えなかったため、すべてのノードをリストします。

    match(n:Friends)
       return n;
+------------------------------+
| n                            |
+------------------------------+
| (:Friends {name: "Walker"})  |
| (:Friends {name: "Stephen"}) |
+------------------------------+

すべての友人リレーションをリストします。

    MATCH (a:Friends)-[:Friend]->(b:Friends)
       RETURN a.name, b.name;
+----------------------+
| a.name   | b.name    |
+----------------------+
| "Walker" | "Stephen" |
+----------------------+

ラージをスティーブンの友人にします。

    CREATE (y:Friends { name: 'Raj' }); 

MATCH (x:Friends),(y:Friends)
WHERE y.name = "Stephen" AND x.name = "Raj"
CREATE (x)-[r:Friend]->(y)
RETURN type(r);

コマンド(主にMATCHステートメント)が機能したことを、返された数に注意を払うことで確認します。スペルミスや大文字小文字のエラーについて覚えておいてください。

    1 row available after 3 ms, consumed after another 0 ms
Created 1 relationships

すべての友人関係を表示します。今、私たちが追加したものが含まれています

    MATCH (a:Friends)-[r:Friend]->(b:Friends)
       RETURN a.name, b.name;
+----------------------+
| a.name   | b.name    |
+----------------------+
| "Walker" | "Stephen" |
| "Raj"    | "Stephen" |
+----------------------+

もう1つ、テレサを追加し、彼女をラージの友人にします。

    CREATE (x:Friends { name: 'Teresa' }) 
return x;

MATCH (x:Friends),(y:Friends)
WHERE y.name = "Stephen" AND x.name = "Raj"
CREATE (x)-[r:Friend]->(y);

MATCH (x:Friends),(y:Friends)
WHERE y.name = "Raj" AND x.name = "Teresa"
CREATE (x)-[r:Friend]->(y)
RETURN type(r);

以下に示すのは、互いの友人でない友人です。それはテレサとスティーブンが友人でないことを意味します。これを数学的な観点から表現すると、集合uとnotFriendの交差点を探し、次にその交差点の外にあるオブジェクトを見つけるためにWHERE NOTを適用します。友人を思い出すために、これを見やすくするために、まず:

    Match (a:Friends)--(b)
       return a,b;
+-------------------------------------------------------------+
| a                            | b                            |
+-------------------------------------------------------------+
| (:Friends {name: "Walker"})  | (:Friends {name: "Stephen"}) |
| (:Friends {name: "Stephen"}) | (:Friends {name: "Raj"})     |
| (:Friends {name: "Stephen"}) | (:Friends {name: "Raj"})     |
| (:Friends {name: "Stephen"}) | (:Friends {name: "Walker"})  |
| (:Friends {name: "Raj"})     | (:Friends {name: "Teresa"})  |
| (:Friends {name: "Raj"})     | (:Friends {name: "Stephen"}) |
| (:Friends {name: "Raj"})     | (:Friends {name: "Stephen"}) |
| (:Friends {name: "Teresa"})  | (:Friends {name: "Raj"})     |
+-------------------------------------------------------------+

友人でない友人のクエリは、テレサとスティーブンをリストします。なぜなら、テレサはスティーブンの友人ではないからです。言い換えれば、クエリの最初の部分は、変数uにリストされている人々のすべてのリレーションを示し、その後にuにいない人をリストします。

    Match (u:Friends)-[:Friend]->(:Friends)-[:Friend]->(notFriend:Friends)
       WHERE NOT (u)-[:Friend]->(notFriend)
       RETURN u, notFriend;
+------------------------------------------------------------+
| u                           | notFriend                    |
+------------------------------------------------------------+
| (:Friends {name: "Teresa"}) | (:Friends {name: "Stephen"}) |
| (:Friends {name: "Teresa"}) | (:Friends {name: "Stephen"}) |
+------------------------------------------------------------+

指向性リレーション

今、私たちはFriend A < - Friend Bの逆方向のリレーションシップを作成します。これはFriend A -> Friend Bの代わりに、CREATEステートメントの最初の位置に方向矢印を配置することによって行います。

    MATCH (x:Friends),(y:Friends)
WHERE y.name = "Raj" AND x.name = "Teresa"
CREATE (x)< -[r:Friend]-(y)
RETURN type(r);

今、すべてのリレーションをリストします。最初は左側、その後非指向性、右方向に進みます。友人ノードから他のノードへの外向きリレーションシップは、ノードが同じであるため、内向きリレーションシップと同じです。したがって、最初と最後のクエリは同じ4つのリレーションをリストします。そして、双方向クエリは8つをリストします。内向きと外向きの両方がリレーションとして認識されるためであり、これは--という意味です。これを理解するのが簡単になるのは、ノードの一方を顧客、もう一方をアカウントマネージャーと呼んだ場合です。論理的な対称性はありません。このような例を今後のブログ投稿で構築していきます。

    Match (a:Friends)< --(b) return a,b; +------------------------------------------------------------+ | a | b | +------------------------------------------------------------+ | (:Friends {name: "Stephen"}) | (:Friends {name: "Raj"}) | | (:Friends {name: "Stephen"}) | (:Friends {name: "Raj"}) | | (:Friends {name: "Stephen"}) | (:Friends {name: "Walker"}) | | (:Friends {name: "Raj"}) | (:Friends {name: "Teresa"}) | +------------------------------------------------------------+ Match (a:Friends)--(b) return a,b; +-------------------------------------------------------------+ | a | b | +-------------------------------------------------------------+ | (:Friends {name: "Walker"}) | (:Friends {name: "Stephen"}) | | (:Friends {name: "Stephen"}) | (:Friends {name: "Raj"}) | | (:Friends {name: "Stephen"}) | (:Friends {name: "Raj"}) | | (:Friends {name: "Stephen"}) | (:Friends {name: "Walker"}) | | (:Friends {name: "Raj"}) | (:Friends {name: "Teresa"}) | | (:Friends {name: "Raj"}) | (:Friends {name: "Stephen"}) | | (:Friends {name: "Raj"}) | (:Friends {name: "Stephen"}) | | (:Friends {name: "Teresa"}) | (:Friends {name: "Raj"}) | +-------------------------------------------------------------+ 8 rows available after 22 ms, consumed after another 2 ms Match (a:Friends)-->(b)
       return a,b;
+------------------------------------------------------------+
| a                           | b                            |
+------------------------------------------------------------+
| (:Friends {name: "Walker"}) | (:Friends {name: "Stephen"}) |
| (:Friends {name: "Raj"})    | (:Friends {name: "Stephen"}) |
| (:Friends {name: "Raj"})    | (:Friends {name: "Stephen"}) |
| (:Friends {name: "Teresa"}) | (:Friends {name: "Raj"})     |
+------------------------------------------------------------+

4 rows available after 24 ms, consumed after another 2 ms

これらの投稿は私自身のものであり、BMCの立場、戦略、または意見を必ずしも代表するものではありません。

オーケストレーションの関連記事

BMCからのさらなる情報に興味がありますか?

ザ・ブリーフは、メインフレームとエンタープライズオーケストレーションに関する月刊メールです:研究、顧客ストーリー、製品ニュース、イベント。

このオファーに登録することで、あなたはBMCのプライバシーポリシーを読み、同意したことを確認します。

ザ・ブリーフに登録しました

ザ・ブリーフは、メインフレームとエンタープライズオーケストレーション—BMC AMIおよびControl-M—に関するアナリストの研究、顧客の展開、両者にわたるイベントを網羅しています。