我希望我的朋友能够相互友好地拥有友谊。我为每个用户创建了节点,并创建了它们之间的属性关系。我已根据以下查询找到了我想要的结果。在这个测试用例中,我的登录用户名= 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
现在我想加入所有这些查询,就像我们在RDBMS中一样。表示结果集1st应该返回所有记录,加入2nd&amp;第3个结果集。
我该怎么做?
答案 0 :(得分:2)
当您查询图形数据库时,您应该从您知道的特定数据开始,然后从图形向外工作。使用START n=node(*) ...
非常昂贵:您要在整个用户图表中返回整个列表。但这不是你想要的,因为你只想要那些用户ID = 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
),他们的FirstName以dh
开头,并计算他们与me
共享的共同朋友的数量。
我还添加了AND NOT (me-[:FRIENDS]-> other)
条款,以删除other
也是me
的朋友的情况。