Neo4j:犯规报仇图

上周,我向我的同事Alistair展示了犯规图表 ,他提出了进行“犯规报仇”查询的想法,以找出哪些球员在比赛后期与自己的一个犯规而报仇。

这样的查询非常以路径为中心,因此在图形中效果很好。 回顾一下,犯规图如下所示:

2015-05-26_07-35-33

我们需要做的第一件事是根据时间将犯规连接到一个链表中,以便我们可以更轻松地查询它们的顺序。

我们可以使用以下查询来做到这一点:

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”关系。 该图现在看起来像这样:

2015-05-26_07-43-28

现在让我们找到拜仁慕尼黑对巴塞罗那的复仇犯规。 我们正在寻找以下模式:

2015-05-26_07-55-45

这将转换为以下密码查询:

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巴塞罗那半决赛第二回合。

我们最终遇到以下报仇犯规:

2015-05-26_00-05-48

我们在这里可以看到,达尼·阿尔维斯(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 *

2015-05-23_15-23-22

目前,我已经将复仇的概念限制为单场比赛,但我想知道创建一个犯规链接列表是否会更有趣吗?

翻译自: https://www.javacodegeeks.com/2015/05/neo4j-the-foul-revenge-graph.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值