Neo4j:使用cypher过滤一些节点的路径

时间:2017-11-23 11:24:23

标签: neo4j cypher

我希望A:Alpha和D:Alpha之间的所有路径只有:这两者之间的Beta节点。 如果path包含相同类型或其他类型的节点,则应丢弃这些路径。

Sample data - 
A:Alpha->B:Beta->C:Beta->D:Alpha
A:Alpha->M:Beta->Z:Gama->P:Beta->D:Alpha
A:Alpha->S:Beta->F:Beta->I:Beta-->D:Alpha
A:Alpha->U:Beta->X:Alpha->T:Alpha->W:Beta->D:Alpha

Result should be - 
A:Alpha->B:Beta->C:Beta->D:Alpha
A:Alpha->S:Beta->F:Beta->I:Beta-->D:Alpha

任何人都可以帮助我使用cypher。

由于

1 个答案:

答案 0 :(得分:1)

您只需要一个可变长度路径和一个WHERE all()谓词来限制路径中间节点的标签:

... // assume 'path' variable used in the match
WHERE all(node in nodes(path)[1..-1] WHERE node:Beta)
...

或者,您可以使用APOC Procedures,因为路径扩展器的选项应该能够提供您想要的内容:

MATCH (a:Alpha)
CALL apoc.path.expandConfig(a, {relationshipFilter: '>', labelFilter:'/Alpha|+Beta' filterStartNode:false}) YIELD path
RETURN path

label filter是关键所在。 /Alpha在以下位置创建终止节点过滤器:Alpha节点,这意味着路径将仅遍历第一个:遇到但不超出的Alpha节点,并且返回的路径将始终以Alpha节点结束。 +Beta在以下位置创建白名单过滤器:路径中节点的Beta节点(当我们使用终止过滤器时不适用于终端节点),而filterStartNode:false表示起始节点不是受白名单过滤器的影响。

这确保路径只到达第一个:Alpha节点,路径中的所有中间节点必须是:Beta节点。