Cypher无法仅在Concept节点间遍历的技术问题求助
解决Cypher路径仅在Concept节点间跳转的问题
要让(c:Concept)-[r*..3]-(n:Concept)这条路径严格只在Concept节点间最多跳3层,得约束路径上所有中间节点也必须是Concept类型,不然就会跑到Semantic这类节点上去。给你两种修改方案:
方案1:用路径节点过滤
在MATCH之后加WHERE条件,确保路径上每个节点都是Concept:
MATCH (:Code{CODE:"A41.9"})--(c:Concept), path=(c)-[*..3]-(n:Concept)--(:PT)--(t:Term) WHERE ALL(node IN nodes(path) WHERE node:Concept) AND EXISTS((c)--(:Semantic{name: "Disease or Syndrome"})) RETURN DISTINCT n.CODE, t.name;
ALL(node IN nodes(path) WHERE node:Concept):遍历路径上所有节点,保证每个都是Concept类型- 用
EXISTS()替代原有的Optional Match,直接检查c是否关联目标Semantic节点,逻辑更简洁高效
方案2:显式约束路径节点类型(更直观)
如果你的UMLS数据里Concept之间的关系类型固定,也可以拆分开MATCH步骤,强制中间节点为Concept:
MATCH (:Code{CODE:"A41.9"})--(c:Concept) MATCH path=(c)-[*..3]-(n:Concept) WHERE ALL(node IN nodes(path) WHERE node:Concept) MATCH (n)--(:PT)--(t:Term) WHERE EXISTS((c)--(:Semantic{name: "Disease or Syndrome"})) RETURN DISTINCT n.CODE, t.name;
这种写法把路径匹配单独拎出来,可读性更强,适合复杂场景。
原查询问题说明
原查询里的[r*..3]没限制中间节点类型,Cypher会默认匹配任意节点间的路径,自然会经过Semantic这类节点。用路径过滤就能把非Concept节点的路径排除掉。
诚邀研究UMLS的同行一起交流探索医疗数据,感谢支持!
内容的提问来源于stack exchange,提问作者Praveen Tankala
相关产品推荐
相关产品推荐

