Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.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
如何找到与cypher/neo4j中的一系列节点关联最密切的人_Neo4j_Cypher - Fatal编程技术网

如何找到与cypher/neo4j中的一系列节点关联最密切的人

如何找到与cypher/neo4j中的一系列节点关联最密切的人,neo4j,cypher,Neo4j,Cypher,我的人员和部门可能存在以下关系 (p:Person)-[:WORKS_IN]->(d:Department) (employee:Person)-[:REPORTS_TO]->(manager:Person) (child:Department)-[:UNIT_OF]->(parent:Department) 我没有得到识别某个部门经理的信息,但在任何部门中,关系最密切的人很可能就是老板。我正试图得到一份所有部门的名单,与该部门中“汇报对象”最多的人相匹配,但我失败得很惨 更

我的人员和部门可能存在以下关系

(p:Person)-[:WORKS_IN]->(d:Department)
(employee:Person)-[:REPORTS_TO]->(manager:Person)
(child:Department)-[:UNIT_OF]->(parent:Department)
我没有得到识别某个部门经理的信息,但在任何部门中,关系最密切的人很可能就是老板。我正试图得到一份所有部门的名单,与该部门中“汇报对象”最多的人相匹配,但我失败得很惨

更为复杂的是,各部门中存在“非部门”子组,定义为一个人可能向部门中不是部门经理的人报告

我正在寻找一种方法来输出所有部门id的列表,其中id是该部门向员工报告最多的id。每个部门一排比较理想


谢谢

我想这样的事情可能会让你开始

查找所有与
关系相关的
人员
条目,然后查找他们在哪个部门工作。按部门和最高报告对结果集进行排序。按部门汇总结果,然后仅返回第一个结果

MATCH (:Person)-[:REPORTS_TO]->(manager:Person)
WITH manager
//
MATCH (manager)-[:WORKS_IN]->(d:Department)
WITH d.name AS dept, manager.name AS manager, count(*) AS size
ORDER BY dept, size DESC
//
WITH dept, collect([manager,size]) AS managers
RETURN dept, managers[0][0] AS manager, managers[0][1] AS size 
ORDER BY size DESC, dept    

你不需要任何collect语句,只需要一次关系计数

MATCH (worker:Person)-[REPORTS_TO]->(manager:Person), 
      (manager:Person)-[WORKS_IN]->(department:Department)
WITH manager.name as managerName, 
     count(*) AS reportCount, 
     department.name as departmentName
WHERE reportCount > 0
RETURN managerName, reportCount, departmentName
此查询将统计所有与经理的关系相关的报告,并返回经理的姓名、报告数量和部门


如果您需要ORDER BY或GROUP BY语句,您可以将它们添加到每个经理、每个部门的报告排名中

戴夫的回答很好,但它忽略了部门经理被报告最多的情况。如果领带对你来说不重要,就坚持戴夫的答案

此查询有两个额外步骤,但应返回每个部门中报告数量最多的经理,包括那些报告数量最多的经理

// first find managers with people reporting to them
MATCH (manager:Person)-[:WORKS_IN]->(d:Department)
WHERE EXISTS((:Person)-[:REPORTS_TO]->(manager))
// get the number of reporters for each manager, then find the max for all managers in each department per department
WITH d, manager, size( (:Person)-[:REPORTS_TO]->(manager) ) as reportSize
WITH d, max(reportSize) as maxReports
// find all managers in the department with the department's max report size
MATCH (manager:Person)-[:WORKS_IN]->(d)
WHERE size( (:Person)-[:REPORTS_TO]->(manager) ) = maxReports
RETURN d, COLLECT(manager) as topManager, maxReports
这将返回部门和经理的节点,但您可以轻松地将其更改为从其属性中输出ID或名称

Cypher中的聚合按剩余的非聚合列进行分组,这就是为什么我们在计算
maxReports
时从范围中删除
manager
;这确保了聚合是按部门进行的,而不是按经理和部门进行的(这与按经理进行的报告相同)


可能有一种方法可以使用Neo4j 3.1即将进行的更改(截至2016年9月初仍在开发中)进行优化,它们确实有一个模式理解功能,可以像子查询一样工作,非常有用。

再次感谢。这个答案真的帮助我理解了serial With的威力,并向我介绍了尺寸(模式)选项。