2014-05-02 92 views
3

的合計數我所在的電子郵件圖模型在這裏:http://console.neo4j.org/r/go164nNeo4j的Cypher支架查詢到連接節點

我試圖找到一個電子郵件地址被髮送到另一個消息的數量,反之亦然。

基本上,有幾個電子郵件地址節點以及連接電子郵件地址的消息節點。這些消息和電子郵件地址,節點之間的關係是:SENT or :Received_By

他們只能走一條路,所以地址將這些格式

  • EmailNode1-[:SENT]->MessageNode1
  • MessageNode1-[:Received_By]->EmailNode2

對於每封郵件節點,只能有一個發送者,但可能有多個接收者。

我想要得到的是兩個特定電子郵件地址之間的消息總數。

這意味着在我的例子,我想獲得的集合體:非但沒有去的消息的兩個獨立罪名的

MATCH (n:EmailAddress)-->(m:Message)-->(o:EmailAddress)WHERE n.address='[email protected]' AND o.address='[email protected]'WITH n, count(DISTINCT m) AS messageCount, oRETURN n.address, messageCount, o.address

MATCH (n:EmailAddress)<--(m:Message)<--(o:EmailAddress)WHERE n.address='[email protected]' AND o.address='[email protected]'WITH n, count(DISTINCT m) AS messageCount, oRETURN n.address, messageCount, o.address

無論如何,我想知道是否有密碼查詢自動將這些數字加起來

MATCH (n:EmailAddress)--(m:Message)--(o:EmailAddress)不能工作的原因是因爲可能有第三個電子郵件地址節點可能會將郵件發送到其他兩個電子郵件地址。這將使兩個電子郵件地址接收器,我不想數這些消息。

謝謝!

編輯:

嘿!其實,我可能會讓你感到困惑。我希望返回是兩個電子郵件之間的消息的聚合。的東西,將結束與

n.address messageCount o.address
[email protected] 2 [email protected]

我不能使用MATCH(N:EmailAddress的) - (m爲消息) - (O:)移轉 ,因爲它也將計算已發送到他們兩個,但是從沒有reciever

+0

我的編輯下面解決了這個問題嗎?它現在計算節點之間的消息數量。 – mttdbrd

回答

1

我想這你想要做什麼電子郵件:

MATCH (n:EmailAddress)-[:SENT]-(m:Message)-[:Received_By]-(o:EmailAddress) 
WHERE (n.address='[email protected]' AND o.address='[email protected]') 
OR (o.address='[email protected]' AND n.address='[email protected]') 
WITH n, m, count(DISTINCT m) AS messageCount, o 
RETURN n.address, messageCount, o.address, m.body 

好像有你的錯誤也要創建代碼,因爲它會使用相同的數據創建兩個單獨的圖。您需要括號圍繞標識符:

CREATE (_6:EmailAddress { address:"[email protected]" }), 
(_7:EmailAddress { address:"[email protected]yahoo.com" }), 
(_8:EmailAddress { address:"[email protected]" }), 
(_9:Message { body:"Sam Sucks" }), 
(_10:Message { body:"I suck" }), 
(_11:Message { body:"We ALL suck" }), 
(_6)-[:SENT]->(_9), 
(_7)-[:SENT]->(_10), 
(_8)-[:SENT]->(_11), 
(_9)-[:Received_By]->(_7), 
(_10)-[:Received_By]->(_6), 
(_11)-[:Received_By]->(_6), 
(_11)-[:Received_By]->(_7) 

它返回如下:

n.address   messageCount o.address    m.body 
[email protected] 1    [email protected]  Sam Sucks 
[email protected] 1    [email protected]  I suck 

Query took 41 ms and returned 2 rows. 

編輯1:

如果你想要的是一個數,簡化了查詢:

MATCH (n:EmailAddress)-[:SENT]-(m:Message)-[:Received_By]-(o:EmailAddress) 
WHERE (n.address='[email protected]' AND o.address='[email protected]') 
OR (o.address='[email protected]' AND n.address='[email protected]') 
RETURN count(*) 
+0

請看看我上面的編輯。我可能已經在我需要的內容中混淆了你 – user2819872

+0

@ user2819872我簡化了查詢,使其只返回兩個用戶之間的電子郵件數。因爲您必須在查詢中指定它們,所以不需要返回兩個用戶電子郵件。 – mttdbrd

相關問題