2015-02-03 4 views
1

У меня есть три независимых дерева категорий, которые будут импортироваться в любом порядке с использованием cypher.Neo4j - запрос Cypher для импорта дерева категорий без дублирующейся записи

  • (с2) - [Родитель] -> (с1)
  • (с4) - [Родитель] -> (с3) -> [Родитель] -> (с1)
  • (с5) - [Родитель] -> (с3)

enter image description here

и необходимо создать структуру, указанную в рисунке, используя запрос. Запрос я написал,

MERGE (:Category {name:'c2'})-[:PARENT]->(:Category {name:'c1'}) 
MERGE (:Category {name:'c4'})-[:PARENT]->(:Category {name:'c3'})-[:PARENT]->(:Category {name:'c1'}) 
MERGE (:Category {name:'c5'})-[:PARENT]->(:Category {name:'c3'}) 

Но выше запроса создает дубликат категории c1 для второго слияния запроса, который мне нужно избежать. Также третий запрос должен создать новую категорию c3, которая сейчас происходит правильно.

Еще одна вещь заключается в том, что эти три запроса cypher должны быть независимо исполняемыми .eg: в системе уже есть дерево категорий (c2) - [PARENT] -> (c1) и необходимо добавить (c4) - [PARENT] - > (c3) -> [PARENT] -> (c1) в дереве категорий с использованием cypher.

Я могу пойти с некоторыми аналогичными подходами в документации http://neo4j.com/docs/stable/cypherdoc-linked-lists.html. но просто хочу, чтобы проверить, есть простой способ решить эту проблему

+0

поведение нормально, потому что вы не использовать идентификаторы и таким образом, Сайфер не может знать, представляет собой новый узел или узел c1. Вот очень хорошее объяснение о MERGE http://graphaware.com/neo4j/2014/07/31/cypher-merge-explained.html –

ответ

1

Попробуйте это (без опечатка в третьем запросе)

MERGE (:Category {name:'c2'})-[:PARENT]->(c1:Category {name:'c1'}) 
MERGE (:Category {name:'c4'})-[:PARENT]->(:Category {name:'c3'})-[:PARENT]->(c1) 
MERGE (:Category {name:'c5'})-[:PARENT]->(:Category {name:'c3'}) 
0

Вы можете использовать один запрос, чтобы избежать дублирования ввода
MERGE (:Category {name:'c4'})-[:PARENT]->(:Category {name:'c3'})-[:PARENT]->(:Category {name:'c1'})<-[:PARENT]-(:Category {name:'c2'})
MERGE (:Category {name:'c5'})-[:PARENT]->(:Category {name:'c5'})

0

Я решаю проблему, добавив еще один ярлык Root для категории верхнего уровня.

Шифр ​​запроса для первого дерева - (c2) - [Родитель] -> (с1)

MERGE (nc1:Category:Root{name:'c1'}) 
MERGE (nc3:Category {name:'c2'})-[:PARENT]->(nc1) 

Шифр ​​запроса для второго дерева - (с4) - [Родитель] -> (с3) -> [ Родитель] -> (c1)

MERGE (nc1:Category:Root{name:'c1'}) 
MERGE (nc3:Category {name:'c3'})-[:PARENT]->(nc1) 
MERGE (:Category {name:'c4'})-[:PARENT]->(nc3) 

Cypher запрос для третьего дерева - (c5) - [Родитель] -> (c3)

MERGE (nc3:Category:Root{name:'c3'}) 
MERGE (nc5:Category {name:'c5'})-[:PARENT]->(nc3) 
Смежные вопросы