У меня recently asked about how to find all paths between two types os nodes in a way where all the edges in the path had the same attribute (как у того же ID). Это было бы что-то вроде:Поиск конкретного пути в Neo4j Быстро
MATCH (a {type: 'cin1'})-[rels:Next*1.. {value: 1}]->(b {type: 'cancer'})
RETURN (a), (b)
, где вместо того, чтобы иметь значение: 1 я бы значение: то же для всех ребер.
я нашел способ решить эту проблему, используя что-то вроде этого (так ответили на мой другой вопрос):
MATCH (a:Label {type: 'cin1'})
MATCH (b:Label {type: 'cancer'})
MATCH shortestPath((a)-[rels:Next*1..20]->(b))
WHERE ALL(r in tail(rels) WHERE (head(rels)).value = r.value)
RETURN (a), (b)
Проблема у меня в том, что этот подход сначала создать все возможные различные пути к затем отфильтруйте их, что в моем случае создает экспоненциально много путей. Возьмем, например, следующий график
Подход данное будет первым соответствовать всем пути:
id:1 -> id:1 -> id:1
id:1 -> id:2 -> id:1
id:1 -> id:1 -> id:2
id:1 -> id:2 -> id:2
id:1 -> id:2 -> id:3
...
И только затем отфильтровать эти параметры, чтобы вернуть 1-> 1-> 1, 2-> 2-> 2, 3-> 3-> 3 и так далее. Поэтому оказывается, что этот подход очень неэффективен, и мне интересно, есть ли более простой способ.
Есть ли способ, которым вы можете оптимизировать свои отношения? Сейчас я полагаю, что все они используют один и тот же ярлык с разными атрибутами. Можете ли вы изменить их на этикетки, или это невозможно? – InverseFalcon
не представляется возможным:/в основном у вас их слишком много –
Я боялся этого. Хотя я понимаю ваши проблемы с производительностью, мне интересно, если вы запустили это на образце набора данных, чтобы подтвердить, что производительность действительно является проблемой. Я предполагаю, что у вас есть огромный набор данных с довольно массивной сетью соединений? – InverseFalcon