neo4j中的标准电影数据库有一个标准查询:
MATCH (tom:Person {name:"Tom Hanks"})-[:ACTED_IN]->(m)<-[:ACTED_IN]-(coActors),
(coActors)-[:ACTED_IN]->(m2)<-[:ACTED_IN]-(cocoActors)
WHERE NOT (tom)-[:ACTED_IN]->()<-[:ACTED_IN]-(cocoActors) AND tom <> cocoActors
RETURN cocoActors.name AS Recommended, count(*) AS Strength ORDER BY Strength DESC
这个查询应该返回在电影中与Tom Hanks的coActors一起扮演coActors的演员的名字,并且它将从coActors中排除Tom Hanks本人和任何coActors。
我想知道什么是“力量”。我认为这是电影的数量,可可演员已经发挥了与汤姆汉克斯的联合演员。
如果我将查询修改为:
MATCH (tom:Person {name:"Tom Hanks"})-[:ACTED_IN]->(m)<-[:ACTED_IN]-(coActors),
(coActors)-[:ACTED_IN]->(m2)<-[:ACTED_IN]-(cocoActors)
WHERE NOT (tom)-[:ACTED_IN]->()<-[:ACTED_IN]-(cocoActors) AND tom <> cocoActors
RETURN coActors.name, cocoActors.name AS Recommended, count(*) AS Strength ORDER BY Strength DESC
我得到了完全不同的结果。这里的力量是什么?为什么两个查询返回不同的结果?
2条答案
按热度按时间rt4zxlrg1#
不同的
Strength
值是由于添加了额外的分组键(coActors.name
)来影响聚合函数COUNT
。如文件所示:
聚合函数接受一组值并计算它们的聚合值。可以在所有匹配路径上计算聚合,或者可以通过引入分组键来进一步划分聚合。分组键是非聚合表达式,用于对进入聚合函数的值进行分组。
在第二个查询中,
coActors.name
和cocoActors.name
是“非聚合表达式”,因此RETURN
子句指定Strength
应该是每对coActor和cocoActor共同行动的次数(在您的用例中,在Tom Hanks没有行动的电影中)。这可能会导致相同的Recommended
cocoActor在结果中出现多次,每次都有不同的coActor。在您的第一个查询中,唯一的“非聚合表达式”是
cocoActors.name
,因此RETURN
子句指定Strength
应该是Recommended
cocoActor与Tom Hank的coActor在一部Tom Hank没有出演的电影中共同出演的次数。esbemjvw2#
“实力”只是一个聚合值。“*”表示行数,例如计数行。
原始字段“cocoActors.name AS Recommended”是分组变量,因此如果您有:
它变成:
因此,您正在计算coActors.name和cocoActors.name的任何给定组合出现在匹配结果中的次数。