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