Я бы хотел немного очистить базу данных графов, удалив ненужные узлы.В одном случае ненужными узлами являются узлы B между узлами A и C, где B имеет то же имя, что и узел C, и НИКАКИХ ДРУГИХ входящих связей.У меня возникают проблемы при создании запроса Cypher, который ограничивает количество входящих ребер.
Первая часть была простой:
MATCH (n1:TypeA)<-[r1:Inside]-(n2:TypeB)<-[r2:Inside]-(n3:TypeC)
WHERE n2.name = n3.name
Основано на других вопросах SE (особенно этоone ) Затем я попытался сделать что-то вроде:
WITH n2, collect(r2) as rr
WHERE length(rr) = 1
RETURN n2
, но это также вернуло узлы с более чем одним входящим фронтом.Кажется, мое предложение WHERE
по длине не фильтрует возвращенные узлы n2
.Я попробовал несколько других вещей, которые я нашел в Интернете, но они либо ничего не возвращали, либо не были синтаксически правильными в текущей версии.
После того, как я найду n2
узлы, которые соответствуют шаблону, я хочу подключить n3
напрямую к n1
и DETACH DELETE n2
.Опять же, я легко смог выполнить эту часть, когда мне не нужно было ограничивать число входящих ребер до n2
.Этот предыдущий вопрос имеет FOREACH (r IN rr | DELETE r)
, но я хочу отменить удаление n2
узлов, а не только этих ребер.Я не знаю, как правильно адаптировать это для работы на узлах, подключенных к r
s, и я, конечно, хочу быть уверен, что он находит правильные узлы перед удалением чего-либо, так как в Neo4j отсутствует базовая функциональность отмены (но вы не можете поставитькоманда RETURN
внутри FOREACH
по какой-то безумной причине).
Как отфильтровать узлы на пути по количеству входящих ребер с помощью Cypher?
Я думаю, что я могу сделать это в py2neo, сначала собрав все n1,n2,n3
тройки, соответствующие шаблону, затем пройдя каждую возвращенную запись и добавив их в список, если n2
имеет только один входящий фронт.Затем просмотрите этот список и выполните операцию обрезки, но если это можно сделать в чистом Cypher, то я хотел бы знать, как, потому что у меня есть ряд аналогичных настроек.