Neo4j сравнивает суммы из разных запросов и показывает результат - PullRequest
0 голосов
/ 20 сентября 2018

Есть ли способ сравнить результаты разных запросов?Могут ли следующие запросы быть записаны в одном запросе вместе с возвращением для требуемого результата ?

Query1 : Возвращает страны и СУММУ из всех заданных точекпо странам, которые не входят в их регион.

MATCH (c:Country)
with c
MATCH (c)-[vFrom:vote_from]->(vP:vote_points)-[vFor:vote_for]->(c2:Country)
with c,c2,vP
where not c.region=c2.region
return c2.name,sum(toInteger(vP.points))

Пример возврата из Query1:

"Monaco"    11
"Montenegro"    34
"France"    359
"Cyprus"    600
"Romania"   837

Query2 : Возвращает страны и СУММЫ из всех точек, указанных странами, являющимися частью их региона.

MATCH (c:Country)
with c
MATCH (c)-[vFrom:vote_from]->(vP:vote_points)-[vFor:vote_for]->(c2:Country)
with c,c2,vP
where  c.region=c2.region
return c2.name,c.name,sum(toInteger(vP.points))

Пример возврата из Query2:

"Monaco"    35
"Montenegro"    66
"France"    157
"Cyprus"    102
"Romania"   255

Требуемый результат:

"Monaco"    35
"Montenegro"    66

1 Ответ

0 голосов
/ 21 сентября 2018

Предполагая, что вы ищете случаи, когда суммарные баллы в регионе превышают итоговые значения вне региона, этот запрос может работать для вас:

MATCH (c:Country)-[:vote_from]->(vP:vote_points)-[:vote_for]->(c2:Country)
WITH c2,
  REDUCE(s={in: 0, out: 0}, x IN COLLECT({reg: c.region, pts: toInteger(vP.points)}) |
    CASE WHEN x.reg=c2.region
      THEN {in: s.in + x.pts, out: s.out}
      ELSE {in: s.in, out: s.out + x.pts}
    END) AS res
WHERE res.in > res.out
RETURN c2.name AS name, res.in AS points
...