Neo4j 如何有效地计算组织图中两个团队之间发送的消息?
我们有一个用于电子邮件通信的图表,其中包含以下节点。 人员{姓名、职务、角色} 消息{发送时间,属性1,属性2,…} 这些关系如下 节点:个人-->关系:向-->节点:个人报告 节点:人员-->关系:发送电子邮件-->节点:消息-->关系:接收电子邮件-->节点:人员 正如您可以想象的那样,在团队沟通中,员工与其经理之间存在1:1的关系。一名以上的员工可以向同一名经理报告。一个员工可以向多个员工发送一条消息,因此员工和消息之间存在1:1的发送电子邮件关系,而1:n接收消息和其他员工之间的电子邮件关系 给出这张图,我想在图中找到任意两位经理A和B之间交换的消息数量,即经理“A”的管理链中的任何一位(不仅仅是直接下属)向经理“B”的管理链中的任何一位发送的电子邮件数量 该图有10万个员工节点和15万条消息,总共有1.8亿个关系。我们正在使用最新的neo4j 2.2社区版,其中包含节点和关系的所有属性的模式索引 我编写了以下密码查询来获取此信息。但在64GB RAM windows服务器上返回结果的速度非常慢,ie>1分钟Neo4j 如何有效地计算组织图中两个团队之间发送的消息?,neo4j,cypher,Neo4j,Cypher,我们有一个用于电子邮件通信的图表,其中包含以下节点。 人员{姓名、职务、角色} 消息{发送时间,属性1,属性2,…} 这些关系如下 节点:个人-->关系:向-->节点:个人报告 节点:人员-->关系:发送电子邮件-->节点:消息-->关系:接收电子邮件-->节点:人员 正如您可以想象的那样,在团队沟通中,员工与其经理之间存在1:1的关系。一名以上的员工可以向同一名经理报告。一个员工可以向多个员工发送一条消息,因此员工和消息之间存在1:1的发送电子邮件关系,而1:n接收消息和其他员工之间的电子邮件
MATCH (:Person { name:'A' }) <-[:ReportTo*]-(AO:Person) WITH AO
MATCH (:Person { name:'B' }) <-[:ReportTo*]-(BO:Person) WITH BO,AO
MATCH (AO)-[m:SENDS_EMAIL]-->(BO) RETURN COUNT(m)
MATCH(:Person{name:'A'})使用neo4j2.2
您可能希望从0开始。。所以包括经理本人
它必须计算两个集合之间的叉积
您可能希望将其限制为不同的用户
MATCH (:Person { name:'A' }) <-[:REPORTS_TO*0..]-(AO:Person)
// reduce cardinality to 1, to execute the following matches not n times
WITH collect(distinct AO) as first
MATCH (:Person { name:'B' }) <-[:REPORTS_TO*0..]-(BO:Person)
WITH distinct BO,first
UNWIND first as AO
RETURN SUM(SIZE((AO)-[:SENDS_EMAIL]->(BO)))
MATCH(:Person{name:'A})您的问题陈述中存在不一致/错误。例如,您的查询使用Person
标签,但您的文本使用Employee
。另外,您的文本显示有一个消息
节点标签和一个接收电子邮件
关系类型,但您的查询根本没有使用它们。除了我在上面更正的员工和人名混淆外,其余的都是正确的。这个查询有效!我们不需要使用Receives\u email关系。是吗?您的查询无法按您编写的方式工作[(AO)-[m:发送\u email]-->(BO)
不是合法的密码模式]。此外,您的文本没有显示发送电子邮件关系可以直接在两个个人
节点之间传递。因此,要么您需要显示更多的预期数据模型,要么您的数据不符合预期模型。谢谢Michael。不知道为什么我们需要在这里区分?一名员工只能属于一名经理,因此,经理手下的员工总是不同的。我遗漏了什么吗?好吧,我只是想排除这个可能性。但是collect将第二次匹配的行数减少为1。模式表达式应该更有效。这里的collect函数是什么?A0应为经理A下的所有员工,因此不应为1行。它应该是树中A下的员工总数。如果我们不使用上面的“收集”,也不确定我们是否真的需要在这里放松。我可以检查总和(大小x)是否比返回计数m更有效