Cypher: получить список связанных узлов из списка узлов

У меня есть модель, как:

введите описание изображения здесь(подстанции синим цветом, установки - желтым)

Я сопоставляю пути от определенных подстанций до определенных подстанций.

Match (s1:Substation) - [] - (:installation) - [ :feeds1..40 ] - (:installation) - (s2:Substation)

Это приведет к путям, существующим на начальной подстанции, 1 или более установках, а затем на закрытой подстанции (и, конечно же, между ними много ссылок) . Но на выходе я хочу видеть только все подключенные подстанции. Как мне получить это, если только установки находятся на моем пути???

Я попробовал что-то вроде:

with p, filter ( x IN nodes(p) where "ms_installatie" in LABELS(x) ) as installaties,

Но здесь нет хороших ответов.

В конце я хочу получить CSV-вывод всех подстанций "на пути" (не "в", это было бы легко!)

Любые предложения приветствуются.

Упрощенный вывод предложенного запроса:

[[
{"naam":"TILBURG NOORD","nummer":"TBN"},
{"naam":"QUIRIJNSTOK","nummer":"152.6870"},
{"naam":"BP NOORD-OOST TANGEND","nummer":"152.6258"},
{"naam":"VERELST BV""nummer":"152.2020"},
{"naam":"L.O.A. A1","nummer":"152.1200A1"},
{"naam":"TILBURG NOORD","nummer":"TBN"},
{"naam":"QUIRIJNSTOK","nummer":"152.6870"},
{"naam":"BP NOORD-OOST TANGEND","nummer":"152.6258"},
{"naam":"VERELST BV","nummer":"152.2020"},
{"naam":"L.O.A. A1","nummer":"152.1200A1"},
{"naam":"L.O.A. A1","nummer":"152.1200A1"},
{"naam":"TILBURG NOORD","nummer":"TBN"},
{"naam":"QUIRIJNSTOK","nummer":"152.6870"},
{"naam":"BP NOORD-OOST TANGEND","nummer":"152.6258"},
{"naam":"VERELST BV","nummer":"152.2020"},
{"naam":"L.O.A. A1","nummer":"152.1200A1"},
{"naam":"L.O.A. A1","nummer":"152.1200A1"},
{"naam":"L.O.A. A1","nummer":"152.1200A1"}
]]

На самом деле это 3 пути (показанные при возврате пути (p), см. Здесь описание изображения) . Выходной я хочу:

[[
{"naam":"TILBURG NOORD","nummer":"TBN"},
{"naam":"QUIRIJNSTOK","nummer":"152.6870"},
{"naam":"BP NOORD-OOST TANGEND","nummer":"152.6258"},
{"naam":"VERELST BV""nummer":"152.2020"},
{"naam":"L.O.A. A1","nummer":"152.1200A1"}
][
{"naam":"TILBURG NOORD","nummer":"TBN"},
{"naam":"QUIRIJNSTOK","nummer":"152.6870"},
{"naam":"BP NOORD-OOST TANGEND","nummer":"152.6258"},
{"naam":"VERELST BV","nummer":"152.2020"},
{"naam":"L.O.A. A1","nummer":"152.1200A1"},
{"naam":"L.O.A. A1","nummer":"152.1200A1"}
][
{"naam":"TILBURG NOORD","nummer":"TBN"},
{"naam":"QUIRIJNSTOK","nummer":"152.6870"},
{"naam":"BP NOORD-OOST TANGEND","nummer":"152.6258"},
{"naam":"VERELST BV","nummer":"152.2020"},
{"naam":"L.O.A. A1","nummer":"152.1200A1"},
{"naam":"L.O.A. A1","nummer":"152.1200A1"},
{"naam":"L.O.A. A1","nummer":"152.1200A1"}
]]

Удвоение / утроение последней станции является правильным, потому что эта станция имеет 3 установки, которые питают друг друга.

Спасибо.

1 ответ

Я не уверен на 100% в этом запросе (я не могу проверить его на ваших данных), но он должен быть довольно близок:

MATCH p=(s1:Substation)-->(:installation)-[:feeds*..40 ]-(:installation)<--(s2:Substation)
WITH s1 AS start, s2 AS end, filter(x IN NODES(p) WHERE "ms_installatie" in LABELS(x) ) as installaties
 UNWIND installaties as node
   MATCH (node)<--(ss:Substation)
   WITH start, end, collect(ss) AS ss_on_path
   RETURN [] + start + ss_on_path + end
Другие вопросы по тегам