2016-05-15 55 views
0

我對Neo4j的創建如下圖。Cypher支架查詢查找所有發送的電子郵件和接收我的用戶在Neo4j的

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

此處user1發送了兩封電子郵件並收到一封電子郵件。我想建立一個查詢通過用戶1加誰發送的從用戶1

我有這個疑問收到的電子郵件,但它是隻顯示收到的電子郵件的其他用戶的信息檢索所有發送和接收的電子郵件。我希望它將其擴展爲包括髮送的電子郵件。不知道該怎麼做

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

請寫出用[]代替關係( )。 –

回答

1

作爲一個選項 - 兩種不同的方式。

1)使用union查詢組合:

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)確定該電子郵件的基於關係的類型的方向:

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

完美無缺! – jas

+0

有一個問題。以上查詢工作完美,但我想進一步修改它,以獲得類似於Facebook消息傳遞結果的內容,例如顯示每個參與者(發送或接收)的最新消息。使用Cypher查詢可以實現嗎? – jas

+0

@jas是的,這是可能的:你必須首先將電子郵件通過時間戳降序組由參與者和排序,然後再使用'collect'檢索所有電子郵件給特定的參與者。 –

相關問題