Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/neo4j/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Neo4j 如何有效地计算组织图中两个团队之间发送的消息?_Neo4j_Cypher - Fatal编程技术网

Neo4j 如何有效地计算组织图中两个团队之间发送的消息?

Neo4j 如何有效地计算组织图中两个团队之间发送的消息?,neo4j,cypher,Neo4j,Cypher,我们有一个用于电子邮件通信的图表,其中包含以下节点。 人员{姓名、职务、角色} 消息{发送时间,属性1,属性2,…} 这些关系如下 节点:个人-->关系:向-->节点:个人报告 节点:人员-->关系:发送电子邮件-->节点:消息-->关系:接收电子邮件-->节点:人员 正如您可以想象的那样,在团队沟通中,员工与其经理之间存在1:1的关系。一名以上的员工可以向同一名经理报告。一个员工可以向多个员工发送一条消息,因此员工和消息之间存在1:1的发送电子邮件关系,而1:n接收消息和其他员工之间的电子邮件

我们有一个用于电子邮件通信的图表,其中包含以下节点。 人员{姓名、职务、角色} 消息{发送时间,属性1,属性2,…}

这些关系如下

节点:个人-->关系:向-->节点:个人报告

节点:人员-->关系:发送电子邮件-->节点:消息-->关系:接收电子邮件-->节点:人员

正如您可以想象的那样,在团队沟通中,员工与其经理之间存在1:1的关系。一名以上的员工可以向同一名经理报告。一个员工可以向多个员工发送一条消息,因此员工和消息之间存在1:1的发送电子邮件关系,而1:n接收消息和其他员工之间的电子邮件关系

给出这张图,我想在图中找到任意两位经理A和B之间交换的消息数量,即经理“A”的管理链中的任何一位(不仅仅是直接下属)向经理“B”的管理链中的任何一位发送的电子邮件数量

该图有10万个员工节点和15万条消息,总共有1.8亿个关系。我们正在使用最新的neo4j 2.2社区版,其中包含节点和关系的所有属性的模式索引

我编写了以下密码查询来获取此信息。但在64GB RAM windows服务器上返回结果的速度非常慢,ie>1分钟

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更有效