2014-02-24 3 views
2

Я пытаюсь создать уникальный узел, если он не существует, и подключить его к другому узлу, если нет отношения.Использование MERGE/CREATE UNIQUE

В этом примере я хочу получить или создать узел Year за 2001 год. Если уже есть узел 2001 года, я хочу создать отношение [: YEAR] из календаря, если оно не существует, если есть no 2001, я хочу создать и узел, и отношение. В db есть единственный узел метки «Календарь».

CREATE UNIQUE (calendar:Calendar)-[:YEAR]->(year:Year {number: 2001 }) RETURN year; 

MERGE (calendar:Calendar)-[:YEAR]->(year:Year {number: 2001 }) RETURN year; 

Когда я пытаюсь запросы, которые я получаю «Неизвестная ошибка»

Что похоже на работу является использование одного из этих

MERGE (calendar:Calendar) CREATE UNIQUE (calendar)-[:YEAR]->(year:Year { number:2001}) RETURN year; 

MERGE (calendar:Calendar) MERGE (calendar)-[:YEAR]->(year:Year { number:2001}) RETURN year; 

чем разница между двумя последними запросами, и почему не работают первые?

ответ

1

Иногда Neo4j-браузер маска исключение и ошибки, как "Неизвестные ошибки". Попробуйте запустить запросы в neo4j-shell, чтобы увидеть настоящую проблему. (Я думаю, что самые последние версии neo4j-браузера позволяют увидеть больше ошибок, какую версию Neo4j вы используете?)

Первый запрос не выполняется, потому что CREATE UNIQUE нуждается в некотором связанном идентификаторе для начала, по крайней мере, один идентификатор должен быть («это»/материя/человек). Вы можете сделать

MATCH (calendar:Calendar) 
CREATE UNIQUE calendar-[:YEAR]->(year:Year {number:2001}) 
RETURN year 

Я не знаю, почему второй запрос терпит неудачу, это не само по себе. Однако он не будет делать то, что вы хотите, для соответствия MERGE или создает весь шаблон. Если (:Calendar)-[:YEAR]->(:Year{number:2001}) существует, он будет соответствовать и возвращать его, если он не существует, создается весь шаблон, включая новый календарный узел. Поскольку запрос может создавать дубликаты, может ли «Неизвестная ошибка» в этом случае маскировать некоторую проблему с ограничением уникальности схемы?

Третий запрос сначала связывает узел календаря, что означает, что предложение create unique имеет связанный идентификатор и будет работать нормально.

Четвертый запрос аналогичным образом получит или создаст два шаблона отдельно, а это означает, что не будут созданы дублирующие узлы календаря.

Вы рассматривали моделирование календаря, что-то более похожее на это? Это не относится к вашему вопросу, но я думаю, что это, вероятно, так, как я это сделаю.

(:Calendar)-[:2014]->({data:"some year data"})-[:02]->({data:"some month data"})-[:25]->({data:"some day data"}) 
+0

Консоль webadmin показывает сообщения об ошибках. Из второго запроса я получаю «SyntaxException: каким-то образом Cypher не смог построить из вашего запроса действительный план выполнения.«В любом случае, как вы сказали, этот запрос не подходит. Я не думаю, что для меня будет работать другая модель календаря, я связываю дни, годы и месяцы с событиями, чтобы увидеть, какие события произошли, когда и я думаю, что текущая модель работает лучше для этого. – user3115696

0

Для первой части вы хотели бы использовать уникальную уникальную технологию, указанную ниже. В противном случае это вызовет ошибку.

MATCH (calendar:Calendar) 
CREATE UNIQUE (calendar)-[:YEAR]->(year:Year {number: 2001 }) 
RETURN year; 

Теперь для второго запроса вам не нужно использовать CREATE UNIQUE, поскольку MERGE делает работу как MATCH и создавать неповторимые вместе.

Вышеуказанные будут создавать любые узлы, отношения и метки, которые не существуют, и в то же время повторно использовать то, что уже существует.

Более подробная информация о Cypher MERGE: here

Смежные вопросы