ключевое слово "с" изменяет результаты - PullRequest
0 голосов
/ 19 июня 2020

запрос 1

MATCH (n:PC)-[r:C1|C2|U]->(n2) WHERE r.date IS NULL OR (r.date > 1 AND r.date < 15)
WITH n,n2, 
reduce(t = 0, r in [x IN collect(r) WHERE type(x) = 'C1' or type(x) = 'C2'] | t + r.amount) as totalAmount1, 
reduce(t = 0, r in [x IN collect(r) WHERE type(x) = 'U' ] | t + r.amount) as totalAmount2 
WHERE totalAmount1 >= 1291 AND totalAmount2 >= 1000
RETURN COUNT(*)

запрос 2

MATCH (n:PC)-[r:C1|C2|U]->(n2) WHERE r.date IS NULL OR (r.date > 1 AND r.date < 15)
WITH n, 
reduce(t = 0, r in [x IN collect(r) WHERE type(x) = 'C1' or type(x) = 'C2'] | t + r.amount) as totalAmount1, 
reduce(t = 0, r in [x IN collect(r) WHERE type(x) = 'U' ] | t + r.amount) as totalAmount2 
WHERE totalAmount1 >= 1291 AND totalAmount2 >= 1000
RETURN COUNT(*)

Как видите, эти 2 запроса ОЧЕНЬ похожи друг на друга. Единственная разница в том, что я использовал WITH n,n2 вместо WITH n во втором запросе. Я ожидаю, что оба они вернут ОДИНАКОВЫЕ результаты.

НО запрос 1 возвращает 0, другой возвращает 113. почему? как?

Примечание: база данных содержит почти 7 миллионов узлов и 10 миллионов ребер.

Ответы [ 2 ]

1 голос
/ 21 июня 2020

Ваш запрос 1 сокращает для каждого n только пути, ведущие к указанному c n2

Ваш запрос 2 сокращает для каждого n все пути, ведущие к любому узлу

Следовательно, количество путей и, следовательно, элементов в сборке (r) запроса 2 больше, чем для запроса 1

Предполагая, что суммы> 0, запрос 2 имеет большее количество результатов, для которых WHERE предложение возвращает истину.

Фактически, не ключевое слово WITH изменяет результаты, а список переменных / заполнителей, который вы предоставляете.

1 голос
/ 19 июня 2020

Вам следует прочитать документацию о том, как работают агрегатные функции подобные COLLECT, особенно информацию о «ключах группировки».

Все условия WITH или RETURN, которые НЕ использовать агрегатные функции, используются как «ключи группирования», которые определяют, какие данные должны быть агрегированы вместе.

Запрос 1 имеет 2 ключа группирования (n и n2), но запрос 2 имеет только 1 (n). Таким образом, обычно можно ожидать, что результирующие агрегаты будут разными.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...