首页 > 解决方案 > 返回不是由特定导演执导但在其他电影中与该导演合作过的演员和电影。密码(neo4j)

问题描述

例如:

下面的查询将返回与拉娜·沃卓斯基合作最多的 10 位演员。

MATCH (actor:Person)-[:ACTED_IN]->(m:Movie)<-[:DIRECTED]-(lana:Person {name:  'Lana Wachowski'})
RETURN actor.name , COUNT(m), collect(m.title)
ORDER by COUNT(m) desc
LIMIT 10

但是我想要一个查询,它将返回上述演员的电影:ACTED_IN,这不是由 Lana Wachoswki 导演的,

我做了这样的事情,但最终会将所有与这位导演合作过的演员归还给我,而不是排名前十的演员。

MATCH (actor:Person)-[:ACTED_IN]->(m:Movie)<-[:DIRECTED]-(lana:Person {name:  'Lana Wachowski'}),
(actor:Person)-[:ACTED_IN]->(other:Movie)
WITH actor, other
WHERE NOT EXISTS((lana)-[:DIRECTED]->(other:Movie)<-[:ACTED_IN]-(actor))
RETURN actor.name , other.title

标签: neo4jcypher

解决方案


最终看起来,只需传递 m 变量,就可以再次使用它来对 RETURN 进行排序。

MATCH (actor:Person)-[:ACTED_IN]->(m:Movie)<-[:DIRECTED]-(lana:Person {name:  'Lana Wachowski'}),
(actor:Person)-[:ACTED_IN]->(other:Movie)
WITH actor, m, other
WHERE NOT EXISTS((lana)-[:DIRECTED]->(other:Movie)<-[:ACTED_IN]-(actor))
RETURN actor.name , other.title, COUNT(m)
ORDER BY COUNT(m) desc
LIMIT 10

但是,如果我尝试运行下面的查询,我的集合列表中有重复项。

MATCH (actor:Person)-[:ACTED_IN]->(m:Movie)<-[:DIRECTED]-(lana:Person {name:  'Lana Wachowski'}),
(actor:Person)-[:ACTED_IN]->(other:Movie)
WITH actor, m, other
WHERE NOT EXISTS((lana)-[:DIRECTED]->(other:Movie)<-[:ACTED_IN]-(actor))
RETURN DISTINCT actor.name , collect(other.title), COUNT(m)
ORDER BY COUNT(m) desc
LIMIT 10

推荐阅读