Я смоделировал такую временную шкалу:
(t: Timeline) - [:PREV] -> (t1: Timeline) - [:PREV] -> (t2: Timeline)
Каждый узел Timeline имеет свойство под названием timestamp.
Мое событие времени исходит из RabbitMQ, порядок не указан (поскольку все службы используют асинхронный режим для отправки в очередь), поэтому, когда приходит новое событие времени, мне нужно вставить новый узел времени в правильное место, чтобы поддерживать порядок на временной шкале.
Чтобы вставить новый узел Timeline на шкалу времени, я просматриваю список с помощью этого запроса: (headTimestamp - это последний узел времени)
MATCH (t: Timeline {timestamp: headTimestamp}) - [:PREV*] -> (t1: Timeline)
WHERE t1.timestamp < newTimestamp
RETURN t1
Я не нахожу возможности прервать первый матч. В настоящее время он возвращает все узлы с timestamp < newTimestamp
Как мне это сделать или есть ли способ решения этой проблемы?





Возможно, вы сможете использовать LIMIT 1, чтобы получить первое совпадение:
MATCH (t: Timeline {timestamp: headTimestamp}) - [:PREV*] -> (t1: Timeline)
WHERE t1.timestamp < newTimestamp
WITH t1 LIMIT 1
RETURN t1
Возможно, вы захотите протестировать, чтобы убедиться, что вы получаете первое попадание, поскольку обычно порядок результатов не определяется, если вы не используете ORDER BY, например:
MATCH path = (t: Timeline {timestamp: headTimestamp}) - [:PREV*] -> (t1: Timeline)
WHERE t1.timestamp < newTimestamp
WITH t1
ORDER BY length(path) ASC
LIMIT 1
RETURN t1
LIMIT разрешит короткое замыкание, если это возможно, вы можете ПРОФИЛИРОВАТЬ запрос, чтобы увидеть его в действии. Первый предоставленный мной запрос должен только захватить первое совпадение, а затем прекратить поиск. Второй предоставленный запрос должен быть упорядочен по длине пути, поэтому все результаты должны быть получены для сортировки первыми.
Очевидно нет. Использовать план запроса Я вижу, что предложение LIMIT появляется после того, как var expand all (который обращается ко всем узлам в моем списке)
Он может быть указан после операции expand all, но он будет лениво захватывать найденные результаты до заданного предела, а затем останавливаться, и если есть такие совпадения, вы должны увидеть, что это отражено в совпадениях db. Однако, если таких совпадений нет или они обнаруживаются только ближе к концу исчерпания всех возможных результатов, то вы можете увидеть меньшее сокращение, чем вы думаете. Посмотрите, как выглядит ПРОФИЛЬ до попадания в базу данных, если, например, вы удалите предложение WHERE.
В том-то и дело. Спасибо
Насколько я понимаю, LIMIT применяется после подсчета результата, он не замыкается, верно?