我想获得关系列表的开始和结束节点。 在下面的示例中,我从一个节点开始,它与下一个节点相关,并且下一个节点通过相同的关系与另一个节点相关。
我尝试了以下cypher查询,但它不起作用。
start n=node:index('name:"iris"')
match n-[r:childof*]->parent
return startNode(r),endNode(r)
有什么想法吗?我认为关于r的foreach会做到这一点,但似乎无法使这个可行。
答案 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]
,但只有当您在模式中明确包含关系方向时,您才能相信它。