2016-05-15 8 views
0

Ich habe folgende Grafik in Neo4j erstellt.Cypher Abfrage, um alle E-Mails zu finden gesendet und erhalten einen Benutzer in neo4j

(user1)-(:EMAIL_SENT)->(email)-[:EMAIL_TO)->(user2) 
(user1)<-(:EMAIL_TO)-(email)<-[:EMAIL_SENT)-(user2) 
(user1)-(:EMAIL_SENT)->(email)-[:EMAIL_TO)->(user3) 

Hier hat user1 zwei E-Mails gesendet und eine E-Mail erhalten. Ich möchte eine Abfrage erstellen, um alle von Benutzer1 gesendeten und empfangenen E-Mails sowie Informationen anderer Benutzer zu erhalten, die E-Mails von Benutzer1 gesendet und empfangen haben.

Ich habe diese Abfrage, aber es zeigt nur E-Mails empfangen. Ich möchte es erweitern, um auch E-Mail zu senden. Nicht sicher, wie man das macht

OPTIONAL MATCH (you:User)<-[:EMAIL_TO]-(Email), 
      (they:User)-[:EMAIL_SENT]->(Email) 
WHERE you.username = user1 
RETURN Email.text AS text, 
     Email.subject AS subject, 
     Email.id AS message_id, 
     they.username AS emailfrom, 
     you.username AS loggedinuser 
+0

Bitte schreiben Sie die Beziehungen mit [] statt (). –

Antwort

1

Als eine Option - zwei verschiedene Möglichkeiten.

1) Verwenden Sie union Kombination abfragen:

MATCH (U:User {username:'user1'})-[:EMAIL_SENT]->(E:email)-[:EMAIL_TO]->(R:User) 
RETURN E.text as text, 
     E.subject as subject, 
     id(E) as message_id, 
     U.username as emailfrom, 
     R.username as emailto 
UNION 
MATCH (U:User {username:'user1'})<-[:EMAIL_TO]-(E:email)<-[:EMAIL_SENT]-(R:User) 
RETURN E.text as text, 
     E.subject as subject, 
     id(E) as message_id, 
     R.username as emailfrom, 
     U.username as emailto 

2) Bestimmen Sie die Richtung der E-Mail basierend auf der Art der Beziehung:

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 
+0

Funktioniert perfekt !! – jas

+0

eine Frage. Oben genannten Abfrage funktionieren perfekt, aber ich möchte es weiter zu etwas wie facebook messaging Ergebnisse haben, d. H. Neueste Nachricht pro Teilnehmer (entweder gesendet oder erhalten). Ist es möglich, dies mit Cypher-Abfrage zu erreichen? – jas

+0

@jas Ja, das ist möglich: Sie müssen zuerst die E-Mails nach Zeitstempel in absteigender Reihenfolge sortieren, dann von den Teilnehmern gruppieren und dann mit 'Collect' alle E-Mails an bestimmte Teilnehmer abrufen. –

Verwandte Themen