2017-02-06 3 views
0

После попытки сделать это в нескольких случаях и искать везде в Интернете, чтобы найти связанные проблемы неуспешно, 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) 
+0

Ничего, решил это :) –

+0

Похоже, хорошее решение! Чтобы закрыть этот вопрос, вы могли бы скопировать и вставить решение в ответ и принять его? Таким образом, если ваш вопрос возникает как связанный с кем-то вопрос, он будет иметь четкое указание на то, что на этот вопрос был дан ответ. Если оставить его в покое, ссылки на него (например, в списке связанных вопросов справа) делают его похожим на неотвеченный вопрос без ответов. – InverseFalcon

+0

уверен :) отправил ответ –

ответ

0

Пользовался процедуры АПБО (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) 
Смежные вопросы