neo4j :rel
上周,我向我的同事Alistair展示了犯规图表 ,他提出了进行“犯规报仇”查询的想法,以找出哪些球员后来在比赛中因自己的犯规而报仇。
这样的查询非常以路径为中心,因此在图形中效果很好。 回顾一下,犯规图如下所示:
我们需要做的第一件事是根据时间将犯规连接到链表中,以便我们可以更轻松地查询其顺序。
我们可以使用以下查询来做到这一点:
MATCH (foul:Foul)-[:COMMITTED_IN_MATCH]->(match)
WITH foul,match
ORDER BY match.id, foul.sortableTime
WITH match, COLLECT(foul) AS fouls
FOREACH(i in range(0, length(fouls) -2) |
FOREACH(foul1 in [fouls[i]] | FOREACH (foul2 in [fouls[i+1]] |
MERGE (foul1)-[:NEXT]->(foul2)
)));
该查询收集按比赛分组的犯规,然后在相邻犯规之间添加“ NEXT”关系。 该图现在看起来像这样:
现在让我们找到拜仁慕尼黑对巴塞罗那的复仇犯规。 我们正在寻找以下模式:
这将转换为以下密码查询:
match (foul1:Foul)-[:COMMITTED_AGAINST]->(app1)-[:COMMITTED_FOUL]->(foul2)-[:COMMITTED_AGAINST]->(app2)-[:COMMITTED_FOUL]->(foul1),
(player1)-[:MADE_APPEARANCE]->(app1), (player2)-[:MADE_APPEARANCE]->(app2),
(foul1)-[:COMMITTED_IN_MATCH]->(match:Match {id: "32683310"})<-[:COMMITTED_IN_MATCH]-(foul2)
WHERE (foul1)-[:NEXT*]->(foul2)
RETURN player2.name AS firstFouler, player1.name AS revengeFouler, foul1.time, foul1.location, foul2.time, foul2.location
我在模式中增加了一些额外的部分,以抽出所涉及的球员并找到特定比赛的报仇犯规者–拜仁慕尼黑vs巴塞罗那半决赛第二回合。
我们最终遇到以下报仇犯规:
我们在这里可以看到,丹尼·阿尔维斯(Dani Alves)实际上是在第10分钟对犯规的巴斯蒂安·施魏因斯泰格(Bastian Schweinsteiger)报仇两次。
如果将查询调整为以下内容,我们还可以直观地看到报仇犯规:
match (foul1:Foul)-[:COMMITTED_AGAINST]->(app1)-[:COMMITTED_FOUL]->(foul2)-[:COMMITTED_AGAINST]->(app2)-[:COMMITTED_FOUL]->(foul1),
(player1)-[:MADE_APPEARANCE]->(app1), (player2)-[:MADE_APPEARANCE]->(app2),
(foul1)-[:COMMITTED_IN_MATCH]->(match:Match {id: "32683310"})<-[:COMMITTED_IN_MATCH]-(foul2),
(foul1)-[:NEXT*]->(foul2)
RETURN *
目前,我已经将复仇的概念限制为单场比赛,但我想知道创建一个犯规链接列表是否会更有趣吗?
- 所有这些的代码都在github上 –目前README有点粗略,但我会尽快修复。
翻译自: https://www.javacodegeeks.com/2015/05/neo4j-the-foul-revenge-graph.html
neo4j :rel