#neo4j #cypher
#neo4j #шифр
Вопрос:
Я пытаюсь создать динамический запрос, который даст мне результаты «сегодня» (при отправке) и так много дней назад.
Допустим, для примера, что мне нужны данные за последние 14 дней, начиная с сегодняшнего дня.
Поле first_submitted
записывается с помощью timestamp()
Я попробовал следующий код;
match(u:data) WHERE u.first_submitted > timestamp()}-duration('P14D') AND u.first_submitted < timestamp() RETURN u.first_submitted LIMIT 10
Однако я получаю сообщение об ошибке
Neo.ClientError.Statement.TypeError: Cannot subtract `Duration` from `Long`
Я попробовал несколько разных способов кодирования этого, но я оказался очень смущен синтаксисом и документацией Neo4J, связанной с этим.
В качестве альтернативы, если вы можете придумать лучший способ сделать это, который не требует слишком больших ресурсов, пожалуйста, дайте мне знать.
Заранее спасибо!
PS Я не уверен, что именно такое «data.apoch», который я продолжаю видеть, но когда я пытаюсь запустить любую из этих команд, я получаю ошибки, поэтому, если я могу избежать необходимости в этой библиотеке, пожалуйста.
Ответ №1:
Да, временные значения и функции довольно сложны, а документация разрозненна и плотна.
Функция метки времени возвращает целое число. Но длительность (которая может быть создана с помощью функции duration ) может быть вычитана только из временного момента (например, a DateTime
, который может быть создан с помощью функции datetime ).
Итак, для простоты значение first_submitted
свойства должно быть чем-то вроде a DateTime
(которое представляет дату и время) вместо целого числа. Например:
CREATE (:data {id: 123, first_submitted: datetime()})
Предполагая, что это правда, ваш запрос может выглядеть следующим образом:
WITH datetime()-duration('P14D') AS threshold
MATCH (u:data)
WHERE u.first_submitted > threshold
RETURN u.first_submitted LIMIT 10
Примечание: нет необходимости проверять, что сохраненное DateTime предшествует текущему DateTime, поскольку предположительно все first_submitted
значения в прошлом.
Кроме того, вы можете создать индекс :data(first_submitted)
для повышения производительности.
Комментарии:
1. Спасибо @cybersam, вы упомянули «для простоты
DateTime
вместо этого используйте значение», но есть мысли о разнице в производительности сервера с этим изменением? Спасибо.2. Если вы сохраняете a
DateTime
, то ваши запросы могут избежать необходимости конвертировать эпохи вDateTime
s . Это более эффективно и упрощает вашу логику.