首页 > 解决方案 > Cypher:如何遍历除特定标签之外的任何关系

问题描述

给定密码定义图中的一个节点,该节点具有变量和不确定的传入和传出关系的数量和类型,我如何在密码查询中定义可变数量的遍历,这些遍历遵循除特定类型之外的所有关系。

例如,我想查找并返回远离起点(加上原始点)的所有节点 1-4 关系遍历,但我不想遍历任何标记为:CREATED_BY

MATCH (t:Thing {name: 'Starting Point'})-[x*1..4]-(o)
WHERE NOT x:CREATED_BY
RETURN t, o

这返回了一个错误,因为在这种情况下,x 是关系列表而不是单个关系。

在一个理想的世界里,如果我能做这样的事情,我会喜欢它:

MATCH (t:Thing {name: 'Starting Point'})-[x(NOT :CREATED_BY)*1..4]-(o)

或者 Match 子句中的其他一些简洁的表达。如果这在语法上不存在,那么最好使用简单的 where 语句。如果不是,我最后的攻击途径是将 x 视为一个列表,分解它,然后应用一些条件,即对于任何给定元素,它不应该等于要排除的关系。我的 Cypher 还不足以构建这部分,我真的希望这不是语言中的边缘情况,并且存在处理此查询的简单方法。

谢谢!

标签: neo4jcypher

解决方案


您可以使用这样的 WHERE 语句:

MATCH (t:Thing {name: 'Starting Point'})-[x*1..4]-(o)
WHERE all(r in x WHERE type(r) <> 'CREATED_BY')
RETURN t, o

它基本上遍历所有关系r,提取关系类型并将其与“CREATED_BY”进行比较。谓词确保路径中的all所有关系都不是“CREATED_BY”类型。

在此处查看该all函数的文档: https ://neo4j.com/docs/cypher-manual/current/functions/predicate/#functions-all

您还可以查看APOC高级查询工具(https://neo4j.com/labs/apoc/4.1/graph-querying/),尤其是路径扩展程序,但据我所知,您不能将某个列入黑名单关系类型(仅将允许的关系列入白名单)。如果您可以将排除项转换为包含列表,那将是一个不错的选择。


推荐阅读