導入
リレーションシップには向きがありますが、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)… 向きを問わず、aとbの間に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回(逆向きで)返ってくることがあります。件数を正確に数えたいときなどは注意が必要です。基本は「向きが意味を持つ関係は向きを指定し、向きを問わない関係だけ -- を使う」と覚えておきましょう。