找到每个节点的顶​​级排序模式

时间:2017-02-21 16:18:55

标签: neo4j

我的数据以这种方式建模:

我有足球运动员,进球和比赛的节点。玩家被连接以匹配[:已玩]关系,以及与[:得分]关系的目标。目标连接到与[:scoredIn]关系匹配。每个匹配都有一个(长)日期属性。

我试图找到在过去5场比赛中得分最多的球员(在match.date属性上使用DESC排序)。

最有效的方法是什么?我可以查看每个队员的比赛排序DESC,保持比赛ID然后找到(球员) - [:得分] - >(球门) - [:scoredIn] - >(m)模式到这些相关的比赛,但这很慢。

似乎我错过了某些东西,我如何通过相对排序找到这些模式?

由于

1 个答案:

答案 0 :(得分:0)

查询或解析您的查询并将生成的计划粘贴到您的描述中(扩展所有元素)可能会有所帮助。

对它进行一次尝试,听起来我们正在寻找最易遍历的查询。单个玩家可能已经获得了很多目标,并且必须扩展每个目标并对游戏中的得分进行哈希加入听起来可能非常昂贵。

相反,如果我们得到一名玩家的最后5场比赛,然后在游戏中获得进球并根据玩家进行过滤,这可能会更有效率。

类似的东西:

MATCH (p:Player)-[:played]->(m)
WITH p, m
ORDER BY m.date DESC
WITH p, COLLECT(m)[..5] as matches
UNWIND matches as match
MATCH (match)<-[:scoredin]-(g)
WHERE (g)<-[:scored]-(p)
RETURN p, COUNT(g) as goalsInLast5
ORDER BY goalsInLast5 DESC
LIMIT 10 // or whichever top n you want

使用大图表,这可能仍然是一个昂贵的查询。

作为一项小改进,您可能需要考虑为每个玩家的每场比赛分组目标,而不是针对每个目标对单个目标节点进行分组。

类似的东西:

  

(播放器) - [:得分] - GT;(目标:目标{目标:4}) - [:scoredin] - GT;(匹配)