如何在neo4j中返回节点和树顶部之间的节点

时间:2014-10-11 18:06:56

标签: neo4j

我正在尝试学习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 =查询的情况下执行此操作?

1 个答案:

答案 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;