所以我有一个数据库,我想在其中检索具有以下关系的结果"已审核";并且在该结果中,我想要检索具有关系"0"的实体;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
它返回了正确的电影名称,但演员人数是审查人员和演员的笛卡尔乘积。
我在actors上执行collect函数后得到的结果是
"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人。非常感谢。
之所以有多个/重复的演员,是因为同一部电影由多个人(评审员(评审。要删除重复项,可以使用关键字"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
结果:
╒═══════════════════╤════════════╕
│"Movie_name" │"no_of_cast"│
╞═══════════════════╪════════════╡
│"The Replacements" │4 │
├───────────────────┼────────────┤
│"Cloud Atlas" │4 │
├───────────────────┼────────────┤
│"The Da Vinci Code"│4 │
├───────────────────┼────────────┤
│"The Birdcage" │3 │
├───────────────────┼────────────┤
│"Unforgiven" │3 │
└───────────────────┴────────────┘
您还有一些其他改进选项。
您并不真的想要包含审阅者的路径,这就是导致交叉乘积(审阅者行x参与者行(的原因。相反,这是一个条件,你唯一感兴趣的电影是那些有人看过的电影
MATCH (movie:Movie)
WHERE ()-[:REVIEWED]->(movie)
WITH movie, size((movie)<-[:ACTED_IN]-()) as no_of_cast
ORDER BY no_of_cast DESC
LIMIT 1
RETURN movie.title as Movie_name, no_of_cast
还要注意的是,我们不是进行聚合,而是使用size((获取节点上的:ACTED_IN关系的度数,以获取强制转换的数量。这更有效,因为我们不需要执行任何扩展或聚合来获得这个值。
此外,我们一直在等待,直到我们得到了一个最高的结果,以项目的标题属性。属性访问可能会很昂贵,所以最好将其推迟到您有了最小的结果集。