繁体   English   中英

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

[英]How to return nodes between a node and the top of a tree in 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 =查询的情况下执行此操作?

您必须将关系方向添加到路径查询中! 否则,您还将从Josh向下探索。

如果您从零0..开始您的varlength查询,那么您也将返回Josh 默认值为1..因此您也可以将其关闭。

您可以使用nodes(p)返回路径的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;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM