2 votes

Limite un enregistrement à une COLLECTION Cypher

Je suis en train de créer un système de messagerie et j'aimerais que la page d'index affiche le message le plus récent des personnes envoyant des e-mails, similaire à la plupart des applications de messagerie. Le problème, c'est que je n'arrive pas à limiter les résultats des messages à un seul et à les trier par date de 'created_at' des messages au lieu des personnes qui les ont envoyés.

Mon Cypher est :

MATCH (p:Person)-[:A_ENVOYE]->(m:Message)-[:ENVOYE_A]->(op:Person{username:"le_nom_utilisateur"})
WHERE NOT p.username = "le_nom_utilisateur"
WITH p,m
ORDER BY m.created_at DESC
RETURN DISTINCT p.first_name as first_name, 
                p.last_name as last_name, 
                p.username as username, 
                p.image_name as image_name,
                COLLECT({subject:m.subject, 
                         created_at:m.created_at, 
                         body:m.body, 
                         message_id:id(m),
                         status:m.status}) as message

Je souhaite que le résultat affiche le message le plus récent (en fonction de la propriété created_at du nœud Message) et ensuite trie les résultats par la propriété created_at pour que l'utilisateur puisse voir la personne qui lui a envoyé le dernier message.

Merci !

2voto

cybersam Points 37369

Pour obtenir uniquement le message le plus récent de chaque personne qui envoie un message à la personne ayant le nom d'utilisateur désiré, vous pouvez utiliser cette requête légèrement modifiée :

MATCH (p:Person)-[:SENT]->(m:Message)-[:SENT_TO]->(op:Person{username:"le_nom_d_utilisateur"})
WHERE NOT p.username = "le_nom_d_utilisateur"
WITH p,m
ORDER BY m.created_at DESC
WITH p, (COLLECT(m))[0] AS m0
RETURN DISTINCT p.first_name as first_name, 
                p.last_name as last_name, 
                p.username as username, 
                p.image_name as image_name,
                COLLECT({subject:m0.subject, 
                         created_at:m0.created_at, 
                         body:m0.body, 
                         message_id:id(m0),
                         status:m0.status}) as message

Les changements sont les suivants :

  1. Cette clause a été ajoutée : WITH p, (COLLECT(m))[0] AS m0. Cela regroupe tous les messages pour chaque expéditeur (par ordre décroissant de created_at), et garde seulement le premier message, lui donnant l'identifiant "m0".
  2. Les clauses suivantes ont été modifiées pour utiliser "m0" au lieu de "m".

Remarque : Dans le point #1, vous pourriez en fait utiliser AS m à la place, ce qui vous permettrait d'éviter de devoir faire le point #2. Mais j'ai choisi d'utiliser un identifiant différent pour rendre la requête plus facile à comprendre et à maintenir.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X