Результаты фильтра neo4j, где дата находится в диапазоне нескольких периодов - PullRequest
0 голосов
/ 16 марта 2020

Мне нужно отфильтровать посетителей по датам, поэтому я использую этот запрос

match (v:Visitor)

where datetime('2020-01-01T09:00:00.000000+13:00') <= v.at < datetime('2020-01-01T19:00:00.000000+13:00')

return count(v)

Это довольно просто и понятно.

Теперь у меня есть еще одно требование, мне нужно отфильтровать посетителей по диапазон дат, что-то вроде:

match (v:Visitor)

where
datetime('2020-01-01T09:00:00.000000+13:00') <= v.at < datetime('2020-01-01T19:00:00.000000+13:00')
or
datetime('2020-01-02T09:00:00.000000+13:00') <= v.at < datetime('2020-01-02T19:00:00.000000+13:00')
or
datetime('2020-01-03T09:00:00.000000+13:00') <= v.at < datetime('2020-01-03T19:00:00.000000+13:00')

return count(v)

Несмотря на то, что это работает, это очень медленно по сравнению с выполнением 3 разных запросов с разными диапазонами.

Есть ли способ сделать что-то вроде выше, но без ущерба для производительности?

ПРИМЕЧАНИЕ. У меня есть индекс на: Visitor (at)

1 Ответ

0 голосов
/ 16 марта 2020

Планировщик Cypher, по-видимому, еще недостаточно умен, чтобы использовать индекс в (возможно, редких) ситуациях, подобных вашей.

Однако вы можете обойти это, используя UNION , чтобы получить результаты 3 подзапросов (каждый из которых использует индекс), а затем используйте новый подзапрос CALL {} в neo4j 4.0 , чтобы выполнить обработку после UNION для суммирования 3 промежуточных итогов, чтобы получить счет total.

CALL {
  MATCH (v:Visitor)
  WHERE datetime('2020-01-01T09:00:00.000000+13:00') <= v.at < datetime('2020-01-01T19:00:00.000000+13:00')
  RETURN count(v) AS cnt
  UNION
  MATCH (v:Visitor)
  WHERE datetime('2020-01-02T09:00:00.000000+13:00') <= v.at < datetime('2020-01-02T19:00:00.000000+13:00')
  RETURN count(v) AS cnt
  UNION
  MATCH (v:Visitor)
  WHERE datetime('2020-01-03T09:00:00.000000+13:00') <= v.at < datetime('2020-01-03T19:00:00.000000+13:00')
  RETURN count(v) AS cnt
}
RETURN SUM(cnt) AS total
...