简单Cypher查询的问题:复杂的match语句

时间:2019-06-04 10:30:01

标签: neo4j cypher

我是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

2 个答案:

答案 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