2017-02-16 13 views
0

Я новичок в Neo4j, и у меня возникают проблемы с возвратом данных. Я работаю над проектом визуализации социальных сетей. Я хочу получить все соединения и отношения (CONNECTED_TO) на основе идентификатора корневого узла, чтобы затем я мог перебирать данные и создавать структуру данных для D3.Cypher, получить все узлы с и отношения для данной метки без дубликатов, пустые отношения или пустые узлы

Current Schema Image

Я пытался играть с большим количеством запросов в браузере. Текущий возвращает правильный результат в браузере с автоматическим завершением, но результат, возвращаемый в NodeJS, возвращает дубликаты и пустые отношения.

MATCH p=(a:Connection)-[r:CONNECTED_TO]-(b:Connection)-[r2:CONNECTED_TO]-() 
WHERE id(a) = 1673 
RETURN [a, b] as nodes [r, r2] 

В приведенном ниже описании возвращается то, что я хочу, у него просто нет предложения WHERE. При добавлении пункта, где он возвращает только корень соединение и их непосредственные связи без всех отношений

MATCH (a:Connection)-[r:CONNECTED_TO]-(b:Connection) 
RETURN [a, b] AS nodes, r AS relationship 

набора данных средней части около 200 соединений и 2200 отношений поэтому производительность также и проблема иметь в разум.

Любая помощь была бы очень признательна.

UPDATE

Процедура расширения пути АПБО предложенный InverseFalcon работает отлично. Это очень эффективно по сравнению с использованием отношений переменной длины.

Вот результирующий запрос

MATCH (head:Connection) 
WHERE id(head) = 1673 
CALL apoc.path.expandConfig(head, {relationshipFilter:'CONNECTED_TO', uniqueness:'NODE_GLOBAL', bfs: true}) YIELD path 
WITH LAST(NODES(path)) as a 
MATCH (a)-[r:CONNECTED_TO]->(b) 
RETURN [a, b] as nodes, r as relationship 

ответ

0

Это звучит, как вы хотите, чтобы найти всю сеть для пользователя, а затем из этих узлов в сети, выход каждого спаривание узлов, соединенных: отношения CONNECTED_TO.

При использовании MATCH с variable-length relationships изучаются все пути, которые приведут к созданию избыточных отношений и могут взорваться в достаточно большой сети.

Процедуры APOC имеют эффективный способ расширения всех узлов подграфа с его path expansion procedure. Как только у нас есть все узлы подключения в сети, мы можем сопоставлять узлы, к которым они подключены, и выводить два узла вместе со связующим отношением.

Кроме того, из вашего описания пустых отношений это звучит немного, если у любого из этих отношений есть свойства. Текстовый вывод для отношений без свойств - это пустая карта {}, хотя в самом коде должны быть доступны идентификаторы отношений и данные типа.

Если вы хотите явно вернуть тип отношения вместе с его атрибутами, вы можете использовать map projection, чтобы включить тип отношения вместе с остальными его атрибутами.

Полный запрос может выглядеть следующим образом:

MATCH (head:Connection) 
WHERE id(head) = 1673 
CALL apoc.path.expandConfig(head, {relationshipFilter:'CONNECTED_TO>', uniqueness:'NODE_GLOBAL'}) YIELD path 
WITH LAST(NODES(path)) as a 
MATCH (a)-[r:CONNECTED_TO]->(b) 
RETURN [a, b] as nodes, r {TYPE(r), .*} as relationship 
+0

Отличный ответ InverseFalcon, очень хорошо вместе. Спасибо, что указал мне в правильном направлении. Некоторые из процедур APOC будут очень хорошо работать с другими функциями, которые я запланировал для этого проекта. –