本文へスキップ
BecomeCoder

Neo4jコース · 第4章 データを検索する · レッスン19

友達の友達 ― 複数ホップのパターン

ブラウザで完結

導入

リレーションシップを2つ以上つなげて書くと、「何段階か先」のノードを一度にたどれます。第1章でも触れた「友達の友達」を、実際に書いてみましょう。

説明

MATCH (a:Person {name: 'Alice'})-[:KNOWS]->(friend:Person)-[:KNOWS]->(fof:Person)
RETURN DISTINCT fof.name AS friendOfFriend
graph LR
    a["(a:Person<br/>name:'Alice')"] -- KNOWS --> f["(friend:Person)"]
    f -- KNOWS --> fof["(fof:Person)"]

このパターンは、「Alice から KNOWS をたどった先(friend)から、さらに KNOWS をたどった先(fof)」という2ホップの経路を表しています。矢印を1つ増やすだけで、たどる段数を1段増やせることが分かります。

このとき、fof の中には Alice 自身や、Alice の直接の友達も含まれてしまうことがあります(AliceがBobを知っていて、BobがAliceを知っている場合など)。実務では、次のように「自分自身を除く」条件を加えることがよくあります。

MATCH (a:Person {name: 'Alice'})-[:KNOWS]->(:Person)-[:KNOWS]->(fof:Person)
WHERE fof <> a
RETURN DISTINCT fof.name AS friendOfFriend

第3章で触れた「RDBのJOINの地獄」と比べると、たどる段数が増えても -[:KNOWS]-> を追加するだけで済む、というシンプルさがここでも活きています。

実際に動かしてみよう

下のエディタに Cypher を書いて「実行」を押すと、ブラウザ内の学習用グラフDBで結果が表示されます(本物のNeo4jではなく、教材の範囲を再現した軽量な自作エンジンです)。最初から「映画と俳優+小さなソーシャルグラフ」が入っているので、MATCH 系の例はそのまま結果が返ります。CREATE / MERGE / SET などで書き換えた状態は積み重なり、「グラフを初期状態に戻す」でいつでもサンプルに戻せます。

Cypher — ブラウザ内で実行(学習用グラフDB)

Cypherクエリを書いて実行できる学習用グラフDBを読み込みます(本物のNeo4jではなく、教材の範囲を再現した軽量な自作エンジンです。映画と俳優の小さなサンプルグラフが最初から入っています)。
スクロールして表示された時点でも自動で読み込まれます。