匹配节点与同一类型的最小直接关系

时间:2017-04-26 22:57:08

标签: neo4j cypher

要查找我拥有的评分最低的用户

match (:User)-[r:RATED*0..1]->(n:User)
return n, max(size(r)) as rating_count order by rating_count limit 1

但我认为他们可能是更好的方式?

我怀疑这将计算所有用户的评分计数,然后排除所有行,然后丢弃除第一个结果之外的所有行

2 个答案:

答案 0 :(得分:2)

不幸的是,订购结果需要触及所有结果,现在无法对其进行优化。

你可以加快速度的一种方法是修改你的MATCH,使其使用关系度,可以直接从节点检索,而不必将关系扩展到其他节点(你必须省略)关系连接到的节点的类型,因此仅在以下情况下有效:用户可以是:RATED关系的起始节点。

尝试:

var CurrentDate = "2017-04-25T00:00:00";
var date_new = new Date(CurrentDate);
document.write(new Intl.DateTimeFormat('en-US').format(date_new));

答案 1 :(得分:1)

可能考虑的另一件事是具有相同低评级的多个用户。例如,如果有十个用户完全没有:RATED关系怎么办?你只想要退回一个或者你想知道所有十个吗?

在InverseFalcon解决方案的基础上,您可以添加更多行来对结果进行排序,并确保所有评分最低的用户都包含在您的结果中。

MATCH (n:User)
WITH n, size((n)<-[:RATED]-()) AS rating
ORDER BY rating
WITH COLLECT([n,rating]) as users, MIN(rating) AS min_rating
RETURN [ r IN users WHERE r[1] = min_rating | r[0] ] AS min_rated_users, min_rating