0

我在 neo4j 中创建了一些节点和关系,并希望使用 cypher 进行查询。我正在解释更多关于它如下。

UserID  UserName 
------  --------
1       UserA
2       UserB
3       UserC
4       UserD
5       UserE
6       UserF

和节点之间的关系如下:

UserID  FriendID  ApprovalStatus (1.Request Accepted, 2.Request Pending)
------  --------  ------------------------------------------------------
1       2         1 
1       3         2 
1       6         2 
2       3         1 
2       4         1 
2       5         2 
3       6         1
3       5         2

我的登录用户是节点 1(例如 UserA),并试图从节点搜索。我期待neo4j的这个结果。

Record #  UserID  UserName  MutualCount       ApprovalStatus 
--------  ------  --------  ---------------   --------------  
1         2       UserB      1 (eg. node 3)   1               
2         3       Userc      0                2  
3         4       UserD      0                null
4         5       UserE      0                null
5         6       UserF      0                2 

检查以下几点: 记录#1:Node3 (UserC) 在 Node1 和 Node2 之间是相互的,因为它与两个节点都有 ApprovalStatus=1。

记录#2:
node1和node3之间没有相互关系,并且ApprovalStatus = 2,因为Node1已经向node3发送了请求,但是它还处于未决状态。

记录#3:
与记录#2中提到的情况相同

记录#4 & 5:
这里node1 & node4 之间没有相互关系,并且ApprovalStatus = null 因为Node1 从来没有向node4 & node5 发送过请求。

我在这里创建了一些虚拟数据

因此,您可以测试查询。我试图从过去 10-15 天得到这个结果,但我无法获得成功。有什么办法可以达到这个结果。

谢谢。

4

1 回答 1

0

您问题中的关系表没有任何相互关系,这就是您要查找的内容,因此我创建了一个非常相似的示例,该示例添加了从 B 到 A 的附加关系。

我在关系中添加了“接受”和“请求”状态:FRIEND,但正如@Stefan 在评论中提到的那样,使用不同的关系类型会更容易,例如:REQUESTED_FRIEND区分:FRIEND两者。在这种情况下,您可以从以下查询中删除 WHERE 子句:

START n=node(*) 
MATCH n-[r:FRIEND]->m, m-[r2:FRIEND]->n 
WHERE r.status='accepted' AND r2.status='accepted' 
RETURN n, COUNT(m) AS MutualCount, COLLECT(m.name)

返回:

n                   MutualCount     MutualWith
(5 {name:"B"})      1               [A]
(6 {name:"A"})      1               [B]
于 2013-07-27T22:42:09.037 回答