在Neo4j中用WHERE匹配可变长度路径并过滤相邻关系属性
单个Cypher查询实现相邻关系met_at属性去重过滤
当然可以用单个查询实现需求,核心是利用Cypher的路径遍历函数和条件判断,在WHERE子句中检查路径内所有相邻的KNOWS关系的met_at属性是否互不相同。
最终查询语句
MATCH path = (:Person {name:'A'})-[r:KNOWS*1..5]->(:Person {name:'F'}) WHERE all(i IN range(1, length(r)-1) WHERE r[i-1].met_at <> r[i].met_at) RETURN path
语句解释
- 路径捕获:用
path变量存储完整路径,同时通过r获取路径中的所有KNOWS关系集合。 - 相邻关系校验:
length(r)获取路径内关系的总数量,range(1, length(r)-1)生成从第2个关系到最后一个关系的索引序列。all(...)遍历索引序列,确保每一个索引对应的关系,其met_at属性与前一个关系(索引i-1)的met_at属性不相等。- 该条件会自动排除所有存在相邻
KNOWS关系met_at相同的路径。
匹配验证
- 符合要求的路径
A->C->E->F:相邻关系的met_at依次为1→2、2→3,均不相同,会被正常返回。 - 需要过滤的路径
A->B->D->E->F:其中B->D和D->E的met_at均为2,属于相邻属性相同,会被WHERE条件排除。
内容的提问来源于stack exchange,提问作者Martin
相关产品推荐
相关产品推荐

