Neo4j - Сайфер | Отметка времени, когда происходят отношения - PullRequest
0 голосов
/ 27 марта 2020

У меня есть загрузочное приложение Spring, где я определил несколько запросов. Из них я хотел бы, чтобы база данных отслеживала временную метку во время запуска определенного запроса и сохраняла ее в свойстве узла. Существует функция timestamp (), но я не могу найти в документах, какие аргументы она использует и как правильно ее использовать.

Допустим, у меня есть этот запрос:

MATCH (p:Patient) WHERE ID(p) = ({0})
MATCH (d:Drug) WHERE ID(d) IN ({1})
CREATE (p)-[:GETS]->(d)

Позволяет скажем, пользователь вставляет параметры, я хотел бы иметь метку времени на каждом (d) узле.

Попробовал это:

MATCH (p:Patient) WHERE ID(p) = 1693
MATCH (d:Drug) WHERE ID(d) IN [1671, 1679]
CREATE (p)-[:GETS]->(d {givenDate: datetime()})

Но я получаю ошибку:

Не могу создать узел 'd' с метками или свойствами здесь. Переменная уже объявлена.

Похоже, что я делаю что-то не так, но мне бы хотелось, чтобы оба 1671 + 1679 получили новое свойство GivenDate с datetime ()

Ответы [ 3 ]

1 голос
/ 27 марта 2020

Вы можете использовать предложение SET Cypher для добавления новых или обновления существующих свойств узла

MATCH (p:Patient) 
WHERE ID(p) = 1693 
MATCH (d:Drug) 
WHERE ID(d) IN [1671, 1679] 
SET d.givenDate = datetime()
CREATE (p)-[:GETS]->(d) 
1 голос
/ 27 марта 2020
  1. Функция отметка времени задокументирована для возврата:

разница, измеренная в миллисекундах, между текущим временем и полночью, 1 января 1970 г. UT C. Это эквивалент datetime (). EpochMillis .

Ваше предложение CREATE пытается создать новый узел с именем переменной d, что недопустимо, поскольку d уже объявлено (предыдущим предложением MATCH) для другого узла , Однако я подозреваю, что вы не хотите создавать новый узел, а вместо этого добавляете временную метку к существующему узлу d.

Это должно работать (и гарантирует, что все узлы Drug созданы с то же самое значение datetime):

WITH datetime() AS dt
MATCH (p:Patient) WHERE ID(p) = 1693
MATCH (d:Drug) WHERE ID(d) IN [1671, 1679]
SET d.givenDate = dt
CREATE (p)-[:GETS]->(d)

Однако , есть большой недостаток в вашем общем подходе. Поскольку существует только один Drug узел с данным нативным идентификатором, каждый раз, когда другой пациент принимает одно и то же лекарство, существующий givenDate будет изменен. Было бы более разумно поместить datetime в отношение GETS:

WITH datetime() AS dt
MATCH (p:Patient) WHERE ID(p) = 1693
MATCH (d:Drug) WHERE ID(d) IN [1671, 1679]
CREATE (p)-[:GETS {givenDate: dt}]->(d)
1 голос
/ 27 марта 2020

попробуйте это (также предполагая, что было бы лучше поставить метку времени в отношении)

MATCH (p:Patient) WHERE ID(p) = 1693 
MATCH (d:Drug) WHERE ID(d) IN [1671, 1679] 
CREATE (p)-[r:GETS]->(d)
SET r.givenDate= datetime()

, если вы думаете, что метка времени должна быть на d

SET d.givenDate= datetime()
...