我正在学习Cypher / Neo4j,正在玩电影图形数据集。我想了解如何编写与更复杂的子图匹配的语句并返回整个子图。
例如,如果我想演戏并导演同一部电影的人的子图,我可以使用:
MATCH (m:Movie) <-[:DIRECTED]-(p:Person) -[:ACTED_IN]-> (m:Movie)
RETURN *
但是,这仅是因为我要查找的子图是一条直线。如果我想对以上内容进行扩展,以匹配以下角色的人物的子图:A:导演过他们执导的电影,B:在特定电影中执导(电影X),我不知道该怎么做。我知道我可以使用WHERE语句来过滤出演员没有在“电影X”中动作的子图,但这不会返回代表“电影X”的节点。
我想知道是否有一种方法可以构造这样的查询-类似下面的内容:
MATCH (p:Person) -[:ACTED_IN]-> (m:Movie) AND
(p:Person) -[:DIRECTED]-> (m:Movie) AND
(p:Person)-[:ACTED_IN]->(:Movie {title: 'Movie X'})
RETURN *
您绝对在正确的道路上。尝试一下
MATCH (p:Person)-[:ACTED_IN]->(m:Movie)
WHERE (p)-[:DIRECTED]->(m)
AND (p)-[:ACTED_IN]->(:Movie {title: 'Movie X'})
RETURN *
在这种情况下,因为您已经知道您想要在电影X中扮演角色的人,所以在这种特定情况下,更好的方法是立即匹配“电影X”,例如...
MATCH (p:Person)-[:ACTED_IN]->(m:Movie {title: 'Movie X'})
WHERE (p)-[:DIRECTED]->(m)
RETURN *
为了返回“ Movie X”(尽管它应该是已经匹配的电影之一,您需要在MATCH
语句中标识它。YOu可以执行以下操作……
MATCH (p:Person)-[:ACTED_IN]->(m:Movie)
WHERE (p)-[:DIRECTED]->(m)
WITH p, m
MATCH (p)-[:ACTED_IN]->(m2:Movie {title: 'Hoffa'})
RETURN p, m, m2