2014-10-11 40 views
1

我正在尝试学习neo4j,并打算从雇员的基本员工/雇主例子开始,除非在树顶部,否则员工拥有经理。如何在neo4j中返回节点和树顶部之间的节点

我的结构看起来像employee-> MANAGEDBY-> manager-> MANAGEDBY-> manager-> MANAGEDBY-> manager。然而,每个经理可以有多个雇员或经理在他们下面。

我想要做的是获得一个员工和主要老板之间的所有经理名单(ceo/president/whatever)。

起初,我开始了与这样的

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 =查询?

回答

2

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

如果你开始你的varlength查询为零0..那么你也会返回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; 
+0

我不知道你可以指定关系的方向。我认为像MATCH(baseEmployee {Name:'Josh'}) - [:MANAGEDBY * 0 ..] - >(managers) RETURN managers.Name;从我到树的最高层,它完全符合我的需求,似乎只包括树中的父母,并且从不向下遍历 – Josh 2014-10-11 22:44:45

相关问题