首页 > 解决方案 > neo4j 匹配两个不同的关系并检索计数,同时避免笛卡尔积

问题描述

所以我有一个数据库,我想在其中检索具有“已审核”关系的结果,在这个结果中,我想检索具有“acted_in”关系的实体,并返回演员人数最多的电影。

这是我写的代码:

MATCH (a:Person)-[r2:REVIEWED]->(movie:Movie)<-[r:ACTED_IN]-(actors:Person) 
RETURN movie.title as Movie_name, count(actors) as no_of_cast 
ORDER BY no_of_cast DESC
Limit 1

它返回正确的电影名称,但演员的数量是评论者和表演者的笛卡尔积。

我在演员上收集功能后得到的结果是

"The Replacements"  ["Brooke Langton", "Keanu Reeves", "Orlando Jones", "Gene Hackman", "Brooke Langton", "Keanu Reeves", "Orlando Jones", "Gene Hackman", "Brooke Langton", "Keanu Reeves", "Orlando Jones", "Gene Hackman"]

它向演员重复该电影节点中存在“审查”关系的次数。

我怎样才能避免这种情况并获得正确的演员人数,即 4。谢谢。

标签: neo4jcartesian-product

解决方案


您获得多个/重复演员的原因是因为同一部电影正在被不止一个人(评论者)评论。要删除重复项,您可以使用关键字“DISTINCT”。

MATCH (a:Person)-[r2:REVIEWED]->(movie:Movie)<-[r:ACTED_IN]-(actors:Person) 
RETURN movie.title as Movie_name, count(distinct actors) as no_of_cast 
ORDER BY no_of_cast DESC

结果:

╒═══════════════════╤════════════╕
│&quot;Movie_name"       │&quot;no_of_cast"│
╞═══════════════════╪════════════╡
│&quot;The Replacements" │4           │
├───────────────────┼────────────┤
│&quot;Cloud Atlas"      │4           │
├───────────────────┼────────────┤
│&quot;The Da Vinci Code"│4           │
├───────────────────┼────────────┤
│&quot;The Birdcage"     │3           │
├───────────────────┼────────────┤
│&quot;Unforgiven"       │3           │
└───────────────────┴────────────┘

推荐阅读