После попытки сделать это в нескольких случаях и искать везде в Интернете, чтобы найти связанные проблемы неуспешно, iv'e решил спросить здесь - надеюсь, вы сможете помочь.Поиск всех подключенных подграфов с графика neo4j
Моя проблема в этом -> Я пытаюсь найти все несвязанные подграфы в neo4j db. Основная проблема здесь заключается в том, что пересечение в одном направлении от данного узла в соединенном множестве не будет пересекать все узлы в соединенном множестве -> он будет пересекать только те, которые находятся в определенном направлении в запросе, подобном этому :
match (a:TempNode)-[r*]->(n)
where NOT (a)<-[:LINKED|LINKED2]-(:TempNode)
return distinct(a.Lineage+collect(distinct(n.Lineage)))
(предполагая, что второе условие «Где» является предполагаемым «начальным» узлом для множеств).
Проблема заключается в том, что мой график заполнен связными множества, как следующее:
Conncted set Example
и так, как вы можете видеть, он имеет много узлов с противоречивыми направлениями краев между ними.
Запуск неориентированный запрос типа:
match (a:MetasetFeature)-[r*]-(n)
return a,collect(distinct(n))
Может работать, если я положить в фильтр, чтобы получить некоторый определенный набор, но я не могу поставить фильтры внутри, так как я хочу, чтобы все мои subconnected наборы, и это будет работать навсегда, и у меня есть ~ 2000 таких наборов с количеством узлов ~ 40000.
Любой совет, как я могу эффективно решить эту проблему?
Я пытаюсь придумать способ создания нового графика из существующего, в котором все наборы будут начинаться с одного узла (например, с минимальным id) и будут иметь только одно направление, пока узел с наивысшим идентификатором, что в сущности означает создание упорядоченного набора из каждой связанной группы, но не может его достичь.
Любые советы были бы весьма полезными.
Спасибо!
* РЕДАКТИРОВАТЬ: Ничего, решите это :).
Пользовался процедурами АПБО (https://github.com/neo4j-contrib/neo4j-apoc-procedures/releases)
Чтобы получить доступ к обходу API, и использовать его, чтобы решить эту проблему, используя этот запрос, если кто-то нуждается в нем:
MATCH (cs:SomeLabel)-[:LINKED]->(:SomeLabel)
where NOT (cs)<-[:LINKED]-(:SomeLabel)
CALL apoc.path.expandConfig(cs, {relationshipFilter:"LINKED",uniqueness:"NODE_GLOBAL",bfs:false}) YIELD path
WITH cs.Lineage as source, path
unwind extract(x in nodes(path) | x.Lineage) as node
with source, collect(distinct(node)) as set
unwind set as setMember
with source,setMember
order by setMember
with source,collect(setMember) as orderedSet
return distinct(orderedSet)
Ничего, решил это :) –
Похоже, хорошее решение! Чтобы закрыть этот вопрос, вы могли бы скопировать и вставить решение в ответ и принять его? Таким образом, если ваш вопрос возникает как связанный с кем-то вопрос, он будет иметь четкое указание на то, что на этот вопрос был дан ответ. Если оставить его в покое, ссылки на него (например, в списке связанных вопросов справа) делают его похожим на неотвеченный вопрос без ответов. – InverseFalcon
уверен :) отправил ответ –