Cypher如何获取可变长度路径中关系属性≥指定阈值的对应片段?
Cypher可变长度路径按需截断查询问题
我需要返回可变长度模式路径中符合指定条件的部分片段。
如下例所示,以下Cypher查询会返回所有蓝色和红色节点:
MATCH p=(a:Person)-[:KNOWS*1..10]->(b:Person)-[:KNOWS]->(j:Person { name: 'Jane'}) RETURN p

但我实际需要返回入向关系confidence_factor≥0.75的蓝色节点,目前尝试的方案存在两类问题:
- 因路径中存在一个不符合条件的关系,直接剔除整条混合蓝红的上层路径
- 仅剔除不符合条件的Jim->Erin关系,不符合预期
我的核心需求是:从Jane节点反向遍历,返回所有关系confidence_factor≥0.75的连续节点,一旦遇到不符合条件的关系就停止该路径的遍历,即使该路径中其他节点间存在符合条件的关系(例如Tom-[:KNOWS]->Jim)也不继续延伸。
测试数据创建语句如下:
CREATE (one:Person { name: 'Tom'}) ,(two:Person { name: 'Jim'}) ,(three:Person { name: 'Erin'}) ,(four:Person { name: 'Kevin'}) ,(five:Person { name: 'Skylar'}) ,(six:Person { name: 'Jane'}) ,(one)-[:KNOWS {confidence_factor:0.80}]->(two) ,(two)-[:KNOWS {confidence_factor:0.05}]->(three) ,(three)-[:KNOWS {confidence_factor:0.85}]->(six) ,(four)-[:KNOWS {confidence_factor:0.90}]->(five) ,(five)-[:KNOWS {confidence_factor:0.95}]->(six) ;
解决方案
你可以通过Cypher的全路径谓词校验实现自动截断效果,查询语句如下:
// 返回符合条件的所有节点 MATCH (j:Person {name: 'Jane'}) MATCH p = (n:Person)<-[:KNOWS*0..]-(j) WHERE all(r in relationships(p) WHERE r.confidence_factor >= 0.75) RETURN DISTINCT n
如果需要返回完整的符合条件路径,调整返回参数即可:
// 返回符合条件的完整路径 MATCH (j:Person {name: 'Jane'}) MATCH p = (n:Person)<-[:KNOWS*0..]-(j) WHERE all(r in relationships(p) WHERE r.confidence_factor >= 0.75) RETURN p
逻辑说明
- 从Jane节点开始反向遍历所有入向的
KNOWS关系,路径长度从0开始(包含Jane自身) all()函数会校验路径中所有关系的confidence_factor都满足≥0.75的要求,只要路径里出现一个不符合条件的关系,该条路径就会被过滤,自然实现「遇到不符合条件的关系就停止延伸」的效果- 基于你提供的测试数据执行后,返回的节点为Jane、Erin、Skylar、Kevin,刚好匹配预期的蓝色节点范围,Tom和Jim因为中间Jim->Erin的关系置信度只有0.05,路径被截断不会被返回
内容的提问来源于stack exchange,提问作者NumericOverflow
相关产品推荐
相关产品推荐

