Последней вещью, которую я добавил к своему футбольному графику, были матчи, показанные по телевизору, так как я уверен, что игроки, которые получают очки в телевизионных играх, получают больше внимания, чем игроки, которые забивают в других играх.
Я подумал, что было бы интересно выяснить, кто является лучшим бомбардиром в каждом из этих типов игр.
Я добавил следующий тип отношений, чтобы позволить мне сделать это:
game-[:on_tv]-channel
Затем я написал запрос, чтобы получить список всех игроков вместе с коллекцией игр, в которые они играли, и о том, транслировалась ли эта игра по телевидению:
START player=node:players('name:*') MATCH player-[:played|subbed_on]-stats-[:in]-game-[t?:on_tv]-channel RETURN player.name, COLLECT([stats.goals, t]) AS games LIMIT 10
К сожалению, когда я запустил этот запрос, я получил следующее исключение:
CypherTypeException: Failed merging Number with Relationship
Из некоторых предыдущих разговоров с Уэсом я заметил, что этого исключения, похоже, не было в версии 1.9.M05, но я использовал 1.9.M04 .
Просто чтобы посмотреть, что произошло, я попытался вернуть тип отношения в литерале коллекции, а не отношения, и это сработало:
START player=node:players('name:*') MATCH player-[:played|subbed_on]-stats-[:in]-game-[t?:on_tv]-channel RETURN player.name, COLLECT([stats.goals, TYPE(t)]) AS games LIMIT 10
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | player.name | games | +----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | "Djibril Cissé" | [[0,<null>],[1,"on_tv"],[0,<null>],[0,<null>],[0,"on_tv"],[0,<null>],[0,<null>],[0,<null>],[0,<null>],[0,<null>],[1,<null>],[0,"on_tv"],[0,"on_tv"],[0,<null>],[0,<null>],[0,"on_tv"],[0,<null>],[1,<null>]] | | "Markus Rosenberg" | [[0,<null>],[0,<null>],[0,<null>],[0,<null>],[0,<null>],[0,<null>],[0,<null>],[0,<null>],[0,<null>],[0,<null>],[0,<null>],[0,"on_tv"],[0,"on_tv"],[0,<null>],[0,"on_tv"],[0,<null>]] | | "Gabriel Agbonlahor" | [[0,"on_tv"],[1,<null>],[0,"on_tv"],[0,<null>],[0,<null>],[0,"on_tv"],[1,<null>],[0,"on_tv"],[0,<null>],[0,"on_tv"],[0,<null>],[0,<null>],[1,"on_tv"],[1,<null>],[0,<null>],[0,"on_tv"],[1,<null>],[0,<null>],[0,<null>],[0,<null>],[0,<null>]] | | "Shaun Derry" | [[0,<null>],[0,<null>],[0,<null>],[0,"on_tv"],[0,<null>],[0,<null>],[0,"on_tv"],[0,<null>],[0,<null>],[0,<null>],[0,<null>],[0,<null>],[0,<null>],[0,"on_tv"]] | | "Marouane Fellaini" | [[0,<null>],[0,"on_tv"],[0,<null>],[1,<null>],[1,"on_tv"],[1,<null>],[0,<null>],[0,"on_tv"],[1,"on_tv"],[0,<null>],[0,"on_tv"],[2,<null>],[1,<null>],[1,<null>],[1,<null>],[0,<null>],[0,<null>],[0,"on_tv"],[0,<null>],[0,<null>],[2,<null>],[0,"on_tv"],[0,<null>],[0,"on_tv"]] | | "Jermaine Jenas" | [[0,<null>],[1,<null>],[0,<null>],[0,<null>],[0,"on_tv"],[0,<null>],[1,<null>]] | | "Sean Morrison" | [[0,<null>],[0,"on_tv"],[0,<null>],[0,<null>],[1,<null>],[0,"on_tv"],[1,"on_tv"],[0,<null>],[0,"on_tv"]] | | "Claudio Yacob" | [[0,"on_tv"],[0,<null>],[0,<null>],[0,<null>],[0,<null>],[0,<null>],[0,"on_tv"],[0,<null>],[0,<null>],[0,<null>],[0,<null>],[0,"on_tv"],[0,<null>],[0,<null>],[0,"on_tv"],[0,"on_tv"],[0,"on_tv"],[0,<null>],[0,<null>],[0,<null>],[0,<null>],[0,<null>]] | | "Michael Owen" | [[0,<null>],[0,<null>],[0,<null>],[0,<null>],[1,<null>],[0,<null>]] | | "Tony Hibbert" | [[0,"on_tv"],[0,"on_tv"],[0,<null>],[0,<null>],[0,<null>]] | +----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ 10 rows
+--------------------------------------------------------+ | player.name | nonTvGoals | tvGoals | totalGoals | +--------------------------------------------------------+ | "Gareth Bale" | 4 | 12 | 16 | | "Robin Van Persie" | 8 | 11 | 19 | | "Luis Suárez" | 12 | 10 | 22 | | "Theo Walcott" | 3 | 8 | 11 | | "Demba Ba" | 7 | 8 | 15 | | "Santi Cazorla" | 4 | 7 | 11 | | "Carlos Tevez" | 3 | 6 | 9 | | "Edin Dzeko" | 6 | 6 | 12 | | "Wayne Rooney" | 6 | 6 | 12 | | "Juan Mata" | 4 | 6 | 10 | +--------------------------------------------------------+ 10 rows
Так что, как мы видим, Гарет Бэйл забивает только очки, когда о телекамерах!
Я был заинтригован тем, что изменилось между 1.9.M04 и 1.9.M05, поэтому я потратил несколько часов этим утром, просматривая зашифрованную часть кода и по большей части ничего не получая.
Я подумал, что, вероятно, произошли изменения в способе обработки литералов коллекции, но быстрое сканирование журнала git показало, что никаких изменений не было:
$ git log -- community/cypher/src/main/scala/org/neo4j/cypher/internal/parser/v1_9 commit 7311bbe33bc06b346e60e12a4eee2a7173cbd317 Author: Andres Taylor <[email protected]> Date: Tue Mar 19 06:42:49 2013 +0100 Handles single node patterns in MATCH commit c9f580456572d3d267a15dc88b35e07fd450cf93 Author: Stefan Plantikow <[email protected]> Date: Fri Jan 11 21:27:55 2013 +0100 scala 2.10 support: Kills type erasure warnings with a few casts and cleans up a bit ...
1.9.M04 был выпущен 22 января и 1.9.M05 6 марта, и единственный коммит в этой части кодовой базы за это время не коснулся части кода, на которую я смотрел.
Интересно, что я не смог найти нигде в базе кода, в которой была строка «Сбой при слиянии», поэтому я решил сделать быстрое сканирование различий, чтобы увидеть, было ли это удалено:
$ git log -S"Failed merging" commit b6501aac03cf70419e94b4cfc160695e4950914a Author: Andres Taylor <[email protected]> Date: Sat Feb 16 19:30:00 2013 +0100 Changed how Cypher merges types
Так что на самом деле была фиксация, которая изменила способ определения типа коллекции, так что вместо того, чтобы генерировать исключение для конфликтующих типов, вместо него использовался бы родительский тип.
В любом случае этой проблемы слияния не существует в 1.9.M05, и я переключил свой график на использование этой версии neo4j, так что я больше не буду видеть это исключение!