Neo4j单节点多关系匹配:满足任意关系即返回的查询写法
Cypher多模式任意匹配解决方案
你当前使用连续MATCH子句的写法属于逻辑与匹配规则,必须两个模式同时匹配成功才会返回结果,因此仅存在单个模式时查询返回空。要实现任意一个模式匹配成功即可返回结果,可采用以下两种方案:
方案1:可选匹配+非空校验
该方案可在单条返回结果中同时展示两个模式的匹配状态,未匹配到的模式对应字段返回null:
// 提前匹配公共根节点,降低重复计算开销 MATCH (ball:Thing {name: 'ball'}) // 可选匹配第一个模式,未匹配到则decendent为null OPTIONAL MATCH (characteristic)<-[:HAS]-(ball)<-[:IS_A*]-(decendent)-[:HAS]->(characteristic) // 可选匹配第二个模式,未匹配到则decendent2为null OPTIONAL MATCH (characteristic2)-[:HAS]->(ball)<-[:IS_A*]-(decendent2)<-[:HAS]-(characteristic2) // 只要任意一个模式匹配成功就返回 WHERE decendent IS NOT NULL OR decendent2 IS NOT NULL RETURN decendent, decendent2
方案2:UNION合并独立查询
该方案会将两个模式的匹配结果分开返回,适合需要明确区分匹配到哪类模式的场景:
// 查询匹配第一个模式的结果 MATCH (characteristic)<-[:HAS]-(thing {name:'ball'})<-[:IS_A*]-(decendent)-[:HAS]->(characteristic) RETURN decendent AS matched_node, '模式1' AS matched_type UNION ALL // 查询匹配第二个模式的结果 MATCH (characteristic2)-[r2:HAS]->(thing2 {name:'ball'})<-[:IS_A*]-(decendent2)<-[:HAS]-(characteristic2) RETURN decendent2 AS matched_node, '模式2' AS matched_type
说明:使用
UNION ALL会保留所有匹配结果(两个模式同时匹配到时返回两条记录),如果需要自动去重可替换为UNION。
两个模式同时存在时的返回结果示例:
内容的提问来源于stack exchange,提问作者Aaron Damiano
相关产品推荐
相关产品推荐


