У меня есть сеть (например, сеть водоснабжения), и я хочу найти топологические структуры: кластеры (круговые пути), мосты (отношения, соединяющие кластеры) и деревья (остальные).
Оператор Cypher для создания примера сети находится здесь. nofollow noreferrer">https://www.dropbox.com/s/e1gtqxlm9ngaau5/Cypher%20to%20create%20example%20network.cql?dl=0) Синие отношения — это кластеры, которые я ищу, красные - мосты, а зеленые - деревья.
Чтобы найти кластеры, у меня есть два подхода, оба из которых возвращают правильные результаты. Но оба слишком медленные.
Подход 1: Начните с отношений и посмотрите, есть ли второй путь между начальным и конечным узлами. Это занимает около 10 миллионов ударов дБ
MATCH (n:WN)-[r:PIPE]->(m:WN)
WHERE EXISTS((n)-[r]->(m)-[:PIPE*2..]-(n))
RETURN r
Подход 2: Начните с поиска круговых путей, игнорируя направления. (около 12000), а затем извлеките уникальные связи. Это занимает около 20 миллионов ударов дБ.
MATCH path=(n:WN)-[:PIPE*..]-(n)
RETURN
apoc.coll.subtract(
apoc.coll.flatten(COLLECT(relationships(path))
),
[]
)
AS clusterRelationships
Есть ли более разумный подход, дающий результаты быстрее?