如何';展平';Neo4j cypher的结果如何?

如何';展平';Neo4j cypher的结果如何?,neo4j,Neo4j,我有以下表格(类似于Northwind示例数据库): 以下是我期望的结果: 或 我应该怎么做?我认为最好的方法是为您关心的路径部分定义一个变量,然后使用该路径: MATCH (e:Employees)-[:JOB_LEVEL_OF]->(el:EmployeeLvls) WHERE e.Name ="Vidur Luthra" //limiting to a single employee MATCH (p:Products)-[:PRODUCT]->(owd:OrdersW

我有以下表格(类似于Northwind示例数据库):

以下是我期望的结果: 或


我应该怎么做?

我认为最好的方法是为您关心的路径部分定义一个变量,然后使用该路径:

MATCH
  (e:Employees)-[:JOB_LEVEL_OF]->(el:EmployeeLvls)
WHERE e.Name ="Vidur Luthra" //limiting to a single employee
MATCH
  (p:Products)-[:PRODUCT]->(owd:OrdersWithDetails)<-[:SOLD]-(e),
  reporting_path=(e)-[:REPORTS_TO*0..4]->(m:Employees)
  (m)-[:JOB_LEVEL_OF]->(el_m:EmployeeLvls)
WHERE
  NOT((m)-[:REPORTS_TO]->()) AND
  m.EmployeeId <> e.EmployeeId  //excluding employee
RETURN
  e.Name as Employee,
  owd.OrderId,
  SUM(owd.ProductQuantity * p.UnitPrice) as SoldAmt,
  (nodes(reporting_path)[0]).Name AS Manager_1_LevelAbove,
  (nodes(reporting_path)[1]).Name AS Manager_2_LevelAbove,
  (nodes(reporting_path)[2]).Name AS Manager_3_LevelAbove
匹配
(e:员工)-[:工作级别]->(el:员工层)
其中e.Name=“Vidur Luthra”//仅限于一名员工
匹配
(p:产品)-[:产品]->(owd:订单详细信息)(m:员工)
(m) -[:工作级别]->(el_m:员工层)
哪里
不((m)-[:向]->()报告)和
m、 EmployeeId e.EmployeeId//不包括员工
返回
e、 作为雇员的姓名,
owd.OrderId,
总金额(owd.ProductQuantity*p.UnitPrice)为SoldAmt,
(节点(报告路径)[0])。名称为上面的管理器\u 1\u级别,
(节点(报告路径)[1])。名称为上面的管理者,
(节点(报告路径)[2])。名称为上面的管理者

请注意,我在这里为
NOT((m)-[:REPORTS\u TO]->())
添加了
WHERE
子句。这意味着如果Jim向Sally报告,Sally向Bill报告,Bill不向任何人报告,我们只会在Jim和Bill之间的路径上进行匹配,而不是Jim和Sally之间的路径。这样我们就不会像您看到的那样得到重复的内容。

另一个回答可以回答您的评论:

MATCH
  (e:Employees)-[:JOB_LEVEL_OF]->(el:EmployeeLvls)
WHERE e.Name ="Vidur Luthra" //limiting to a single employee
MATCH
  (p:Products)-[:PRODUCT]->(owd:OrdersWithDetails)<-[:SOLD]-(e),
  reporting_path=(e)-[:REPORTS_TO*0..4]->(m:Employees)
WHERE
  NOT((m)-[:REPORTS_TO]->()) AND
  m.EmployeeId <> e.EmployeeId  //excluding employee


WITH e, owd, p, nodes(reporting_path) AS managers
UNWIND managers AS manager
MATCH (manager)-[:JOB_LEVEL_OF]->(el_m:EmployeeLvls)

WITH e, owd, p, collect({Name: manager.Name, JobTitle: el_m.JobTitle}) AS managers

RETURN
  e.Name as Employee,
  owd.OrderId,
  SUM(owd.ProductQuantity * p.UnitPrice) as SoldAmt,
  (managers[0]).Name AS Manager_1_LevelAbove,
  (managers[0]).JobTitle AS Manager_1_JobTitle,
  (managers[1]).Name AS Manager_2_LevelAbove,
  (managers[1]).JobTitle AS Manager_2_JobTitle,
  (managers[2]).Name AS Manager_3_LevelAbove
  (managers[2]).JobTitle AS Manager_3_JobTitle
