首页 文章

Neo4j - 相互计数的搜索列表

提问于
浏览
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发送过请求 .

我在here上创建了一些虚拟数据

所以,你可以测试查询 . 我试图从过去的10-15天得到这个结果,但我无法获得成功 . 有没有办法达到这个结果 .

谢谢 .

1 回答

  • 0

    你问题中的关系表没有任何相互关系,这就是你正在寻找的东西,所以我创建了一个very similar example,它增加了从B到A的附加关系 .

    我在 :FRIEND 关系中添加了状态"accepted"和"requested",但正如@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]
    

相关问题