Neo4j 密码 "at least 2 directors and at least 5 actors"

Neo4j Cypher "at least 2 directors and at least 5 actors"

哪部电影至少有 2 位导演和至少 5 位演员?到目前为止得到这个但它给了我错误的答案。它给出了太多的电影和计数。

MATCH (a:Person)-[:ACTED_IN]->(m:Movie)<-[:DIRECTED]-(d:Person) WITH m, count(a) AS numAct, count(d) AS numDir WHERE numAct >= 5 AND numDir >= 2 RETURN  m.title, numDir AS director_count, numAct AS actor_count

有什么问题吗?

聚合部分的工作方式是按电影节点分组'm'。在这部分,

...WITH m, count(a) AS numAct, count(d) AS numDir...

它将电影、演员和导演收集为单独的行,电影、演员和导演的每种组合一行,然后计算行数。如果你运行,

MATCH (a:Person)-[:ACTED_IN]->(m:Movie)<-[:DIRECTED]-(d:Person) 
RETURN m, a, d

您将准确看到计数聚合将处理的行

要解决您的问题,您必须更新密码,分解聚合。一种方法是,

MATCH (a:Person)-[:ACTED_IN]->(m:Movie) WITH m, count(a) AS numAct
MATCH (m)<-[:DIRECTED]-(d:Person) WITH m, numAct, count(d) as numDir
WHERE numAct >= 5 AND numDir >= 2 
RETURN  m.title, numDir AS director_count, numAct AS actor_count

根据@Graphileon 的观察更新

我想最短的路是

MATCH (m:Movie)
WHERE size([(m)<-[:DIRECTED]-(p:Person) | p]) >= 2
      AND size([(m)<-[:ACTED_IN]-(p:Person) | p]) >= 5
RETURN m