Несколько операторов UNWIND, приводящих к неправильному выводу в Neo4j - PullRequest
0 голосов
/ 23 апреля 2019

Я выполняю этот зашифрованный запрос на Neo4j

match x = (t1:Team)-[ho: Home]->(g: Game)<-[aw: Away]-(t2: Team)
with t1.name as tname1, 
     sum(toInteger(substring(g.full_time,0,1)) - 
     toInteger(substring(g.full_time,2,2))) as tgoals1, 
     t2.name as tname2, 
     sum(toInteger(substring(g.full_time,2,2))- 
     toInteger(substring(g.full_time,0,1))) as tgoals2
unwind [tgoals1 , tgoals2] as tgoals
unwind [tname1 , tname2] as tname
return tname

Это дает вывод как это

"Arsenal FC"
"Leicester City FC"
"Arsenal FC"
"Leicester City FC"
"Brighton & Hove Albion FC"
"Manchester City FC"
"Brighton & Hove Albion FC"
"Manchester City FC"

Хотя на самом деле результат должен быть таким

"Arsenal FC"
"Leicester City FC"
"Brighton & Hove Albion FC"
"Manchester City FC"

Если я уберу строку

unwind [tgoals1 , tgoals2] as tgoals

Вывод становится нормальным, но я действительно хочу это

return tname, tgoals

Так что я не могу удалить это. Короче говоря, два оператора UNWIND прекрасно работают по отдельности, но когда я соединяю их оба, возникает проблема повторения.
Может кто-нибудь сказать, пожалуйста, почему это происходит и как я могу это исправить?

1 Ответ

0 голосов
/ 23 апреля 2019

Спасибо за ваши данные и загрузку. Мне было легче поиграться с данными и найти решение. По сути, я собрал домашние команды и голы, а затем объединил их с гостями для той же игры и получил цели. Я разместил заказ по идентификатору, чтобы я мог вручную проверить правильность результата, но вы можете удалить его, если хотите.

Примечания: Источником дублирования является строка, где мы получаем цели. Каждая команда Хозяева и Гости будут иметь два значения, потому что мы вычисляем их по одному и тому же пути (х) Таким образом, мы получаем как дома, 1, -1. В гостях -1, 1. Когда вы раскручиваете его отдельно, он назначит 1 и -1 Дому, а 1 и -1 - Гости. Чтобы исправить это дублирование, мы создали пару (называемую списком) Home, tgoal и Away tgoal. Таким образом, мы получаем только одну цель для Дома и одну цель для Гости. Я называю этот словарь (tname, tgoal) как комбинированный. Он «собирается», собирая все домашние команды и их цели, затем складывая команды и их цели. Как только вы соберете их в одну коллекцию, назовите первый элемент c [0] как команду, а второй элемент как цель. Cypher похож на python, где первый элемент списка имеет индекс 0.

match (t1:Team)-[ho: Home]->(g: Game)
with t1.name as tname1, ID(g) as id1,
     toInteger(substring(g.full_time,0,1)) -
     toInteger(substring(g.full_time,2,2)) as tgoals1
match (t2:Team)-[aw: Away]->(g)
where ID(g) = id1
with tname1, tgoals1, t2.name as tname2, ID(g) as id2,
     collect ([tname1, tgoals1]) + collect([t2.name, toInteger(substring(g.full_time,2,2)) -
     toInteger(substring(g.full_time,0,1))]) as combo
unwind combo as c
return  c[0] as tname, c[1] as tgoals
order by id2

Результат: (образец)

╒═══════════════════════════╤════════╕
│"tname"                    │"tgoals"│
╞═══════════════════════════╪════════╡
│"Arsenal FC"               │1       │
├───────────────────────────┼────────┤
│"Leicester City FC"        │-1      │
├───────────────────────────┼────────┤
│"Brighton & Hove Albion FC"│-2      │
├───────────────────────────┼────────┤
│"Manchester City FC"       │2       │
├───────────────────────────┼────────┤
│"Chelsea FC"               │-1      │
├───────────────────────────┼────────┤
│"Burnley FC"               │1       │
├───────────────────────────┼────────┤
...