Neo4j Cypher Query汇总连接节点的数量

时间:2014-05-02 21:02:57

标签: neo4j cypher

我的电子邮件图表模型位于此处:http://console.neo4j.org/r/go164n

我正在尝试查找从一个电子邮件地址发送到另一个电子邮件地址的邮件计数,反之亦然。

基本上,有几个电子邮件地址节点以及连接电子邮件地址的消息节点。这些邮件和电子邮件地址节点之间的关系为:SENT or :Received_By

他们只能采用一种方式,因此地址将采用这些格式

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

对于每个消息节点,只能有一个发送方,但可能有多个接收方。

我想要获得的是两个特定电子邮件地址之间的消息统计总数

这意味着在我的例子中,我试图得到一个聚合:

MATCH (n:EmailAddress)-->(m:Message)-->(o:EmailAddress)WHERE n.address='Yoprado@yahoo.com' AND o.address='SammyGee@yahoo.com'WITH n, count(DISTINCT m) AS messageCount, oRETURN n.address, messageCount, o.address

MATCH (n:EmailAddress)<--(m:Message)<--(o:EmailAddress)WHERE n.address='Yoprado@yahoo.com' AND o.address='SammyGee@yahoo.com'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
Yoprado@yahoo.com 2 SammyGee@yahoo.com

我不能使用MATCH(n:EmailAddress) - (m:Message) - (o:EmailAddress) 因为它也会计算发送给他们的电子邮件,但不会收到来自两个收件人的电子邮件

1 个答案:

答案 0 :(得分:1)

我认为这可以满足您的需求:

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

您的创建代码中似乎也存在错误,因为它会创建两个具有相同数据的单独图形。你需要围绕标识符的parens:

CREATE (_6:EmailAddress { address:"Yoprado@yahoo.com" }),
(_7:EmailAddress { address:"SammyGee@yahoo.com" }),
(_8:EmailAddress { address:"Moniqua@yahoo.com" }),
(_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
Yoprado@yahoo.com   1               SammyGee@yahoo.com      Sam Sucks
SammyGee@yahoo.com  1               Yoprado@yahoo.com       I suck

Query took 41 ms and returned 2 rows.

编辑1:

如果你想要的只是一个计数,那就简化了查询:

MATCH (n:EmailAddress)-[:SENT]-(m:Message)-[:Received_By]-(o:EmailAddress)
WHERE (n.address='Yoprado@yahoo.com' AND o.address='SammyGee@yahoo.com') 
OR (o.address='Yoprado@yahoo.com' AND n.address='SammyGee@yahoo.com')
RETURN count(*)