本文へスキップ
BecomeCoder

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

関係の向きをたどる ― --> / <-- / --

ブラウザで完結

導入

リレーションシップには向きがありますが、Cypherではその向きを「指定する」か「気にしない」かを選べます。ここで3つの書き方の違いを整理しておきましょう。

説明

graph LR
    subgraph forward["--> 順方向"]
        a1["(a)"] -- "TYPE" --> b1["(b)"]
    end
  • (a)-[:TYPE]->(b)a から b へ向かう向きのリレーションシップだけに一致する。
  • (a)<-[:TYPE]-(b)b から a へ向かう(=矢印が左向き)リレーションシップだけに一致する。
  • (a)-[:TYPE]-(b)向きを問わずab の間に TYPE のリレーションシップがあればどちらの向きでも一致する。

たとえば「アリスが出演した映画」を探すときは、ACTED_IN の向きが Person → Movie と決まっているので、向きを指定して書くのが自然です。

MATCH (a:Person {name: 'Alice'})-[:ACTED_IN]->(m:Movie)
RETURN m.title

一方、「誰と誰が知り合いか」を、どちらが先に知り合ったかを問わずに一覧したい場合は、向きなしの -- を使うことがあります。

MATCH (a:Person)-[:KNOWS]-(b:Person)
RETURN a.name, b.name

ただし向きなしで書くと、(a)-[:KNOWS]->(b)(a)<-[:KNOWS]-(b) の両方に一致してしまうため、同じペアが2回(逆向きで)返ってくることがあります。件数を正確に数えたいときなどは注意が必要です。基本は「向きが意味を持つ関係は向きを指定し、向きを問わない関係だけ -- を使う」と覚えておきましょう。

実際に動かしてみよう

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

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

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