Таким образом, для этого будет быстрее использовать процедуры APOC, поскольку есть несколько полезных функций сбора и процедуры, которую мы хотим легко получить, которые существуют между группой узлов.
Идея в том, что мы сопоставим подключенные узлы: B, используем процедуру cover()
, чтобы получить все отношения между этими узлами, собрать эти отношения, и из них взять один из узлов для этих отношений (мы мы будем использовать начальный узел здесь), а затем мы просто вычтем эти выбранные узлы из нашего списка, оставив нас с узлами: B, которые мы хотим:
MATCH (a:A)--(b:B)
WITH collect(b) as bNodes
CALL apoc.algo.cover(bNodes) YIELD rel
WITH bNodes, [r in collect(rel) | startNode(r)] as toRemove
RETURN apoc.coll.subtract(bNodes, toRemove) as nodes
Если у вас нет (или вы не хотите использовать) APOC, вот версия для шифра:
MATCH (a:A)--(b:B)
WITH collect(b) as bNodes
UNWIND bNodes as b
OPTIONAL MATCH (b)-[r]-(other)
WHERE other IN bNodes
WITH bNodes, collect(DISTINCT startNode(r)) as toRemove
RETURN [b in bNodes WHERE NOT b in toRemove] as nodes