[英]Neo4j : Filtering path with some nodes with cypher
我想要A:Alpha和D:Alpha之间的所有路径,而这两个之间只有:Beta节点。 如果路径包含相同类型或其他类型的节点,则应丢弃那些路径。
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
有人可以帮我同样的密码吗?
谢谢
您只需要一个变长路径和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
标签过滤器是这里的关键。 /Alpha
在:Alpha节点上创建终止节点过滤器,这意味着路径将仅遍历到遇到的第一个:Alpha节点,并且不会越过,返回的路径始终以Alpha节点结尾。 +Beta
在:Beta节点上为路径中的节点创建白名单过滤器(当我们使用终止过滤器时,该白名单过滤器不适用于终端节点),而filterStartNode:false
表示起始节点不受白名单过滤器的约束无论是。
这样可以确保路径仅到达第一个:Alpha节点,并且路径中的所有中间节点都必须是:Beta节点。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.