使用Cypher的allShortestPaths时排除特定节点的方法求助
如何使用
allShortestPaths()排除未关联白名单节点的路径 我需要实现的需求是:在使用Neo4j的allShortestPaths()函数时,移除所有包含未关联到指定白名单Category节点的路径。
试过两种现有方案但效果不佳:
- 基于GDS和图投影的方案:无法确保获取所有最短路径(最接近的是Yen算法,但无法确定合适的k值来覆盖全部最短路径)
- 使用
apoc.path.expandConfig()的方案:无法确定合理的maxLevel参数,设置为无界时查询耗时过长
另外还尝试了两种方法但均未成功:
- 将原生
allShortestPaths()与GDS图投影结合使用 - 通过
WHERE子句配合all()函数,确保路径中所有节点符合规则
失败的尝试代码
MATCH (whitelist:Category) WHERE whitelist.label IN $whitelist MATCH paths = allShortestPaths((source:Material)-[:used_in*]->(dest:Material)) WHERE source.label = $source AND dest.label = $dest AND all(material IN nodes(paths) WHERE (material)-[:categorised_by]-(whitelist) OR NOT (material)-[:categorised_by]-() // 或者该节点不属于任何类别 )
示例数据
CREATE (msource:Material{label:"source"}) CREATE (m1:Material) CREATE (m2:Material) CREATE (m3:Material) CREATE (m4:Material) CREATE (m41:Material) CREATE (mdest:Material{label:"dest"}) CREATE (msource)-[:used_in]->(m1) CREATE (msource)-[:used_in]->(m2) CREATE (msource)-[:used_in]->(m3) CREATE (msource)-[:used_in]->(m4) CREATE (m4)-[:used_in]->(m41) CREATE (m1)-[:used_in]->(mdest) CREATE (m2)-[:used_in]->(mdest) CREATE (m3)-[:used_in]->(mdest) CREATE (m41)-[:used_in]->(mdest) CREATE (cat1:Category{label:"cat1"}) CREATE (cat2:Category{label:"cat2"}) CREATE (m1)-[:categorised_by]->(cat1) CREATE (m2)-[:categorised_by]->(cat1) CREATE (m3)-[:categorised_by]->(cat2) CREATE (m4)-[:categorised_by]->(cat1) CREATE (m41)-[:categorised_by]->(cat1) CREATE (mdest)-[:categorised_by]->(cat1)
当前问题
当设置参数:
source = "source"dest = "dest"whitelist = ["cat1","cat2"]
运行上述查询后,仅返回了部分最短路径,关联cat2的节点对应的路径未被返回。推测原因是查询中的条件仅支持路径包含单一白名单类别,不支持多类别组合的场景。
内容的提问来源于stack exchange,提问作者Xapper
相关产品推荐
相关产品推荐

