加入结果集

时间:2013-07-29 07:05:26

标签: neo4j cypher spring-data-neo4j

我希望我的朋友能够相互友好地拥有友谊。我为每个用户创建了节点,并创建了它们之间的属性关系。我已根据以下查询找到了我想要的结果。在这个测试用例中,我的登录用户名= 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个结果集。

我该怎么做?

1 个答案:

答案 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的朋友的情况。