2013-07-29 5 views
0

Я хочу, чтобы взаимное мнение моих друзей о статусе дружбы. Я создал узлы для каждого пользователя и создал связь между ними. Я нашел желаемый результат по следующим запросам. В этом случае мой логин userid = 1, и я хочу искать тех пользователей, которые начинаются с буквы «dh». поэтому мой запрос выглядит следующим образом.Присоединиться к результату

1st Query : which is returned all users with specific given keyword. 
-------------------------------------------------------------------- 
START other=node(*) 
WHERE other.FirstName =~ "(?i)dh.*" AND other.UserID <> 1 
WITH other, me=node:node_auto_index(UserID = '1') 
RETURN other.UserID, other.UserName, other.FirstName, other.LastName, other.ImagePath 
LIMIT 100; 

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

2nd Query : which is returned approvalstatus between user1 and other 
-------------------------------------------------------------------- 
START me=node:node_auto_index(UserID = '1') 
MATCH me-[myR:friends]-(x) 
RETURN x.UserID, myR.ApprovalStatus 
ORDER BY x.UserID 

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

3rd Query : which is returned mutual count between user1 and other 
------------------------------------------------------------------ 
START me=node:node_auto_index(UserID = '1'), other=node(*) 
MATCH pMutualFriends=me-[r:friends]-mf-[r1:friends]-other 
WHERE r.ApprovalStatus = 1 
AND r1.ApprovalStatus = 1 
AND other.FirstName =~ "(?i)dh.*" AND other.UserID <> 1 
RETURN other.UserID, COUNT(pMutualFriends) AS mutualCount 
ORDER BY other.UserID 

Теперь я хочу присоединиться ко всем этим запросам, как в РСУБД. означает набор результатов 1-й должен возвращать все записи, присоединяться со вторым & 3-й результирующий набор.

Как это сделать?

ответ

2

Когда вы запрашиваете график db, вы должны начать с куска конкретных данных, которые вы знаете, и работать там на графике. Использование START n=node(*) ... очень дорого: вы возвращаете весь список по всему графику пользователей. Однако это не то, что вы хотите, поскольку вам нужны только те, которые подключены к пользователю с помощью UserID = 1.

START me=node:node_auto_index(UserID = '1') 
MATCH me-[r:FRIENDS]-friend-[r1:FRIENDS]-other 
WHERE other.FirstName =~ "(?i)dh.*" AND other.UserID <> 1 
    AND r.ApprovalStatus = 1 AND r1.ApprovalStatus = 1 
    AND NOT (me-[:FRIENDS]-> other) 
RETURN other.UserID, other.FirstName, COUNT(friend) AS MutualCount 

Это находит все друг друзей (other), которые имеют ПгвЬЫат, который начинается с dh и подсчитывает количество взаимных друзей, которые они разделяют с me.

Я также добавил статью AND NOT (me-[:FRIENDS]-> other), чтобы удалить случай other, также являющийся другом me.

+0

Спасибо @Edward, ваш запрос очень полезен для меня. но одна вещь отсутствует. Мне нужен весь узел, у которого есть имя, начинающееся с 'dh'. здесь в вашем запросе возвращаются только те узлы, которые подключены к пользователю 1. И я также хочу, чтобы свойство «УтверждениеStatus» было связано с отношениями. вы можете помочь мне получить желаемый результат? –

+0

Привет, @edward, можем ли мы присоединиться к 3 наборам результатов с идентификатором пользователя? как RDBMS left join. поэтому все узлы получаются из результата 1 с «ApprovalStatus» из результата 2 и «MutualCount» из результата 3. Получите ли вы то, что я хочу сказать? ожидая ответа. Благодарю. –

+2

Я изо всех сил пытаюсь понять вопрос, который вы задаете. Это «Найти всех пользователей, у которых есть имя, которое начинается с« dh »и возвращает общий счет друга с каждым человеком, с которым у них есть друг.»? – Edward

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