Neo4j子图匹配:查找含完全相同维修步骤的Maintenance节点
解决方案
要找到与指定维修指南拥有完全相同维修步骤的其他指南,你可以通过比较两个Maintenance节点关联的WorkStep集合是否完全一致来实现,以下是完整的Cypher语句:
MATCH (mp1:Maintenance{name:'13 Years (325000 km)'})-[:HAS]->(ws:WorkStep) WHERE id(mp1)=49214 WITH collect(ws) as targetSteps, size(collect(ws)) as targetCount, mp1 MATCH (mp2:Maintenance)-[:HAS]->(ws2:WorkStep) WHERE mp2 <> mp1 WITH mp2, collect(ws2) as currentSteps, targetSteps, targetCount WHERE size(currentSteps) = targetCount AND currentSteps = targetSteps RETURN mp2
关键说明:
- 排除自身匹配:用
mp2 <> mp1确保不会返回你指定的原维修指南。 - 性能优化:先通过
size(currentSteps) = targetCount过滤掉步骤数量不一致的维修指南,减少后续集合全量比较的开销,数据量大时效果更明显。 - 集合完全匹配:Cypher中集合直接用
=比较时,会校验所有元素是否完全相同(集合无序,不要求步骤顺序一致),正好符合你“完全相同维修步骤”的需求。
如果数据量较小,也可以简化为无需提前校验数量的版本:
MATCH (mp1:Maintenance{name:'13 Years (325000 km)'})-[:HAS]->(ws:WorkStep) WHERE id(mp1)=49214 WITH collect(ws) as targetSteps, mp1 MATCH (mp2:Maintenance)-[:HAS]->(ws2:WorkStep) WHERE mp2 <> mp1 WITH mp2, collect(ws2) as currentSteps, targetSteps WHERE currentSteps = targetSteps RETURN mp2
内容的提问来源于stack exchange,提问作者TiMeJuMp
相关产品推荐
相关产品推荐

