neo4j匹配两种不同的关系并检索计数,同时避免笛卡尔乘积



所以我有一个数据库,我想在其中检索具有以下关系的结果"已审核";并且在该结果中,我想要检索具有关系"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关系的度数,以获取强制转换的数量。这更有效,因为我们不需要执行任何扩展或聚合来获得这个值。

此外,我们一直在等待,直到我们得到了一个最高的结果,以项目的标题属性。属性访问可能会很昂贵,所以最好将其推迟到您有了最小的结果集。

最新更新