Neo4j-Cypher: удалить узел из пути и сохранить связь со всеми узлами пути - PullRequest
0 голосов
/ 12 ноября 2018

Я хочу удалить один узел из пути, не подвергая опасности исходные узлы пути.

Это мой тестовый БД:

Test DB

Я хочу удалить узел (2) из ​​пути, но я хочу, чтобы узлы 1, 3, 4 и 5 оставались связанными в пути.

Есть ли способ сделать это в одном запросе? Пока у меня есть следующее:

MATCH p = (:Connect)-[:to*]-(:Connect)
WITH nodes(p) AS connectNodes
UNWIND connectNodes AS connectNode
WITH distinct connectNode
WHERE connectNode.connectID = 2
DETACH DELETE (connectNode)

Это удалит узел 2 и отсоединит путь

Unlinked graph

Как поддерживать связь между узлами исходного пути без узла 2?

EDIT

Я решил, изменив ответ принятого ответа

//Make sure node (n) belongs to the path
MATCH (n:Connect {cID:2})-[:to*]-(:Connect {cID:5})
//get attached nodes, if any, ignoring directions
OPTIONAL MATCH (oa:connect)-[:to]-(n)-[:to]-(ob:connect)
//make sure nothing is duplicated 
WHERE oa.cID <> ob.cID
//Use FOREACH to mimic if/else. Only merge oa to ob if they exist. Query fails without it
FOREACH (_ IN case when oa IS NOT NULL then [true] else [] end |
    MERGE (oa)-[:to {created: 1542103211}]-(ob)
)
//Get n, and get all connected nodes to it, and delete the relationship(s)
WITH n
OPTIONAL MATCH (n)-[r:to]-(:Connect) DELETE r 

Ответы [ 2 ]

0 голосов
/ 14 ноября 2018

Дополнительной возможностью будет удаление узла "2" и использование процедуры APOC "Перенаправление связи с". Подробное описание и иллюстрирующие изображения можно найти в документации по процедуре .

0 голосов
/ 12 ноября 2018

Это самый простой способ сделать это - сопоставить пути, которые будут разорваны, а затем создать новые ссылки в том же шифре, который удаляет узел.

// Match the target node for deletion
MATCH (n{id:2})
// Match broken paths, if any
OPTIONAL MATCH (a)-[ra]->(n)-[rb]->(b)
// Create new link to replace destroyed ones
CREATE (a)-[r:to]->(b)
// Copy properties over, if any
SET r+=ra, r+=rb
// Remove target node
DETACH DELETE n
// If you want to keep the node and just disconnect it, replace last line with
// OPTIONAL MATCH (n)-[r:to]-() DELETE r

Есть APOC функции, которые можно использовать для создания отношения с динамическим типом, если вы хотите скопировать тип из одного из удаленных отношений.

...