2014-02-04 3 views
0

Выполнение этого при Neo4j 2.0.Смутно о поведении опционального предложения MATCH

Я разработал систему типа Node, используя свойство массива под названием «тип». Это было сделано до ярлыков, и я, вероятно, в конце концов переключится на использование меток. На данный момент, у меня есть следующий запрос на удаление:

START n = node(*) OPTIONAL MATCH n-[r]-() WHERE ANY(x in n.type WHERE x = 'TestType') DELETE n, r 

Обратите внимание, что до Neo4j 2.0, я использовал следующий запрос, который работал отлично:

START n = node(*) MATCH n-[r?]-() WHERE ANY(x in n.type WHERE x = 'TestType') DELETE n, r 

Цель состоит в том, чтобы удалить все узлы с типом 'TestType. (Предложение OPTIONAL MATCH позволяет удалить любые отношения, которые могут существовать, чтобы узлы могли быть удалены.) Однако это приводит к удалению узлов других типов. Если я удалю опцию OPTIONAL MATCH (и предполагая, что узлы не имеют отношений), это работает так, как ожидалось, и удаляются только узлы типа «TestType».

При попытке отладить это, я изменил DELETE на RETURN и увидел, что с предложением OPTIONAL MATCH были возвращены узлы всех типов. Когда я удалял предложение OPTIONAL MATCH, возвращались только узлы типа «TestType».

Является ли это ошибкой, или я не правильно использую ДОПОЛНИТЕЛЬНЫЙ МАТЧ?

Спасибо.

Добавление:

Запрос предложенный Dan G произвел те же неправильные результаты. Все узлы были найдены, а не только узлы с данным типом. Однако следующий запрос работал, хотя я не совсем понимаю, почему мне нужно сделать, это:

START n=node(*) 
WHERE 'TestType' IN n.`Node-typenames` 
WITH n 
OPTIONAL MATCH n-[r]-() DELETE n,r 

Может кто-то поможет мне лучше понять это?

+1

Обновлено сообщение с дополнительной информацией – bjlevine

ответ

0

бы следующие работы:

Match (n) 
optional match (n)-[r]->() 
where 'TestType' in n.type 
delete n,r 
+0

я попробую. Но это не объясняет, почему мой исходный запрос не работает и почему он зависит от предложения OPTIONAL MATCH. – bjlevine

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