我正在学习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: 'Movie X'})
RETURN p, m, m2
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句