我想要一个查询来查找边上属性的最小值和最大值以及连接到给定节点的边的值。Cypher:聚合和单个选择
考虑这个样本数据库:
我们有一个Game
节点(红色)和三个Person
节点(图中蓝色)。 Game
和Person
节点都具有name
属性,因为此示例假设名称是唯一的。 Person
和Game
节点通过BEST_SCORE
边缘连接,其边缘具有score
属性,每个人只能有一条边将它们连接到游戏。
到目前为止,我想出了这一点:
MATCH (g:Game)<-[s:BEST_SCORE]-(p:Person)
WHERE g.name='Pacman'
WITH MAX(s.score) AS max, MIN(s.score) AS min
MATCH (g:Game)<-[s:BEST_SCORE]-(p:Person) WHERE g.name='Pacman' AND p.name='Tom'
RETURN min, max, s.score
给这些结果:
这也正是我想要的结果,但我不禁觉得必须有一个更好的方式来做到这一点?我觉得必须有比将Game
节点及其与Person
节点的连接两次匹配的更好的方法,一次用于聚合,一次用于单个分数?也许这是最好的方法?
好主意。我实际上最终使用了这种变化。我不喜欢存储什么是有效重复的数据,并不得不维护它,但在我的情况下,这个查询是作为脚本的一部分执行的。我找到了最小和最大一次,并将它们的值存储在脚本中,查看每个人的分数,并在需要时重新计算分钟和最大值。我意识到这不会普遍解决问题,但它对我有用。我仍然很想看看它是否可以在一个简洁的查询中完成。 – Phil