2016-07-25 2 views
0

Внутри графика есть группа G1 - эта группа G1 имеет 3 подгруппы S1, S2 и S3. Отношение классифицируется как IS_SUBGROUP_OF. G1 сам снова является подгруппой другой группы, назовем его D1. D1 имеет много подгрупп, где G1 - только один.График перемещения только на одном уровне

Наличие пользователя U1, являющегося членом подгруппы G1 - здесь S1. Я хочу создать запрос, который сможет собрать всех пользователей подгруппы S1, пройти от пользователя U1 до S1 и оттуда до G1, получить пользователей G1 и вниз от G1 до S2 и S3 и захватить всех пользователей из S2 и S3 также. Конечным результатом должны быть все пользователи в подгруппах S1, S2 и S3 из родительской группы G1, включая пользователей G1.

Я попытался:

MATCH (d:User) --> (S1:Subgroup)-[:IS_SUBGROUP_OF*0..]->(G1:Group) 
WHERE d.name = "U1" 
RETURN d 

К сожалению, я пройти все группы и вернуть всем пользователям какой-либо группы в графе. Я попытался изменить уровень прыжка в отношении (например, только 1), но не смог. У вас есть подсказка, как создать запрос, чтобы получить только эту подгруппу пользователей?

Название групп только для примера и не известно в реальном мире - все, что я знаю, является именем пользователя (здесь: U1) - и оттуда мне нужно найти различные группы, зависящие от того, где находится пользователь. Поэтому в запросе я не могу работать с именами групп, но только с переменными, поскольку они неизвестны.

* EDITED *

Извините за сумбур, я labeld S1 неправильно как в Подгруппы, но только отношение упоминает «IS_SUBGROUP_OF», поэтому все узлы группы имеют метку «Group», D1 будет также иметь label 'Group'. Я также добавляю метку отношения для пользователей, поэтому утверждение выглядит следующим образом:

MATCH (d:User) -[:IS_MEMBER_OF]-> (S1:Group)-[:IS_SUBGROUP_OF*0..]->(G1:Group) 
WHERE d.name = "U1" 
RETURN d 
+0

S1, S2, S3 имеют метку 'Subgroup', G1 имеет' Group', а что же D1? И как называется связь между (под) группой и пользователем? Можете ли вы обновить этот вопрос? –

+0

Я исправил и расширил запрос из своего вопроса. – Balael

ответ

1

Этот ответ предполагает, что пользователь идентифицирован как член группы соотношением IS_MEMBER_OF.

Запрос сначала определяет родительскую группу G1 на основании предоставленного пользователем U1. Затем он определяет всех пользователей дочерних групп G1 (S1, S2, S3) и возвращает коллекцию отдельных пользователей по дочерним группам.

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

// follow IS_MEMBER_OF or IS_SUBGROUP_OF relationships up 
// the group/user hierarchy to find the parent group two 
// levels up 
match (u:User1 {name: 'U1'})-[:IS_MEMBER_OF|IS_SUBGROUP_OF*2]->(g:Group) 

// using the parent group 
with g 

// follow the IS_MEMBER_OF or IS_SUBGROUP_OF relationships back down 
// the hierarchy to find all of the peer users or the original user  
match (g)<-[:IS_MEMBER_OF|IS_SUBGROUP_OF*2]-(u:User) 
return collect(distinct u) 
+0

Спасибо за этот подход. Я пытаюсь обернуть свой разум вокруг предложения, поскольку я не понимаю, почему у нас было бы в отношении между пользователем и группой надпись «IS_SUBGROUP_OF». Чувство - это совпадение (u: User {name: 'U1'}) - [: IS_MEMBER_OF] -> (g: Group) с g матч (g) <- [: IS_MEMBER_OF] - (u: Пользователь) return collect (distinct u) дает тот же результат? Также запрос перемещается до D1 и собирает пользователей из следующего набора подгрупп ниже (позволяет называть его X1 с XS1, XS2, XS3), который не был предназначен. Борьба :) – Balael

+0

Странно ... Насколько я могу судить, этот запрос должен работать. Это немного смущает совпадение OR с метками отношений со степенью 2, но оно должно выполнить задание ... – InverseFalcon

+0

Я построил тестовый график, и вы оба правильны, он работает так, как описано. Кажется, в моем первоначальном графике есть ошибка. Так что запрос правильный - спасибо очень! – Balael

0

Будет ли это работать?

MATCH (d:User)-[*0..1]-(G1:Group) 
WHERE d.name= 'U1' 
RETURN DISTINCT d 
+1

Привет, спасибо за ввод.Я предполагаю, что до тех пор, пока мы запрашиваем пользователя по имени в предложении where, мы будем получать именно этого пользователя независимо от того, сколько групп и пользователей задействовано. – Balael

2

Давайте попробуем это, небольшая подстройка на ответ Дэйва (который должен работать хорошо, насколько я могу сказать ...)

MATCH (:User {name: 'U1'})-[:IS_MEMBER_OF]->(:Group)-[:IS_SUBGROUP_OF]->(superGroup:Group) 
WITH superGroup 
MATCH (superGroup)<-[:IS_SUBGROUP_OF*0..1]-(:Group)<-[:IS_MEMBER_OF]-(users:User) 
RETURN COLLECT(DISTINCT users) 

На основе исходного пользователя, это находит прародитель группы или супергруппы (G1 в соответствии с вашим примером), а затем совпадает с пользователями, которые являются членами G1 или любой из его непосредственных подгрупп, и возвращает отдельную коллекцию. Он будет включать в себя оригинал согласованного пользователя.

+0

Привет, отлично, это требует моих знаний еще немного, поскольку я знаю, есть также решение, как включить превосходную группу. Очень полезно. – Balael

Смежные вопросы