返回cypher中关系列表的开始和结束节点

时间:2014-01-24 08:43:02

标签: neo4j cypher

我想获得关系列表的开始和结束节点。 在下面的示例中,我从一个节点开始,它与下一个节点相关,并且下一个节点通过相同的关系与另一个节点相关。

我尝试了以下cypher查询,但它不起作用。

start n=node:index('name:"iris"')
match n-[r:childof*]->parent
return startNode(r),endNode(r) 

有什么想法吗?我认为关于r的foreach会做到这一点,但似乎无法使这个可行。

1 个答案:

答案 0 :(得分:3)

正如你没有说的那样,我假设你正在使用Neo4j的当前版本(2.0),并且“它不起作用”意味着startNode(r)抱怨r是一个集合,而不是关系。要为集合的每个成员运行函数或计算表达式,请使用extract或reduce(foreach用于写操作)

RETURN EXTRACT(rel IN r | [startNode(rel),endNode(rel)]) as nodePairCollection

对于像a-[:REL]->b-[:REL]->c-[:REL]->d这样的路径,您可以获得[[a,b],[b,c],[c,d]]

等结果
RETURN REDUCE(acc = [], rel IN r | acc + startNode(rel) + endNode(rel)) as flattenedNodeCollectionWithDulicates

给出[a,b,b,c,c,d],或对其中一个进行过滤。

这是如何从关系中显式获取起始节点和结束节点。但对于上面的特定类型的查询,其中r中的所有关系具有相同的方向,您可能只需重新调整路径上的节点,因为它们已经被正确排序

MATCH path=n-[r:childof*]->parent
RETURN nodes(path)

给出了[a,b,c,d],但只有当您在模式中明确包含关系方向时,您才能相信它。