微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Cypher:如何遍历除特定标签之外的任何关系

如何解决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 还不足以构建这个部分,我真的希望这不是语言中的边缘情况,并且存在一种简单处理此查询方法

谢谢!

解决方法

你可以使用这样的 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/),尤其是路径扩展程序,但据我所知,您不能将某种关系类型列入黑名单(只能将允许的关系列入白名单)。如果您可以将排除项转换为包含列表,那将是一个不错的选择。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。