2016-11-19 3 views
0

Вот простой график:Neo4j: Как удалить все узлы и отношения за пределами узла?

(:a)-[:r]->(:b) 

Если хотите удалить (:b), я могу сделать это с помощью:

MATCH (a)-[r]->(b :b) 
DELETE a, r, b 

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

(:a)-[:r]->(:b)-[:s]->(x)-[:r]->(y)- ... ->(z) 

Как я могу рекурсивно удалить все узлы и отношения вне (b)?

+0

Обратите внимание, что если вы опускаете двоеточие в Cypher, вы указываете _variable_, а не _label_. Следовательно, ваш запрос не только удаляет '(: a) - [: r] -> (: b)' подграфы, а все '(...) - [...] - (: b)' подграф, где исходный узел и ребро могут иметь произвольные метки. Вместо этого вам понадобится 'MATCH (a: a) - [r: r] -> (b: b) DELETE a, r, b' –

+0

Просто для уточнения, существует ли определенный узел' b', который вы хотите удалить (а также связанный с ним подграф), или вы хотите сделать это для всех узлов с меткой ': b'?Если вы хотите удалить только определенный узел 'b' и его подграф, что отличает этот узел от других:' 'b? Это свойство 'name'? Другое свойство? – InverseFalcon

+0

@InverseFalcon Да, существует определенный узел ': b', и он имеет свойство с уникальным значением индекса. Извините за путаницу; Я попытался сделать пример кода максимально простым (но, очевидно, это было слишком просто!) – inersha

ответ

1

DETACH DELETE будет полезен здесь. Сначала удаляются все отношения с узла, а затем удаляется сам узел. Это упрощает ваш запрос, поскольку все, что вам нужно, это запрос для всех узлов, доступных из вашего узла b.

Я собираюсь предположить, что данный узел b в вашем вопросе является конкретным узлом, а не каждым узлом с меткой :b. Я рекомендую вам перечитать документацию разработчика по переменным и меткам, так как я предполагаю, что здесь немного путаницы.

Итак, предполагая определенный узел b и предполагая, что он имеет свойство имени, которое его отличает, вы можете использовать этот запрос для его удаления и весь подключенный к нему подграф и доступный из него.

MATCH (b:b)-[*0..]-(x) 
WHERE b.name = 'b' 
WITH DISTINCT x 
DETACH DELETE x 

Обратите внимание, что, потому что мы не заботимся о типе отношений, и потому, что мы указали 0 или больше отношения, х будет соответствовать к б и его весь связный подграф, независимо от того, сколько отношения прочь. Отсоединение и удаление x удалит все отношения в подграфе, а затем все узлы в подграфе.

1

Чтобы удалить рекурсивно из узла, вы можете использовать path variables: p=(source)-[type*minimumHops..maximumHops]->(target) (по умолчанию minimumHops - 1).

Пример набора данных:

CREATE 
    (a:a)-[:r]->(b:b), 
    (b)-[:r]->(c:c), 
    (c)-[:r]->(d:d), 
    (b)-[:r]->(e:e) 

Запрос:

MATCH (a:a)-[r:r]->(b:b) 
OPTIONAL MATCH p=(b)-[:r*]->(c) 
DELETE a, r, b, p 

Альтернативный, эквивалентный запрос:

MATCH 
    (a:a)-[r:r]->(b:b), 
    p=(b)-[:r*0..]->(c) 
DELETE a, r, p 

Стоит отметить, что оба будут работать в cornercase, где у вас есть только на вашем графике один край (:a)-[:r]->(:b). Первый запрос делает это, указывая путь в OPTIONAL MATCH, а второй делает это, разрешая пути нулевого перелета.

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