我希望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。
由于
答案 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节点。