Шифр Neo4J — вычесть длительность из метки времени

#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 . Это более эффективно и упрощает вашу логику.