導入
第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、購入のdateやamount)
他の例として、SNSのフォロー関係に「フォローした日時」を持たせたり、経路探索で道路の「距離」や「所要時間」をリレーションシップの重み(weight)として持たせたりするのも同じ考え方です。
MATCH (a:Station {name: 'A駅'}), (b:Station {name: 'B駅'})
MERGE (a)-[:CONNECTS {distanceKm: 3.2, minutes: 5}]->(b)
このように関係そのものに数値を持たせられることは、経路探索(第8章)や重み付きのレコメンド計算などで非常に重要になります。