2016-05-22 11 views
1

neo4jで作成された次のグラフがあります。ここでuser1がuser2のとUSER3とメッセージを交換したORDER BYの使用方法とCypherクエリでの結果の集計方法

(user1)-[:EMAIL_SENT]->(Email)-[:EMAIL_TO]->(user2) 
(user1)<-[:EMAIL_TO]-(Email)<-[:EMAIL_SENT]-(user2) 
(user1)-[:EMAIL_SENT]->(Email)-[:EMAIL_TO]->(user3) 
(user1)<-[:REPLY_TO]-(Email)<-[:REPLY_SENT]-(user3) 
(user1)-[:REPLY_SENT]->(Email)-[:REPLY_TO]->(user3) 
私はparticipatorごとに最新のメッセージを表示USER1すなわちのためのFacebookのスタイルの結果を取得したいと思います

(送信または受信のどちらか)。以下のクエリは、user1とどの参加者が送受信したすべてのメッセージを表示しますが、参加者ごとの結果を集計します。

MATCH (U:User {username:'user1'}) 
    -[L:EMAIL_SENT|EMAIL_TO]-(E:email)-[R:EMAIL_SENT|EMAIL_TO]- 
    (P:User) 
    WHERE type(L)<>type(R) 
RETURN E.text as text, 
    E.subject as subject, 
    id(E) as message_id, 
    U.username as user, 
    P.username as participator, 
    (CASE type(L) WHEN 'EMAIL_SENT' THEN 'out' ELSE 'in' END) as direction 

私はこの

MATCH (U:User {username:'user1'}) 
    -[L:EMAIL_SENT|EMAIL_TO]-(E:email)-[R:EMAIL_SENT|EMAIL_TO]- 
    (P:User) 
    WHERE type(L)<>type(R) 
RETURN E.text as text, 
    E.subject as subject, 
    id(E) as message_id, 
    U.username as user, 
    P.username as participator, 
    (CASE type(L) WHEN 'EMAIL_SENT' THEN 'out' ELSE 'in' END) as direction ORDER BY E.timestamp DESC,collect (E.text) 

ような何かをしようとすると、私はエラーを取得する - 「前のRETURN(5行目、1列目には集約式が存在しない場合(オフセット順に凝集を使用することはできません:187))「のテキストとしてRETURN E.text、」

はまた、私はどのように特定の参加者

にすべての電子メールを取得するために収集し使用する前にタイムスタンプでソート後の参加者によるグループのすべての電子メールをするかわかりません

答えて

2

1)ご注文の際は、手配を必要とするコレクト・アズ・プロパティを使用することはできません。

2)このような何かを試してみてください:

// All interaction between the user `user1` and his partner 
MATCH (U:User {username:'user1'}) 
     -[L:EMAIL_SENT|EMAIL_TO|REPLY_TO|REPLY_SENT]- 
     (E:Email) 
     -[R:EMAIL_SENT|EMAIL_TO|REPLY_TO|REPLY_SENT]- 
     (P:User) 
     WHERE type(L)<>type(R) 

    // Sorted by time and get the type of interaction (the direction of) 
    WITH U, P, E, type(L) as D ORDER BY E.timestamp DESC 

    // Get collect of interactions (email and direction) by partner 
    WITH U, P, head(collect({email: E, direction: D})) as lastInteraction 

// Return last interaction between user and his partner 
RETURN U as User, 
     P as Partner, 
     lastInteraction['email']['subject'] as subject, 
     lastInteraction['email']['text'] as text, 
     lastInteraction['direction'] as direction 
    ORDER BY lastInteraction['email']['timestamp'] DESC 
+0

text(email.text)などの電子メールのプロパティを返すことはできませんか? Userと同じU.username – jas

+0

もちろん可能です。少し更新を見てください。 –

+0

現在方向がnullとして表示されます。以前のクエリでは、REPLY_TOまたはREPLY_SENTまたはEMAIL_SENTまたはEMAIL_TOのように方向を示していました – jas

1

はあなたのためにこの仕事をしていますか?

MATCH (U:User {username:'user1'})-[L:EMAIL_SENT|EMAIL_TO]-(E:email)--(P:User) 
WITH U, L, E, P 
ORDER BY E.timestamp DESC 
RETURN E.text as text, 
    E.subject as subject, 
    id(E) as message_id, 
    U.username as user, 
    P.username as participator, 
    (CASE type(L) WHEN 'EMAIL_SENT' THEN 'out' ELSE 'in' END) as direction; 

それはRETURN句の前にタイムスタンプを降順で電子メールを注文。また、オリジナルのMATCH/WHERE句も簡素化されています。

関連する問題