本文へスキップ
BecomeCoder

Neo4jコース · 第7章 グラフのデータモデリング · レッスン36

関係にもプロパティを ― 重み・日付・役柄

ブラウザで完結

導入

第2章のプロパティグラフモデルで触れたとおり、リレーションシップにもプロパティを持たせられます。この章では、「情報をノードに持たせるか、関係に持たせるか」の判断基準を掘り下げます。

説明

「Keanu Reeves は The Matrix で『Neo』という役を演じた」という情報を考えてみましょう。「役名(role)」は、Keanu Reeves という人物そのものの属性でも、The Matrix という映画そのものの属性でもなく、「その人がその映画に出演したという関係」の属性です。

MATCH (p:Person {name: 'Keanu Reeves'}), (m:Movie {title: 'The Matrix'})
MERGE (p)-[r:ACTED_IN]->(m)
SET r.role = 'Neo'
graph LR
    p["(:Person<br/>Keanu Reeves)"] -- "ACTED_IN<br/>role: 'Neo'" --> m["(:Movie<br/>The Matrix)"]

このように、情報をノードに持たせるかリレーションシップに持たせるかは、次の基準で判断します。

  • その情報が 単独のもの(人物や映画そのもの)を説明する なら → ノードのプロパティ(例: 人物の born、映画の released
  • その情報が 2つのものの関係を説明する なら → リレーションシップのプロパティ(例: 出演での role、知り合ってからの since、購入の dateamount

他の例として、SNSのフォロー関係に「フォローした日時」を持たせたり、経路探索で道路の「距離」や「所要時間」をリレーションシップの重み(weight)として持たせたりするのも同じ考え方です。

MATCH (a:Station {name: 'A駅'}), (b:Station {name: 'B駅'})
MERGE (a)-[:CONNECTS {distanceKm: 3.2, minutes: 5}]->(b)

このように関係そのものに数値を持たせられることは、経路探索(第8章)や重み付きのレコメンド計算などで非常に重要になります。

実際に動かしてみよう

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

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

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