2013-06-29 4 views
3

Я пытаюсь создать связанный список с neo4j и иметь корневой узел без связей. Вот псевдо высчитывать Я пытаюсь создать, но я не знаю, как, или даже, если это возможно:Создание отношения условно с cypher (neo4j)

START root=node(1), item=node(2) 
MATCH root-[old?:LINK]->last 
WHERE old IS NOT NULL 
CREATE root-[:LINK]->item-[:LINK]->last 
DELETE old 
WHERE old IS NULL 
CREATE root-[:LINK]->item 

В основном я пытаюсь вставить узел в список, если список существует, и просто создайте первый элемент списка иначе. Очевидно, вы не можете сделать несколько WHERE s, как я сделал выше. Любые идеи, как я могу достичь этой желаемой функциональности с помощью cypher?

Документы разрешают проблему, сначала создавая повторяющееся отношение :LINK к корневому узлу, но я бы хотел решить эту проблему, не делая этого (поскольку тогда вам необходимо создать возможно ненужные отношения для каждого узла).

ответ

6

Для всех, кого это интересует, я придумал способ решить вышеуказанный, используя WITH трюки. Это, по сути, решение для создания связанных списков в neo4j без необходимости сначала создавать отношения самореференции.

START root=node(1), item=node(2) 
MATCH root-[old?:LIST_NEXT]->last 
CREATE root-[:LIST_NEXT]->item 
WITH item, old, last 
WHERE old IS NOT NULL 
CREATE item-[:LIST_NEXT]->last 
DELETE old 

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

0

Для этого, вы можете захотеть взглянуть на MERGE, http://docs.neo4j.org/chunked/snapshot/query-merge.html#merge-merge-with-on-create-and-on-match

А может быть, в связанном примере списка, http://docs.neo4j.org/chunked/snapshot/cookbook-linked-list.html

+0

Я посмотрел на обоих этих Документах. Как я уже сказал в своем вопросе, пример связанного списка требует, чтобы вы сначала создали повторяющиеся отношения, которые я хотел избежать. «MERGE» будет замечательным, за исключением того, что вы не можете выполнить условное 'CREATE'. –