Простой запрос, объединяющий счетные операторы в Cypher - PullRequest
0 голосов
/ 24 октября 2019

Я строю набор данных, основанный на источниках конца семнадцатого и восемнадцатого веков, подробно описывающих отношения между мирянами и различными церквями в Голландской Республике. Я хотел бы создать простой запрос, который подсчитывает количество крещений и браков, которые произошли в конкретной церкви и период. Я использовал эти данные, чтобы поиграться с:

CREATE (em0002: event: marriage { day: 16, month: 6, year: 1650, LOCAL_ID: 'em0002'})
CREATE (em0003: event: marriage { day: 16, month: 6, year: 1670, LOCAL_ID: 'em0003'})
CREATE (eb0001: event: baptism { day: 16, month: 6, year: 1665, LOCAL_ID: 'eb0001'})
CREATE (c0001: church: RCC { name: 'Kerk aan de Appelmarkt', location: 'Leiden', LOCAL_ID: 'c0001'})
CREATE (c0003: church: DRC { name: 'Gereformeerde Kerk', location: 'Leiden', LOCAL_ID: 'c0003'})
CREATE (em0001)-[:TOOK_PLACE_IN]->(c0001)
CREATE (em0003)-[:TOOK_PLACE_IN]->(c0001)
CREATE (eb0001)-[:TOOK_PLACE_IN]->(c0001)
CREATE (em0002)-[:TOOK_PLACE_IN]->(c0003)

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

WHERE e.year > 1650 AND e.year < 1680
RETURN count (e:baptism) AS Number_of_baptisms

Проблема в том, когда я хочу создать обзор с количеством крещений в одном столбце и количеством браков в другом.

Я просто не знаю, как связать два запроса (один считает браки, а другой - крещения. Этот не дает правильного результата:

WHERE e.year_trouw > 1650 AND e.year_trouw < 1680 
MATCH (ee:baptism)-[:TOOK_PLACE_IN]->(ch:church:RCC {name: 'Kerk aan de Appelmarkt'})
WHERE ee.year > 1650 AND ee.year < 1680
RETURN count (e:marriage) AS Number_of_marriages, count (ee:baptism) AS Number_of_baptisms

Ответы [ 2 ]

0 голосов
/ 25 октября 2019

Этот запрос использует функцию REDUCE :

MATCH (event:event)
WHERE 1650 < event.year < 1680
RETURN REDUCE(s={b:0, m:0}, e IN COLLECT(event) |
  CASE WHEN e:baptism THEN {b:s.b+1, m:s.m} ELSE {b:s.b, m:s.m+1} END
) AS counts

для получения числа крещений / браков:

╒═════════════╕
│"counts"     │
╞═════════════╡
│{"b":1,"m":1}│
└─────────────┘

Запрос, как написано, предполагает, что любой event, который не является baptism, является marriage.

Кстати: выражение, подобное count(e:baptism), работает лучше, чем вы предполагали. e:baptism оценивает узел e, чтобы определить, имеет ли он метку baptism, и возвращает логическое значение. Таким образом, вы фактически подсчитываете общее количество истинных и ложных значений (т. Е. Общее количество e узлов). Вместо этого count(e) даст вам тот же счет и будет более эффективным.

0 голосов
/ 24 октября 2019

Возможно, что-то подобное? Портной по вашей логике

MATCH (e1:baptism), (e2:marriage)
WITH {baptism:COUNT(DISTINCT e1), marriage:COUNT(DISTINCT e2)} AS col
RETURN col.baptism AS Baptism, col.marriage AS Marriage
...