Да, вы должны использовать оператор MERGE
.
MERGE (user:C9 {userId:'44'})
// you can set some initial properties when the node is created if required
//ON CREATE SET user.propertykey = 'propertyvalue'
ON MATCH SET user.timestamp = '1111'
RETURN user
Вы упоминаете уникальные ограничения - я предполагаю, что у вас есть одна настройка. Вы обязательно должны это сделать, чтобы предотвратить создание дубликатов узлов. Он также создаст индекс схемы для повышения производительности поиска узлов. Если у вас еще нет уникального ограничения, его можно создать так
CREATE CONSTRAINT ON (u:C9) ASSERT u.userId IS UNIQUE
См. документацию Neo4j MERGE.
Наконец, чтобы понять, что происходит в вашем запросе, давайте быстро рассмотрим его построчно.
MATCH (user:C9 { userId:'44' })
Это соответствует узлу с меткой :C9
, у которого есть свойство userId
со значением 44
, и присваивает ему идентификатор user
.
CREATE UNIQUE (user{timestamp:'1111'})
Эта строка просто пытается создать новый узел без метки и свойства timestamp
со значением '1111'
. Исключение, которое вы видите, является результатом использования того же идентификатора user
, который уже использовался в первой строке. Однако это не поддерживаемый способ использования CREATE UNIQUE
, так как сначала требуется совпадение, а затем создаются биты несуществующего шаблона. Преимущество этого в том, что он останавливает создание этого нежелательного узла (user{timestamp:'1111'})
в графе.
RETURN user
Эта линия довольно понятна и не достигается.
EDIT Кажется, есть некоторая путаница в отношении CREATE UNIQUE
и того, когда его следует использовать. Этот запрос
CREATE UNIQUE (user:C9 {timestamp:'1111'})
потерпит неудачу с сообщением
Этот шаблон не поддерживается для CREATE UNIQUE.
Чтобы использовать CREATE UNIQUE
, вы должны сначала сопоставить существующий узел, а затем использовать его для создания уникального шаблона в графе. Таким образом, чтобы создать отношение от user
ко второму узлу, вы должны использовать
MATCH (user:C9 { userId: '44' }
CREATE UNIQUE (user)-[r:FOO]-(bar)
RETURN r
Если нет отношений типа FOO
из user
, то будет создан новый узел для представления bar
, а между ними будет создана связь типа :FOO
. И наоборот, если оператор MATCH
не соответствует, то никакие узлы или отношения не будут созданы.
person
ceej
schedule
13.11.2015