2016-12-14 2 views
0

У меня есть график, состоящий из путей. enter image description here Мне нужно удалить все узлы, которые имеют свойство: linksTo: 'javascript' После удаления я должен повторно подключить пути. Это означает, что мне нужно создать новые отношения для каждого пробела. Это отношение имеет свойство с именем deltaTime, которое содержит некоторое целочисленное значение. Это значение (deltaTime) должно быть суммой всех свойств deltaTime удаленных отношений этого пути. Пожалуйста, посмотрите следующую картинку для лучшего понимания. enter image description here Я не знаю, как обнаружить несколько «плохих» узлов в строке с переменной длиной строки.Cypher - удалить узел с заданным свойством и восстановить граф

+0

Можете ли вы подтвердить, что все пути являются цепями, где каждый узел имеет только одно входящее отношение и одно исходящее отношение? Если это не так, то это может кардинально изменить запросы, которые будут работать. – InverseFalcon

ответ

0

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

Если предположить, что все эти пути цепь (только отдельные отношения, связывающие каждый узел), нечто подобное должно работать для вас:

// first, add a label on all the nodes we plan on deleting 
// it helps if they already have the same label especially if linksTo property is indexed. 
MATCH (n{linksTo:'javascript'}) 
SET n:ToDelete 

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

MATCH (a:ToDelete) 
WHERE NOT (:ToDelete)-->(a) 
AND()-->(a) 
MATCH p = (a)-[rel*0..]->(b:ToDelete) 
WHERE ALL(node in nodes(p) WHERE node:ToDelete) 
AND NOT (b)-->(:ToDelete) 
AND (b)-->() 
WITH a, b, REDUCE(s = 0, r IN rel | s + r.value) as sum 
// now get the adjacent nodes we need to connect 
MATCH (x)-[r1]->(a), (b)-[r2]->(y) 
WITH x, y, sum + r1.value + r2.value AS sumValue 
// making up relationship type and property name as I don't know what you're using 
MERGE (x)-[:Rel{value: sumValue}]->(y) 

Наконец, когда вы уверены, что новые отношения выглядят правильно, удалите узлы, которые вам больше не нужны.

MATCH (n:ToDelete) 
DETACH DELETE n 
+0

Это очень хороший ответ, и я уверен, что это может сработать. А есть поблем со второй частью. rel.value - это список отношений. SUM не может обрабатывать List и выдает несоответствие типа. – mudvayne

+0

Хороший улов, забытый SUM() не будет работать над коллекциями. Один из способов: UNWIND сбор отношений, а затем использование SUM(), но в этом случае я заменил его REDUCE, который мы будем использовать для накопления суммы. – InverseFalcon

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