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
相关产品推荐
相关产品推荐

