我是Neo4J和Cypher的新手,因此决定尝试安装Neo4J桌面时提供的电影样本数据。
我想运行一个非常简单的查询,即检索涉及3个人的电影的标题, Liv Tyler,Charlize Theron和Bonnie Hunt 。配对两个人不是问题(请参见下面的代码),但是要包括三个人则很困难。
在SQL中,这对我来说不是问题,但是Cypher引起了严重的麻烦。到目前为止,这是查询:
MATCH (Person {name: "Liv Tyler"})-[:ACTED_IN]->(movie:Movie)<-[:DIRECTED]-(Person {name: "Bonnie Hunt"})
RETURN movie.title AS Title
我尝试使用AND
语句,但是没有任何效果。
那么如何在此查询中包括 Charlize Theron ?
答案 0 :(得分:1)
您可以使用多种模式将三个或更多连接匹配到单个节点。
您可以在查询中使用变量movie
来引用相同的Movie
节点以包含模式(:Person {name: "Charlize Thero"})-[:ACTED_IN]->(movie)
。
MATCH (:Person {name: "Liv Tyler"})-[:ACTED_IN]->(movie:Movie)<-[:DIRECTED]-(:Person {name: "Bonnie Hunt"}),
(:Person {name: "Charlize Theron"})-[:ACTED_IN]->(movie)
RETURN movie.title AS Title
您还可以按以下方式重写上面的查询:
MATCH (:Person {name: "Liv Tyler"})-[:ACTED_IN]->(movie:Movie),
(:Person {name: "Bonnie Hunt"})-[:DIRECTED]->(movie),
(:Person {name: "Charlize Theron"})-[:ACTED_IN]->(movie)
RETURN movie.title AS Title
答案 1 :(得分:0)
如果您有任意数量的actor(已参数化),而您无法对所涉及的:Person节点进行硬编码,则可以在:Person节点上将其名称与参数列表匹配,然后根据计数进行过滤找到的模式(您要确保将所有在电影中饰演的人物都计算在内)。
但是,如果我们首先对导演这样做,那么我们已经有一些电影比赛了,可以在演员名单上应用all()
谓词,以确保他们都在电影中演出。
假设有两个列表参数,一个用于演员,一个用于导演:
MATCH (director:Person)-[:DIRECTED]->(m:Movie)
WHERE director.name in $directors
WITH m, count(director) as directorCount
WHERE directorCount = size($directors)
AND all(actor IN $actors WHERE (:Person {name:actor})-[:ACTED_IN]->(m))
RETURN m.title as Title