结合多个Neo4j查询的分数

时间:2017-06-28 14:08:37

标签: database neo4j cypher aggregate graph-databases

我们有一个电影图。有演员,导演和电影。导演也可能在另一部电影,甚至是同一部电影中演过。我们给演员一个他每部电影的分数。我们还给导演一个他的每部电影的分数。现在,我们希望获得一份个人及其分数列表,从最高分到最低分。所以这些是我们目前的查询:

MATCH (p:Person)-[idr:IsDirectorOf]->(m:Movie)

RETURN p.name AS name, COUNT(idr) AS numberOfMoviesDirected

ORDER BY numberOfMoviesDirected DESC;

MATCH (p:Person)-[iai:IsActorIn]->(m:Movie)

RETURN p.name AS name, COUNT(iai) AS numberOfMoviesPlayed

ORDER BY numberOfMoviesPlayed DESC;

我想结合这些查询,将两个查询得分最高的人放在一起。此外,请注意我们稍后可能需要添加另一个查询,因此仅适用于两个查询的解决方案可能不是最好的。

1 个答案:

答案 0 :(得分:0)

您应该尝试此查询:

MATCH (p:Person)
RETURN p,  size((p:Person)-[:IsDirectorOf]->(:Movie)) +  size((p:Person)-[:IsActorIn]->(:Movie)) AS score
ORDER BY score DESC

如果您想添加其他分数,只需使用WITH继续查询。

干杯

<强>更新

要回复您的评论,这是查询:

MATCH (p:Person)
WITH 
    max(size((p)-[:IsActorIn]->())) As maxActed, 
    max(size((p)-[:IsDirectorOf]->())) AS maxDirected
MATCH (p:Person)
RETURN 
    p,  
    size((p)-[:IsActorIn]->(:Movie)) / toFloat(maxActed)  +  size((p)-[:IsDirectorOf]->(:Movie)) / toFloat(maxDirected) AS score
ORDER BY score DESC