我正在尝试学习neo4j,并且将从一个基本的员工/雇主示例开始,其中员工有经理,除非在树的顶部。
我的结构看起来像employee-> MANAGEDBY-> manager-> MANAGEDBY-> manager-> MANAGEDBY-> manager。但是,每个经理都可以拥有多名员工或经理。
我希望能够获得一份员工与主要老板(首席执行官/总裁/其他人)之间所有经理的清单。
最初,我开始使用像这样的查询
MATCH(baseEmployee {Name: 'Josh'})-[:MANAGEDBY*0..]-(managers)
RETURN managers.Name;
这似乎不仅显示了我的经理和他/她的经理等等,但它似乎也向所有人表明,当我想要显示的内容是
时,他们会管理Josh,
Boss,
BossBoss,
BossBossBoss,
CEO
经过一些搜索和一些运气后,我设法通过使用以下查询来接近
MATCH p=(baseEmployee {Name: 'Josh'})-[:MANAGEDBY*0..]-(managers)
WHERE NOT(managers-[:MANAGEDBY]->())
RETURN p;
我只是在学习neo4j所以我对这里发生的事情的最好猜测是我从自己到第一个没有MANAGEDBY关系的经理的路径。我的问题是,这会返回一条路径,我宁愿只有一个经理列表。
是否可以在不执行p =查询的情况下执行此操作?
答案 0 :(得分:2)
您必须在路径查询中添加关系方向! 否则你也可以从 Josh 向下探索。
如果你在零0..
开始你的varlength查询,那么你也会返回 Josh 。
默认值为1..
,因此您也可以将其关闭。
您可以使用nodes(p)
返回路径的节点。
MATCH p=(baseEmployee {Name: 'Josh'})-[:MANAGEDBY*]->(managers)
WHERE NOT(managers-[:MANAGEDBY]->())
RETURN nodes(p);
如果您希望每个节点有一行,您可以执行以下两行之一: 将集合展开回行。
MATCH p=(baseEmployee {Name: 'Josh'})-[:MANAGEDBY*]->(managers)
WHERE NOT(managers-[:MANAGEDBY]->())
UNWIND nodes(p) as n
RETURN n;
或者将每个路径的最后一个节点返回到根目录。
MATCH p=(baseEmployee {Name: 'Josh'})-[:MANAGEDBY*]->(managers)
RETURN managers;