如何找到与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的威力,并向我介绍了尺寸(模式)选项。