匹配
(e:员工)-[:工作级别]->(el:员工层)
其中e.Name=“Vidur Luthra”//仅限于一名员工
匹配
(p:产品)-[:产品]->(owd:订单详细信息)(m:员工)
哪里
不((m)-[:向]->()报告)和
m、 EmployeeId e.EmployeeId//不包括员工
将e、owd、p、节点(报告路径)作为管理器
以经理的身份解聘经理
匹配(经理)-[:工作级别]->(el\u m:员工层)
以e、owd、p、collect({Name:manager.Name,JobTitle:el_m.JobTitle})作为管理者
返回
e、 作为雇员的姓名,
owd.OrderId,
总金额(owd.ProductQuantity*p.UnitPrice)为SoldAmt,
(管理人员[0])。姓名为上述1级管理人员,
(管理者[0])。职务作为管理者,
(经理[1])。姓名为上述2级经理,
(管理者[1])。职务作为管理者,
(经理[2])。姓名为上述第3级经理
(经理[2])。职务为经理职务

这里可能会出现一个一个接一个的错误,但我认为这里的原则应该是goodBrian,您的建议解决了我的问题,但仅在理论上、实践上,我需要能够将结果显示或至少导出到excel中。正如你从附件中看到的,这不是一个理想的结果。我不确定我是否理解。你是说我的解决方案会为每个员工返回多个结果吗@Brian,我无法将结果保存到excel中作为电子表格-请查看我的原始请求哦,对了,我明白了。这应该只是在上面添加一个
.name
。您可能需要,也可能不需要先用括号括住对象,所以为了安全起见,我在答案中添加了括号。
Employee|OrderId|SoldAmt |Manager_1_LevelAbove|Manager_2_LevelsAbove| Manager_3_LevelsAbove
Vidur Luthra|94 |733.49  |James Kramer        |                     | 
Vidur Luthra|94 |733.49  |                    |                     | Ken Sanchez
Vidur Luthra|94 |733.49  |                    |Jossef Goldberg      | 
Employee|OrderId|SoldAmt |Manager_1_LevelAbove|Manager_2_LevelsAbove| Manager_3_LevelsAbove
Vidur Luthra|94 |733.49  |James Kramer        |Jossef Goldberg      | Ken Sanchez
MATCH
  (e:Employees)-[:JOB_LEVEL_OF]->(el:EmployeeLvls)
WHERE e.Name ="Vidur Luthra" //limiting to a single employee
MATCH
  (p:Products)-[:PRODUCT]->(owd:OrdersWithDetails)<-[:SOLD]-(e),
  reporting_path=(e)-[:REPORTS_TO*0..4]->(m:Employees)
  (m)-[:JOB_LEVEL_OF]->(el_m:EmployeeLvls)
WHERE
  NOT((m)-[:REPORTS_TO]->()) AND
  m.EmployeeId <> e.EmployeeId  //excluding employee
RETURN
  e.Name as Employee,
  owd.OrderId,
  SUM(owd.ProductQuantity * p.UnitPrice) as SoldAmt,
  (nodes(reporting_path)[0]).Name AS Manager_1_LevelAbove,
  (nodes(reporting_path)[1]).Name AS Manager_2_LevelAbove,
  (nodes(reporting_path)[2]).Name AS Manager_3_LevelAbove
MATCH
  (e:Employees)-[:JOB_LEVEL_OF]->(el:EmployeeLvls)
WHERE e.Name ="Vidur Luthra" //limiting to a single employee
MATCH
  (p:Products)-[:PRODUCT]->(owd:OrdersWithDetails)<-[:SOLD]-(e),
  reporting_path=(e)-[:REPORTS_TO*0..4]->(m:Employees)
WHERE
  NOT((m)-[:REPORTS_TO]->()) AND
  m.EmployeeId <> e.EmployeeId  //excluding employee


WITH e, owd, p, nodes(reporting_path) AS managers
UNWIND managers AS manager
MATCH (manager)-[:JOB_LEVEL_OF]->(el_m:EmployeeLvls)

WITH e, owd, p, collect({Name: manager.Name, JobTitle: el_m.JobTitle}) AS managers

RETURN
  e.Name as Employee,
  owd.OrderId,
  SUM(owd.ProductQuantity * p.UnitPrice) as SoldAmt,
  (managers[0]).Name AS Manager_1_LevelAbove,
  (managers[0]).JobTitle AS Manager_1_JobTitle,
  (managers[1]).Name AS Manager_2_LevelAbove,
  (managers[1]).JobTitle AS Manager_2_JobTitle,
  (managers[2]).Name AS Manager_3_LevelAbove
  (managers[2]).JobTitle AS Manager_3_JobTitle