neo4j - 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/),尤其是路径扩展程序,但据我所知,您不能将某个列入黑名单关系类型(仅将允许的关系列入白名单)。如果您可以将排除项转换为包含列表,那将是一个不错的选择。
推荐阅读
- sql - 使用 jdbc 在另一个变量中查询结果
- javascript - 更改 Weback 错误消息中的路径格式
- email - 无法使用 SMTP 配置带有 Outlook 帐户的外发邮件服务器
- python - 在变量列上对 pandas df 进行分组
- sql - DELETE FROM + LEFT JOIN SNOWFLAKE
- excel - 在 VBA 中移动后如何回到原来的活动单元格?
- node.js - 如何将 Azure AppSettings 传递给在 Linux AppService 上运行的 NodeJS 应用程序
- python - 如何使用不同的python版本共享安装在anaconda上的模块?
- c# - Umbraco lucene 查询Where And Or
- java - Selenium 4.0.x 在 IDE 中有效,但在胖 JAR 文件中无效 - 找不到我的浏览器版本的 CDP 实现