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) は、両方のノードで ApprovalStatus=1 であるため、Node1 と Node2 の間で相互です。

レコード # 2 :
node1 と node3 の間に相互関係はなく、ApprovalStatus = 2 は、Node1 が node3 に要求を送信したが、まだ保留中であるためです。

レコード #3 :
レコード #2 と同じ状況

レコード # 4 & 5:ノード 1 とノード 4
の間に相互関係はなく、ApprovalStatus = null は、ノード 1 がノード 4 とノード 5 に要求を送信したことがないためです。

ここにダミーデータを作成しました

したがって、クエリをテストできます。過去 10 ~ 15 日間でこの結果を得ようとしていますが、成功しません。この結果を達成する方法はありますか。

ありがとう。

4

1 に答える 1

0

あなたの質問の関係テーブルには相互関係がありません。これはあなたが探しているように見えるので、B から A に追加の関係を追加する非常によく似た例を作成しました。

関係に「承認済み」と「要求済み」のステータスを追加しまし:FRIENDたが、コメントで @Stefan が言及しているように、 などの異なる関係タイプを使用したり、2 つを区別し: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 に答える