2015-12-30 2 views
1

Я в тупике, но я уверен, что мне не хватает чего-то очевидного. Короче говоря, я понятия не имею, почему мой запрос возвращает 2x значения, которые я ожидал бы.Cypher Возвращающиеся повторяющиеся данные

На скриншоте ниже показан запрос, результаты запроса под ним, а также некоторые базовые данные (нижний результирующий набор), которые точны.

enter image description here

Например, команда B действительно играл в 4 играх, и было 10 очков, но второй запрос в верхней части возвращается 2x.

Чтобы следовать вместе, вот моя игрушка база:

// add constraint 
CREATE CONSTRAINT ON (n:Team) ASSERT n.id IS UNIQUE; 

// load the teams 
LOAD CSV WITH HEADERS FROM "https://docs.google.com/spreadsheets/d/1QwXJE2qWVsejWeJGOouYxblNTox_Z9Ly5TWggzQNQVY/pub?gid=0&single=true&output=csv" AS row 
WITH row 
MERGE (t:Team {id:row.id, name:row.name}); 

// load the games 
LOAD CSV WITH HEADERS FROM "https://docs.google.com/spreadsheets/d/1QwXJE2qWVsejWeJGOouYxblNTox_Z9Ly5TWggzQNQVY/pub?gid=33501648&single=true&output=csv" AS row 
WITH row 
CREATE (g:Game) 
MERGE (h:Team {id:row.hometeam}) 
MERGE (a:Team {id:row.awayteam}) 
MERGE (a)-[:AWAY_TEAM {score:row.awayscore}]->(g) 
MERGE (h)-[:HOME_TEAM {score:row.homescore}]->(g); 

// Games played 
MATCH (t:Team)-[r]->(x:Game) 
RETURN t.name, count(x) as games, sum(r.score) as for 
ORDER BY games DESC 

// the query in question which 2x's the results 
MATCH (t1:Team)-[r1]->(g1:Game) 
MATCH (g1)<-[r2]-(t2:Team) 
RETURN t1.name, count(r1) as games, sum(r1.score) as for, sum(r2.score) as against 
ORDER BY games DESC 

И ниже является именно из всего графа, где число на краю является оценка, что команда была в конкретной игре

enter image description here

ответ

3

Проблема с запросом в том, что вы соответствуете каждой команде дважды за каждую игру. В этих двух MATCH заявлений:

MATCH (t1:Team)-[r1]->(g1:Game) 
MATCH (g1)<-[r2]-(t2:Team) 

каждая команда обязана как t1 и t2.

Чтобы исправить это просто добавить WHERE NOT t1=t2:

MATCH (t1:Team)-[r1]->(g1:Game) 
MATCH (g1)<-[r2]-(t2:Team) WHERE NOT t1=t2 
RETURN t1.name, count(r1) as games, sum(r1.score) as for, sum(r2.score) as against 
ORDER BY games DESC 

Кроме того, в своем заявлении CSV импорта НАГРУЗКИ вы должны использовать функцию toInt, чтобы быть уверенным, чтобы отбрасывать целые числа должным образом (например, оценка):

LOAD CSV WITH HEADERS FROM "https://docs.google.com/spreadsheets/d/1QwXJE2qWVsejWeJGOouYxblNTox_Z9Ly5TWggzQNQVY/pub?gid=33501648&single=true&output=csv" AS row 
WITH row 
CREATE (g:Game) 
MERGE (h:Team {id:row.hometeam}) 
MERGE (a:Team {id:row.awayteam}) 
MERGE (a)-[:AWAY_TEAM {score:toInt(row.awayscore)}]->(g) 
MERGE (h)-[:HOME_TEAM {score:toInt(row.homescore)}]->(g); 
+0

Awesome, спасибо! – Btibert3

+0

След. Для команды A, как я могу получить общий балл противников для игр, в которых команда A не играла в одном и том же запросе? Например, я хочу использовать 'MATCH (t1: Team) - [r1] -> (g1: Game) <- [r2] - (t2: Team) - [r3] -> (g2: Game) <- [ r4] - (t3: Team) ', но даже после ряда предложений' WHERE NOT', я столкнулся с той же проблемой. Борясь, чтобы окутать голову, почему я дважды считаю эти пути. – Btibert3

+0

@ Btibert3 Если я правильно вас понимаю, это будет примерно так: 'MATCH (a: Team {name:" A "}) - [] -> (g: Game) <- [] - (оппонент: Team) MATCH (противник) - [r] -> (g2: игра) <- [] - (t2) ГДЕ НЕ a = t2 RETURN противник, сумма (r.score) AS total_score'. Найдите всех противников команды A, найдите игры, против которых играли противники, где они не играли в Team A, а затем суммировали счет этой команды для этих игр. –

Смежные вопросы