You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Neo4j中Cypher如何在COLLECT结果中使用正则表达式匹配内容?

如何在Cypher集合匹配中使用正则表达式?

你的需求是把原来精确匹配完整疾病标签的逻辑,改成用正则模糊匹配、无需完整文本的方式。Cypher里可以通过=~正则操作符结合集合检查函数ANY()实现,下面是两种实用的改法:

方法一:提前过滤疾病再检查集合

在匹配疾病阶段就用正则筛选出目标类型,再确保患者同时拥有两类疾病:

MATCH (p:Patient)-[]-(d:Disease)
// 用正则匹配包含目标关键词的疾病标签
WHERE d.prefLabel =~ '.*Hypothyroidism.*' OR d.prefLabel =~ '.*Diarrhea.*'
WITH p, COLLECT(DISTINCT d.prefLabel) AS conditions
// 检查集合中同时存在匹配两类正则的条目
WHERE ANY(cond IN conditions WHERE cond =~ '.*Hypothyroidism.*') 
  AND ANY(cond IN conditions WHERE cond =~ '.*Diarrhea.*')
RETURN p.patientId
LIMIT 25

方法二:先收集所有疾病再筛选

如果需要保留患者的全部疾病记录,再从集合里筛选目标条目:

MATCH (p:Patient)-[]-(d:Disease)
WITH p, COLLECT(d.prefLabel) AS allConditions
// 从全量疾病中过滤出匹配关键词的条目
WITH p, [cond IN allConditions WHERE cond =~ '.*Hypothyroidism.*' OR cond =~ '.*Diarrhea.*'] AS targetConditions
// 确认两类疾病都存在
WHERE ANY(cond IN targetConditions WHERE cond =~ '.*Hypothyroidism.*') 
  AND ANY(cond IN targetConditions WHERE cond =~ '.*Diarrhea.*')
RETURN p.patientId
LIMIT 25

补充说明

  • Cypher的正则匹配用=~操作符,语法遵循Java正则规则,比如.*代表任意长度的任意字符,你可以根据需求调整正则(比如要匹配开头是Hypothyroidism的标签,就用'Hypothyroidism.*')。
  • ANY()函数用来检查集合里是否至少有一个元素满足正则条件,刚好适配你需要的“同时存在两类疾病”的逻辑。

内容的提问来源于stack exchange,提问作者Muhammad Uzair

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 04:35:14