Cypher:如何遍历除特定标签之外的任何关系
Cypher: How to traverse across any relationship except for a specific label
给定密码定义图中的一个节点,该节点具有可变且不确定的数量和类型的传入和传出关系,我如何在密码查询中定义可变数量的遍历,这些遍历遵循除特定关系之外的所有关系类型。
例如,我想找到并 return 所有节点 1 - 4 关系遍历远离起点(加上原始点),但我不想遍历任何标记为 [= 的关系12=]:
MATCH (t:Thing {name: 'Starting Point'})-[x*1..4]-(o)
WHERE NOT x:CREATED_BY
RETURN t, o
这 return 是一个错误,因为 x 在本例中是一个关系列表,而不是单个关系。
在一个理想的世界里,如果我能做这样的事情,我会很高兴的:
MATCH (t:Thing {name: 'Starting Point'})-[x(NOT :CREATED_BY)*1..4]-(o)
或 Match 子句中的其他一些简洁的表达式。如果在句法上不存在,那么最好使用简单的 where 语句。如果不是,我最后的攻击途径是将 x 视为一个列表,将其分解,然后应用一些条件,即对于任何给定元素,它不应等于要排除的关系。我的 Cypher 还不足以构建这篇文章,我真的希望这不是语言中的边缘情况,并且存在处理此查询的简单 方法。
谢谢!
您可以使用这样的 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/),尤其是路径扩展程序,但据我所知,你不能将某种关系类型列入黑名单(只能将允许的列入白名单).如果你能把你的排除变成一个包含列表,那将是一个不错的选择。
给定密码定义图中的一个节点,该节点具有可变且不确定的数量和类型的传入和传出关系,我如何在密码查询中定义可变数量的遍历,这些遍历遵循除特定关系之外的所有关系类型。
例如,我想找到并 return 所有节点 1 - 4 关系遍历远离起点(加上原始点),但我不想遍历任何标记为 [= 的关系12=]:
MATCH (t:Thing {name: 'Starting Point'})-[x*1..4]-(o)
WHERE NOT x:CREATED_BY
RETURN t, o
这 return 是一个错误,因为 x 在本例中是一个关系列表,而不是单个关系。
在一个理想的世界里,如果我能做这样的事情,我会很高兴的:
MATCH (t:Thing {name: 'Starting Point'})-[x(NOT :CREATED_BY)*1..4]-(o)
或 Match 子句中的其他一些简洁的表达式。如果在句法上不存在,那么最好使用简单的 where 语句。如果不是,我最后的攻击途径是将 x 视为一个列表,将其分解,然后应用一些条件,即对于任何给定元素,它不应等于要排除的关系。我的 Cypher 还不足以构建这篇文章,我真的希望这不是语言中的边缘情况,并且存在处理此查询的简单 方法。
谢谢!
您可以使用这样的 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/),尤其是路径扩展程序,但据我所知,你不能将某种关系类型列入黑名单(只能将允许的列入白名单).如果你能把你的排除变成一个包含列表,那将是一个不错的选择。